新版汇编语言程序设计【课后习题答案】 钱晓捷 主编 电子工业出版社 下载本文

next: mov ax,0 ; mov ax,0ffffh again: ... (4)解答:

mov ax, word ptr buffer1

sub ax, word ptr buffer2 ;先减低16位 mov dx, word ptr buffer1+2

sbb dx, word ptr buffer2+2 ;后减高16位,需减低16位的借位

(5)解答:

mov ax,0b800h

mov ds,ax ;段地址

xor si,si ;地址偏移量si=0 xor dx,dx ;和的高字dx=0 mov cx,99 ;加的次数 mov ax,[si] ;第一个数 again: inc si ;指向下一个字单元 inc si

add ax,[si] ;加下一个数 jnc noc ;无进位转

inc dx ;有进位dx=dx+1 noc: dec cx ;次数-1 jnz cx,again ;非0继续加 (6)解答1:不使用串操作指令(更好)

mov si,offset string

mov cx,8000h ; 32k=2^15=8000h

again: cmp byte ptr [si], ‘$’ ;‘$’ =24h

jnz next ; 不要采用 jz 进行分支

mov byte ptr [si], ‘ ’ ;‘ ’=20h next: inc si

loop again ; dec cx

; jnz again

(6)解答2:使用串操作指令

mov di,offset string mov al,’$’ mov cx,8000h cld again: scasb

jnz next

mov byte ptr es : [di-1], ‘ ’

next: loop again (7)解答1:

mov si,offset array mov cx,100 again: dec byte ptr [si] inc si loop again (7)解答2:

xor si,si ; si<--0 mov cx,100 ; 循环次数 again: dec array[si] inc si loop again (7)解答3:

mov si,offset array mov di,si

mov ax,ds mov es,ax mov cx,100 cld again: lodsb

dec al stosb loop again (8)解答:

xor si,si ;si<--0 coun: cmp string[si],'$' je done inc si jmp coun

done: ...

〔习题2.27〕对下面要求,分别给出3种方法,每种方法只用一条指令。 (1)使CF=0 (2)使AX=0 (3)同时使AX=0和CF=0 〔解答〕 (1)解答:

clc

and ax,ax or ax,ax (2)解答:

xor ax,ax and ax,0 mov ax,0

(3)解答:

and ax,0 xor ax,ax sub ax,ax

〔习题2.28〕参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中CALL前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为3,段间直接调用指令则为5个字节。 〔解答〕

主程序转子suba时段内调用:断点1为2000h:0400h+3, 转子是只将IP压栈。

suba转子subb时段间调用:断点2为2000h:0840h+5, 转子时须将cs段地址和IP压栈 suba转子subc时段内调用:断点3为2000h:0c021h+3,转子是只将IP压栈。 注:压栈时先修改sp再压入断点,弹栈时先弹出断点再修改sp。

〔习题2.29〕已知AX 、BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。

add al,bl daa

xchg al,ah adc al,bh daa

xchg al,ah ret 〔解答〕

压缩BCD码加法:AX←AX+BX 出口参数:AX=BCD码和

〔习题2.30〕AAD指令是用于除法指令之前,进行非压缩BCD码调整的。实际上,处理器的调整过程是:AL←AH×10+AL,AH←0。如果指令系统没有AAD指令,请用一个子程序完成这个调整工作。 〔解答〕

shl ah,1 ;ah=2*a (设原ah=a) mov dl,ah ;dl=2*a

mov cl,2 ;设定移位次数 shl ah,cl ;ah=8*a add ah,dl ;ah=10*a add al,ah ;al=10*a+al xor ah,ah ;清零ah

int 3 ;返回DOS 注意: 入口:AX中存放有“和”(两非压缩BCD码) 出口:AL中 已为调整后的二进制数

〔习题2.31〕解释如下有关中断的概念:

(1) 内部中断和外部中断 (2) 单步中断和断点中断 (3) 除法错中断和溢出中断 (4) 中断向量号和中断向量表 〔解答〕

(1)内部中断是由于8086CPU内部执行程序引起的程序中断;外部中断是来自8086CPU之外的原因引起的程序中断;

(2)单步中断是若单步标志TF为1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为3通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;

(3)除法错中断是在执行除法指令时,若除数为0或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令INTO时,若溢出标志OF为1时产生的中断; (4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。

〔习题2.32〕试比较INT n和段间CALL指令、IRET和段间RET指令的功能。 〔解答〕

INT n 响应中断时,除象CALL保护断点外,还应保护FR;段间CALL指令用在主程序中实现子程序的调用。IRET 返回时,除象RET恢复断点外,还应恢复FR;子程序执行完成后,应返回主程序中继续执行,这一功能由RET指令完成。

〔习题2.33〕什么是系统功能调用?汇编语言中,它的一般格式是怎样的? 〔解答〕

系统功能调用是用户在程序一级请示操作系统服务的一种手段,它不是一条简单的硬指令,而是带有一定功能号的“访指令”,它的功能并非由硬件直接提供,而是由操作系统操作系统中的一段程序完成的,即由软件方法实现的 汇编语言中,它的一般格式是分如下四步进行: (1)在AH寄存器置系统功能调用号; (2)在指定的寄存器中设置 入口参数;

(3)用INT21H(或ROM—BIOS的中断向量号)指令执行功能调用; (4)据出口参数分析功能调用运行情况。

〔习题2.34〕补充例2.40,当有溢出时显示“Error! Overflow!”,无溢出时显示“OK”。 〔解答〕

okmsg db ‘OK’, ‘$’

errmsg db ‘Error ! Overflow !’, ‘$’ … mov ax,X sub ax,Y jo overflow

mov dx,offset okmsg jmp next overflow: mov dx,errmsg

next: mov ah,9