微机原理与接口技术课后习题答案(郭兰英) 下载本文

; disp: mov ah,2 ;显示一个字符 int 21h pop bx pop ax jmp restart done: …

3.22 编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。 ;wjxt322.asm .model small .stack .data b_data db 12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h ;原始数据 num equ 10 ;数据个数 sum db ? ;预留结果单元 .code .startup xor si, si ;位移量清零 xor al, al ;取第一个数 mov cx, num ;累加次数 again: add al, b_data[si] ;累加 inc si ;指向下一个数 loop again ;如未完,继续累加 mov sum, al ;完了,存结果 .exit 0 end

3.23 求主存0040h:0开始的一个64KB物理段中共有多少个空格? ; wjxt323.asm .model small .code start: mov ax,0040h ;送段地址 mov ds, ax mov si, 0 ;偏移地址 mov cx, si ;计数(循环次数) xor ax, ax ;空格计数器清零 again: cmp byte ptr [si], 20h ;与空格的ASCII码比较 jne next ;不是空格,转 inc ax ;是空格,空格数加1 next: inc si ;修改地址指针 loop again ;cx=cx-1,如cx=0 退出循环 .exit 0

9

end start

3.24 编写计算100个16位正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。 答: ;数据段 count equ 100 parray dw count dup(?) ;假设有100个数据 wordsum dw 0 msg db ‘overflow’,’$’ ;代码段 mov cx,count mov ax,0 mov bx,offset parray again: add ax,[bx] jnc next mov dx,offset msg mov ah,9 int 21h ;显示溢出信息 jmp done ;然后,跳出循环体 next: add bx,2 loop again mov wordsum,ax done: …

3.25 编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。 ;wjxt325.asm .model small .stack 256 .data array dw ? ;源字数据 dbcd db 5 dup(?) ;五位bcd结果,高对高低对低 .code .startup mov dx, array ;取源数据(余数) mov bx, 10000 ;除数 mov cx, 10 ;除数系数 mov si, 4 ;目的数据高位位移量 again: mov ax, dx ;dx.ax中存放被除数 mov dx, 0 div bx ;除于bx,商ax,余数dx mov dbcd[si], al ;商<10,存结果

10

push dx ;暂存余数 mov ax, bx ;除数除于10 mov dx,0 div cx ;dx.ax除于cx,商ax、余数0存在dx mov bx, ax ;bx是除数 pop dx dec si ;目的数据位移量减1 jnz again mov dbcd, dl ;存个位数( < 10 ) .exit 0 end

3.26 解:

(1)汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下: 过程名 PROC [NEAR|FAR]

…… ;过程体 过程名 ENDP

(2)保护用到的寄存器内容,以便子程序返回时进行相应的恢复。 (3)改错: crazy proc

pish bx push cx xor ax,ax xor dx,dx again:add a,[bx] adc dx,0 inc bx inc bx

loop again pop cx pop bx

3.27 解(不需调用HTOASC子程序): again: mov ah,1 int 21h cmp al,1bh ;ESC的ASCII码是1bh je done mov dl,al mov ah,2 int 21h ;是大写字母则转换为小写字母 jmp again done: …

3.28 解答:

11

asctob proc push cx

asctob

3.29 解:DIPASC

DIPASC HTOASC

and dh,0fh shl dh,1 mov ch,dh shl dh,1 shl dh,1 add dh,ch and dl,0fh add dh,dl mov al,dh pop cx ret endp

proc push cx push dx push ax mov cl,4 shr al,cl call HTOASC mov dl,al mov ah,2 int 21h pop ax

call HTOASC mov dl,al mov ah,2 int 21h

mov dl,’H’mov ah,2 int 21h pop dx pop cx ret endp proc

and al,0fh cmp al,9 jbe htoasc1 add al,37h ret

;先转换十位数

;十位数乘以10(采用移位指令)

;转换个位数 ;十位数加个位数 ;设置出口参数

;入口参数:AL=要显示的一个16进制数

;转换高位

;显示

;转换低位 ;显示

;显示一个字母“H”

;将AL低4位表达的一位16进制数转换为ASCII码;是0AH~0FH,加37H转换为ASCII码 ;子程序返回

12