汇编课后答案(4)

2018-12-27 15:44

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


汇编课后答案(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:煤场道路施工组织设计

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: