当前位置:网站首页>第五章 习题(124、678、15、19、22)【微机原理】【习题】

第五章 习题(124、678、15、19、22)【微机原理】【习题】

2022-06-25 22:02:00 日星月云

前言

以下内容源自微型计算机原理(第四版)王忠民主编
仅供学习交流使用
请您阅读文章声明,默认同意该声明

习题

1

1 画图说明下列语句所分配的存储空间及初始化的数据值。
(1) BYTE_VAR DB 'BYTE’, 12,-12H,3 DUP(0,7,2DUP(1,2),7)
(2) WORD_ VAR DW 5 DUP(0,1,2),7,-5, ‘BY’, ‘TE’, 256H
在这里插入图片描述
1.asm

data segment
	BYTE_VAR	DB	'BYTE',12,-12H,3 DUP(0,7,2 DUP(1,2),7)
	org 40h
	WORD_VAR DW 	5 DUP(0,1,2),7,-5,'BY','TE',256H
data ends

code segment
     assume cs:code,ds:data
start:     
     mov ax,data
     mov ds,ax
 
     mov ah,4ch
     int 21h
    
code ends
     end start

2

假设程序中的数据定义如下:

PARTNO DW ?
PNAME DB 16 DUP(?)
COUNT DD ?
PLENTH EQU $-PARTNO;16h=22

则PLENTH的值为多少?它表示什么意义?

PLENTH的值为0016h=22,它表示当前已分配单元空间个数;
PARTNO  2
PNAME  16
COUNT  4

在这里插入图片描述
2.asm

data segment
	PARTNO DW ?
	PNAME DB 16 DUP(?)
	COUNT DD ?
	PLENTH EQU $-PARTNO
data ends

code segment
     assume cs:code,ds:data
start:     
     mov ax,data
     mov ds,ax
  
    mov ax,PLENTH	 	
  	
     mov ah,4ch
     int 21h
    
code ends
     end start

4

4.假设程序中的数据定义如下

LNAME DB 30 DUP(?)
ADDRESS DB 30 DUP(?)
CITY DB 15 DUP(?)
CODE_LIST DB 1,7,8,3,2

(1)用一条MOV指令将LNAME的偏移地址放入BX。
(2)用一条指令将CODE_LIST的头两个字节的内容放入SI。
(3)写一条伪指令定义符使CODB_LENGHT的值等于CODE_LIST域的实际长度。
4.asm

data segment
	LNAME DB 30 DUP(?)
	ADDRESS DB 30 DUP(?)
	CITY DB 15 DUP(?)
	CODE_LIST DB 1,7,8,3,2
	;(3)写一条伪指令定义符使CODB_LENGHT的值等于CODE_LIST域的实际长度。
	CODB_LENGHT EQU $-CODE_LIST
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	 mov ds,ax
	;验证(3)
	mov ax,CODB_LENGHT
  	;(1)用一条MOV指令将LNAME的偏移地址放入BX。
	mov bx,offset LNAME
	;(2)用一条指令将CODE_LIST的头两个字节的内容放入SI。
	mov si,WORD PTR CODE_LIST
	
  	
    	 mov ah,4ch
    	 int 21h
    
code ends
     end start

在这里插入图片描述
在这里插入图片描述

6

6.对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?

 FLDB DB?
TABLEA DW 20DUP(?)
TABLEB DB ‘ABCD'

(1) MOV AX, TYPE FLDB ;(AX)=1
(2) MOV AX, TYPE TABLEA ;(AX)=2
(3) MOV CX, LENGTH TABLEA ;(CX)=20
(4) MOV DX, SIZE TABLEA ;(DX)=40
(5) MOV CX, LENGTH TABLEB ;(CX)=1;未用DUP
在这里插入图片描述
6.asm

data segment
	FLDB DB ?
	TABLEA DW 20 DUP(?)
	TABLEB DB 'ABCD'
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

	MOV AX, TYPE FLDB 		;(AX)=1
	MOV AX, TYPE TABLEA 		;(AX)=2
	MOV CX, LENGTH TABLEA 	;(CX)=20
	MOV DX, SIZE TABLEA 		;(DX)=40
	MOV CX, LENGTH TABLEB 	;(CX)=1;未用DUP
	
  	
    	 mov ah,4ch
    	 int 21h
    
code ends
     end start

7

7.试说明下述指令中哪些需要加上PTR伪指令定义符

BVAL DB 10H,20H
WVAL DW 1000H

(1) MOV AL, BVAL
(2) MOV DL, [BX]
(3) SUB [BX],2
(4) MOV CL,WVAL
7.asm

data segment
	BVAL DB 10H,20H
	WVAL DW 1000H
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

	MOV AL,BVAL
	MOV DL,[BX]
	SUB [BX],BYTE PTR  2
	MOV CL,BYTE PTR WVAL
	
  	
    	 mov ah,4ch
    	 int 21h
    
code ends
     end start

在这里插入图片描述
在这里插入图片描述

8

8.编写一宏定义BXCHG,将一字节的高4位与低4位交换。

data segment
	NUM1 DB 12H;-->21
	NUM2 DB 34H;-->43
	NUM3 DB 56H;-->65
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

BXCHG MACRO NUM	
	mov cl,4
	rol NUM,cl;循环左移4位
	ENDM	
		
	BXCHG NUM1
	BXCHG NUM2
  	BXCHG NUM3

    	 mov ah,4ch
    	 int 21h
    
code ends
     end start

在这里插入图片描述

15

15.试编写一汇编语言程序,要求从键盘接收一个4位的十六进制数,并在终端上显
示与它等值的二进制数。
在这里插入图片描述
非16进制字符按0处理
在这里插入图片描述

data segment
	INF1 DB "Please input a hex mumber :$"
	INF2 DB 0AH,0DH,"$"
	INF3 DB " $"
	org 60H
	IBUF DB 7,0,6 DUP('$')
	
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

;输出INFO
PINF MACRO INF
MOV	DX,OFFSET INF
	MOV	AH,09H
	INT	21H
ENDM
;取出每一位并输出
QUWEI MACRO NUM
	MOV CX,4
	SHL NUM,CL;要左移四位到有效数字,0f->f0
	LOOP1:
		SHL NUM,1
		JC P1
		JNC P0
		P1:
			PUSH DX;MOV DL,'1'会改变
			MOV AH,2
			MOV DL,'1'		
			int 21h
			POP DX
			JMP END1
		P0:
			PUSH DX
			MOV AH,2
			MOV DL,'0'		
			int 21h
			POP DX
			JMP END1
		END1:
			NOP
	LOOP LOOP1
ENDM	
;输出BUF
PBUF MACRO BUF
	MOV CX,0
	MOV CL,[BUF+1]
	LEA BX, BUF+2
LOOP3:
	PUSH CX;QUWEI DL;会改变CX
	;MOV DL,[BX]
	;ADD DL,30H
	;MOV AH, 02H
	;INT 21H
	MOV DL,[BX]
	QUWEI DL
	INC BX
	POP CX
	PINF INF3;每转一位16进制变成42进制来个空格
LOOP LOOP3
ENDM

;输入--》BUF
STORE MACRO BUF
	MOV	DX, OFFSET IBUF	;键入一个十六进制数
	MOV	AH,0AH
	INT	21H
ENDM

	PINF  INF1
	CALL  HTB
	PINF  INF2
	PBUF IBUF	

    	 mov ah,4ch
    	 int 21h
  


;DTB改写HTB   
;MOV DX,10-->MOV DX,16
HTB  PROC NEAR
	STORE IBUF

	MOV	CL,IBUF+1;十进制数的位数送CX
	MOV	CH,0
	MOV	SI,OFFSET IBUF+2;指向输入的第一个字符(最高位)
	
	MOV	AX,0	;开始将十进制数转换为二进制数
	AGAIN: 
		;MOV	DX,10;((0x10+a4)x10+...)x10+a0
		MOV	DX,16;((0x16+a4)x16+...)x16+a0
		MUL	DX
		;AND	BYTE PTR [SI],0FH;十进制可以转数字
		;16进制要改一下
		CMP BYTE PTR [SI],'0'
		JB  OTHER
		CMP  BYTE PTR [SI],'9'
		JBE  DIGIT
		CMP  BYTE PTR [SI],'A'
		JB  OTHER
		CMP  BYTE PTR [SI],'F'
		JBE  UPPER
		CMP  BYTE PTR [SI],'a'
		JB  OTHER
		CMP  BYTE PTR [SI],'f'
		JBE LOWER
		JMP PEND
		LOWER:
			;小写字母a->10
			SUB BYTE PTR [SI],'a'
			ADD BYTE PTR [SI],10
			JMP PEND;注意执行完一个分支后应使程序跳出
		UPPER:
			;大写字母A->10
			SUB BYTE PTR [SI],'A'
			ADD BYTE PTR [SI],10
			JMP PEND
		DIGIT:  
			AND	BYTE PTR [SI],0FH;数字的情况
			JMP PEND
		OTHER:
			AND	BYTE PTR [SI],0H;输入非16进制字符按0处理
			JMP PEND
		PEND:		

			ADD	AL, [SI]
			ADC	AH,0
			INC	SI
	LOOP	AGAIN
	RET
HTB ENDP


code ends
     end start

19

19.从键盘输入一系列字符(以回车符结束),并按字母、数字及其他字符分类计数,最
后显示出这三类的计数结果。
在这里插入图片描述
19.asm

data segment
	INF1 DB "Please input a string :$"
	INF2 DB 0AH,0DH,"$"
	INF3 DB " $"

	org 40H
	CNTN DB 0  ;数字个数
	CNTC DB 0  ;字母个数
	CNTO DB 0 ;其他个数

	org 60H
	IBUF DB 255,0,254 DUP('$')
	OBUF DB 7,0,6 DUP('$')
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

;输出INFO
PINF MACRO INF
MOV	DX,OFFSET INF
	MOV	AH,09H
	INT	21H
ENDM

;输入--》BUF
STORE MACRO BUF
	MOV	DX, OFFSET IBUF	;键入一个十六进制数
	MOV	AH,0AH
	INT	21H
ENDM

;输出BUF
PBUF MACRO BUF
	MOV CX,0
	MOV CL,[BUF+1]
	LEA BX, BUF+2
LOOP3:
	
	MOV DL,[BX]
	ADD DL,30H
	MOV AH, 02H
	INT 21H
	INC BX	
LOOP LOOP3
ENDM

;统计
CNT  MACRO
	STORE IBUF

	MOV	CL,IBUF+1;十进制数的位数送CX
	MOV	CH,0
	MOV	SI,OFFSET IBUF+2;指向输入的第一个字符(最高位)
	
	MOV	AX,0	;开始将十进制数转换为二进制数
	AGAIN: 
		
		CMP BYTE PTR [SI],'0'
		JB  OTHER
		CMP  BYTE PTR [SI],'9'
		JBE  DIGIT
		CMP  BYTE PTR [SI],'A'
		JB  OTHER
		CMP  BYTE PTR [SI],'Z' 
		JBE  UPPER
		CMP  BYTE PTR [SI],'a'
		JB  OTHER
		CMP  BYTE PTR [SI],'z'
		JBE LOWER
		CMP  BYTE PTR [SI],'z'
		JA OTHER
		JMP PEND
		LOWER:
			INC CNTC
			JMP PEND;注意执行完一个分支后应使程序跳出
		UPPER:			
			INC CNTC
			JMP PEND
		DIGIT:  
			INC CNTN
			JMP PEND
		OTHER:
			INC	CNTO
			JMP PEND
		PEND:		
			ADD	AL, [SI]
			ADC	AH,0
			INC	SI
	LOOP	AGAIN

ENDM

;AL->BCD;压缩性
HTBCD MACRO
	mov ah,0
	
	mov cl,4
	push ax
	shr al,cl
	
	mov bl,16h
	mul bl
	
	pop bx
	and bl,0fh
	add al,bl
	daa
	
ENDM

;输出BCD码;AL压缩性	
PBCD MACRO
	mov ah,0
	mov cl,4
	push ax
	shr al,cl		
	mov bh,al		;al高位
	pop ax
	and al,0fh		;al低位
	mov ah,bh		;al高位

	push ax
	mov dl,ah
	add dl,30h
	mov ah,2
	int 21h
	pop ax

	push ax
	mov dl,al
	add dl,30h
	mov ah,2
	int 21h
	pop ax
ENDM
	
	PINF  INF1
	CNT

	PINF  INF2
	mov ax,0
	mov al,CNTN
	HTBCD 
	PBCD

	PINF  INF3
	mov al,CNTC
	HTBCD 
	PBCD

	PINF  INF3
	mov al,CNTO
	HTBCD 
	PBCD

    	 mov ah,4ch
    	 int 21h
  



code ends
     end start

22

22.编写求两个4位非压缩BCD数之和,将和送显示器显示的程序。
22.asm

data segment
	INF1 DB "RESULT:$"
	INF2 DB 0AH,0DH,"$"
	INF3 DB " $"

	org 20H
	STRING1 DW 0001H
	STRING2 DW 0019H
	D DB 0h			;0h
	SUM DW 0H		;0020h

	;STRING1 DW 0001H
	;STRING2 DW 0099H
	;D DB 0h			;0h
	;SUM DW 0H		;0100h

	;STRING1 DW 0001H
	;STRING2 DW 9999H
	;D DB 0h			;1h
	;SUM DW 0H;0020h	;0000h


	org 60H
	IBUF DB 255,0,254 DUP('$')
	OBUF DB 7,0,6 DUP('$')
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

;输出INFO
PINF MACRO INF
MOV	DX,OFFSET INF
	MOV	AH,09H
	INT	21H
ENDM

;输入--》BUF
STORE MACRO BUF
	MOV	DX, OFFSET IBUF	;键入一个十六进制数
	MOV	AH,0AH
	INT	21H
ENDM


;取出bx:BCD数每一位并输出
QUWEI MACRO 
	PUSH BX
	MOV CX,12
	SHR BX,CL			
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	int 21h
	POP BX

	PUSH BX
	MOV CX,8
	SHR BX,CL	
	AND BX,0FH		
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	int 21h
	POP BX

	PUSH BX
	MOV CX,4
	SHR BX,CL	
	AND BX,0FH		
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	int 21h
	POP BX

	PUSH BX
	AND BX,0FH		
	MOV DL,BL
	ADD DL,30H
	MOV AH,02H
	int 21h
	POP BX	
	
ENDM	

	PINF INF1
	PINF INF2



	;计算
	;ax,bx代表数字
	;cl,表示al+bl的进位
	;ch,表示ah+bh的进位
	mov ax,STRING1
	mov bx,STRING2
	mov cx,0
	push ax

	add al,bl
	daa
	adc cl,0
	mov dx,ax
	
	
	pop ax
	;需加低位的进位
	add ah,cl
	add ah,bh
	mov al,ah
	daa
	adc ch,0
	mov dh,al
	;结果为 ch ,dx
	mov D,ch
	mov SUM,dx

	;显示
	mov dl,D
	add dl,30H
	mov ah,2
	int 21h
	
	mov bx,sum

	QUWEI
	

    	 mov ah,4ch
    	 int 21h
  



code ends
     end start

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
简化QUWEI

data segment
	INF1 DB "RESULT:$"
	INF2 DB 0AH,0DH,"$"
	INF3 DB " $"

	org 20H
	STRING1 DW 0001H
	STRING2 DW 0019H
	D DB 0h			;0h
	SUM DW 0H		;0020h

	;STRING1 DW 0001H
	;STRING2 DW 0099H
	;D DB 0h			;0h
	;SUM DW 0H		;0100h

	;STRING1 DW 0001H
	;STRING2 DW 9999H
	;D DB 0h			;1h
	;SUM DW 0H;0020h	;0000h


	org 60H
	IBUF DB 255,0,254 DUP('$')
	OBUF DB 7,0,6 DUP('$')
data ends

code segment
     assume cs:code,ds:data
start:     
     	mov ax,data
    	mov ds,ax

;输出INFO
PINF MACRO INF
MOV	DX,OFFSET INF
	MOV	AH,09H
	INT	21H
ENDM

;输入--》BUF
STORE MACRO BUF
	MOV	DX, OFFSET IBUF	;键入一个十六进制数
	MOV	AH,0AH
	INT	21H
ENDM


PDL MACRO
	ADD DL,30H
	MOV AH,02H
	int 21h

ENDM

;取出bx:BCD数每一位并输出
QUWEI MACRO 
	LOCAL NEXT
	MOV CX,12

	;CX=12,8,4
	NEXT:
		PUSH BX
		SHR BX,CL		
		MOV DL,BL
		PDL
		POP BX
		SUB CX,4
		JNZ NEXT	

	;CX=0
	AND BX,0FH
	MOV DL,BL
	PDL
	
ENDM	

	PINF INF1
	PINF INF2



	;计算
	;ax,bx代表数字
	;cl,表示al+bl的进位
	;ch,表示ah+bh的进位
	mov ax,STRING1
	mov bx,STRING2
	mov cx,0
	push ax

	add al,bl
	daa
	adc cl,0
	mov dx,ax
	
	
	pop ax
	;需加低位的进位
	add ah,cl
	add ah,bh
	mov al,ah
	daa
	adc ch,0
	mov dh,al
	;结果为 ch ,dx
	mov D,ch
	mov SUM,dx

	;显示
	mov dl,D
	PDL
	
	mov bx,sum

	QUWEI
	
	
    	 mov ah,4ch
    	 int 21h
  



code ends
     end start

最后

请您阅读文章声明,默认同意该声明
打赏通道
请添加图片描述

原网站

版权声明
本文为[日星月云]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_51625007/article/details/125090991