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

. . . .

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 解答:

参考

. . . .

asctob

asctob

3.29 解:DIPASC

DIPASC HTOASC

参考

proc push cx 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码 ;子程序返回

. . . .

htoasc1: add al,30h ;是0~9,加30H转换为ASCII码 ret ;子程序返回 HTOASC endp

3.30 解: lucase proc push bx mov bx,offset string cmp al,0 case0: next0: case1: next1: case2: next20: 参考

je case0 cmp al,1 jz case1 cmp al,2 jz case2 jmp done cmp byte ptr [bx],0 je done cmp byte ptr [bx],’A’ jb next0 cmp byte ptr [bx],’Z’ ja next0 add byte ptr [bx],20h inc bx jmp case0 cmp byte ptr [bx],0 je done cmp byte ptr [bx],’a’ jb next1 cmp byte ptr [bx],’z’ ja next1 sub byte ptr [bx],20h inc bx jmp case1 cmp byte ptr [bx],0 je done cmp byte ptr [bx],’A’ jb next2 cmp byte ptr [bx],’Z’ ja next20 add byte ptr [bx],20h jmp next2

cmp byte ptr [bx],’a’ jb next2 cmp byte ptr [bx],’z’

. . . .

ja next2 sub byte ptr [bx],20h next2: inc bx jmp case2 done: pop bx ret lucase endp

3.31 解:

(1)用寄存器传递参数:

最简单和常用的参数传递方法是通过寄存器,只要把参数存于约定的寄存器中就可以了

由于通用寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址

采用寄存器传递参数,注意带有出口参数的寄存器不能保护和恢复,带有入口参数的寄存器可以保护、也可以不保护,但最好能够保持一致 (2)用共享变量传递参数

子程序和主程序使用同一个变量名存取数据就是利用共享变量(全局变量)进行参数传递

如果变量定义和使用不在同一个源程序中,需要利用PUBLIC、EXTREN声明 如果主程序还要利用原来的变量值,则需要保护和恢复

利用共享变量传递参数,子程序的通用性较差,但特别适合在多个程序段间、尤其在不同的程序模块间传递数据 (3)用堆栈传递参数

参数传递还可以通过堆栈这个临时存储区。主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们

采用堆栈传递参数是程式化的,它是编译程序处理参数传递、以及汇编语言与高级语言混合编程时的常规方法

3.32 解:

方法:主程序将入口参数压入堆栈,子程序从堆栈中取出参数;子程序将出口参数压入堆栈,主程序弹出堆栈取得它们 注意:压栈与弹栈必须要一一对应。

3.33 解: 方法1: neg32 proc ;入口参数:DX.AX=32位有符号数 neg ax ;实现0-DX.AX功能 neg dx sbb dx,0 ;这条指令也可以用dec dx代替 ret neg32 endp ;出口参数:DX.AX=32位有符号数的补码 方法2: neg32 proc ;入口参数:DX.AX=32位有符号数

参考

. . . .

not ax ;实现DX.AX求反加1 not dx add ax,1 adc dx,0 ret neg32 endp ;出口参数:DX.AX=32位有符号数的补码

3.34 解: array count result checksum sum: checksum

3.35 解:⑴ wdata 参考

;数据段 db 12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h ;数组 equ $-array ;数组元素个数 db ? ;校验和 ;代码段 mov bx,offset array ;BX←数组的偏移地址 mov cx,count ;CX←数组的元素个数 call checksum ;调用求和过程 mov result,al ;处理出口参数 mov ax,4c00h int 21h ;计算字节校验和的通用过程 ;入口参数:DS:BX=数组的段地址:偏移地址,CX=元素个数;出口参数:AL=校验和 ;说明:除AX/BX/CX外,不影响其他寄存器 proc xor al,al ;累加器清0 add al,[bx] ;求和 inc bx ;指向下一个字节 loop sum ret endp end .model small .stack .data dw 34abh .code .startup mov ax,wdata call dispa .exit 0 ;