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
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库汇编课后答案(4)在线全文阅读。
相关推荐: