收藏 分享(赏)

汇编程序设计 钱晓捷(第四版)第2章课后答案.doc

上传人:scg750829 文档编号:5998210 上传时间:2019-03-23 格式:DOC 页数:17 大小:107.50KB
下载 相关 举报
汇编程序设计 钱晓捷(第四版)第2章课后答案.doc_第1页
第1页 / 共17页
汇编程序设计 钱晓捷(第四版)第2章课后答案.doc_第2页
第2页 / 共17页
汇编程序设计 钱晓捷(第四版)第2章课后答案.doc_第3页
第3页 / 共17页
汇编程序设计 钱晓捷(第四版)第2章课后答案.doc_第4页
第4页 / 共17页
汇编程序设计 钱晓捷(第四版)第2章课后答案.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、- 1 -第 2 章 8086 的指令系统习题 2.1已知 DS2000H、BX0100H 、SI 0002H,存储单元20100H20103H依次存放 12 34 56 78H,21200H21203H依次存放 2A 4C B7 65H,说明下列每条指令执行完后 AX 寄存器的内容。(1) mov ax,1200h(2) mov ax,bx(3) mov ax,1200h(4) mov ax,bx(5) mov ax,bx+1100h(6) mov ax,bx+si(7) mov ax,bxsi+1100h解答(1) AX1200H(2) AX0100H(3) AX4C2AH ;偏移地址=b

2、x=0100h(4) AX3412H ;偏移地址=bx=0100h(5) AX4C2AH ;偏移地址=bx+1100h=1200h(6) AX7856H ;偏移地址=bx+si=0100h+0002h=0102h(7) AX65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h习题 2.2指出下列指令的错误(1) mov cx,dl(2) mov ip,ax(3) mov es,1234h(4) mov es,ds(5) mov al,300(6) mov sp,ax(7) mov ax,bx+di(8) mov 20h,ah- 2 -解答(1)两操作数

3、类型不匹配(2) IP 指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为 SI (7)源操作数应为 BX+DI (8)立即数不能作目的操作数习题 2.3已知数字 0 9 对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H 、14H,它存在于以 table 为首地址(设为200H)的连续区域中。请为如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。 lea bx,tablemov al,8xlat解答lea bx,table ;获取 table 的首地址,BX200Hmov

4、 al,8 ;传送欲转换的数字,AL 8xlat ;转换为格雷码,AL 12H P35习题 2.4什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令? 解答堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用 SS 段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是 PUSH 和 POP。习题 2.5已知 SS = 2200H、 SP = 00B0H,画图说明执行下面指令序列时,堆栈区和 SP 的内容如何变化? mov ax,8057hpush axmov ax,0f79h push axpop bx- 3 -pop bx

5、解答mov ax,8057hpush axmov ax,0f79hpush axpop bx ;bx=0f79hpop bx ;DS:0f79h=8057h习题 2.6给出下列各条指令执行后 AL 值,以及 CF、ZF、SF、OF 和 PF 的状态:mov al,89hadd al,aladd al,9dhcmp al,0bchsub al,aldec alinc al解答- 4 -mov al,89h ; AL=89h CF ZF SF OF PFadd al,al ; AL=12h 1 0 0 1 1; 1000 1001+1000 1001 10001 0010 add al,9dh ;

6、 AL=0afh 0 0 1 0 1; 0001 0010+ 1001 11011010 1111 cmp al,0bch ; AL=0afh 1 0 1 0 1; 1010 1111-1011 1100* 0100 0011sub al,al ; AL=00h 0 1 0 0 1dec al ; AL=0ffh 0 0 1 0 1; 0000 0000- 0000 0001*1111 1111inc al ; AL=00h 0 1 0 0 1;1111 1111+0000 0001*1111 1111习题 2.7 解答- 5 -W X+Y+24-Z习题 2.8解答(1) ADD DX,BX(

7、2) ADD AL,BX+SI(3) ADD BX+0B2H,CX(4) ADD WORD PTR 0520H,3412H(5) ADD AL,0A0H习题 2.9解答V-(X*Y+Z-540)/XAX 存商,DX 存余数 习题 2.10解答(1) xchg 的操作数不能是立即数(2)不应对 CS 直接赋值(3)两个操作数不能都是存储单元(4)堆栈的操作数不能是字节量(5) adc 的操作数不能是段寄存器(6)没有确定是字节还是字操作(7) in 不支持超过 FFH 的直接寻址(8) out 只能以 AL/AX 为源操作数习题 2.11 mov ax,1470h ;AX1470H CF ZF

8、SF OF PFand ax,ax ;AX1470H 0 0 0 0 0;0001 0100 0111 0000- 6 -or ax,ax ;AX1470H 0 0 0 0 0xor ax,ax ;AX0000H 0 1 0 0 1not ax ;AXFFFFH 0 1 0 0 1test ax,0f0f0h ;AXFFFFH 0 0 1 0 1注意:MOV 和 NOT 指令不影响标志位;其他逻辑指令使 CFOF 0 ,根据结果影响其他标志位。习题 2.12假设例题 2.34 的程序段中, AX = 08H,BX = 10H,请说明每条指令执行后的结果和各个标志位的状态。 解答指令 ; 执行结

9、果 CF OF SF ZF PFmov si,ax ; SI=AX=0008H - - - - -shl si,1 ; SI=2*AX=0010H 0 0 0 0 0add si,ax ; SI=3*AX=0018H 0 0 0 0 1 mov dx,bx ; DX=BX=0010H 0 0 0 0 1 mov cl,03h ; CL=03H 0 0 0 0 1 shl dx,cl ; DX=8*BX=0080H 0 u 0 0 0 sub dx,bx ; DX=7*BX=0070H 0 0 0 0 0add dx,si ; DX=7*BX+3*AX=0088H 0 0 0 0 1注意:逻辑左

10、移 N 次相当于无符号整数乘以 2 的 N 次方,逻辑右移 N 次相当于无符号整数除以 2的 N 次方。移位指令根据移位的数据设置 CF,根据移位后的结果影响 SF,ZF,PF。在进行一位移位时,根据最高符号位是否改变设置 OF,如改变则 OF1。另外,程序注释用“u”表示标志无定义(不确定),“-”表示无影响。习题 2.13编写程序段完成如下要求: (1)用位操作指令实现 AL(无符号数)乘以 10(2)用逻辑运算指令实现数字 0 9 的 ASCII 码与非压缩 BCD 码的互相转换(3)把 DX.AX 中的双字右移 4 位解答(1) ;不考虑进位 mov bl,almov cl,3- 7

11、-shl al,cl ;*8add al,bl ;shl bl,1 add al,bl;考虑进位xor ah,ahmov bx,axmov cl,3shl ax,cladd ax,bx ;shl bx,1add ax,bx(2)数字 09 的 ASCII 码是:30h39h非压缩 BCD 码的 09 是:00h09h方法一:and al,0fh ;实现 ASCII 到非压缩 BCD 码的转换or al,30h ;实现非压缩 BCD 码到 ASCII 的转换方法二:xor al,30h ;求反 D5D4 位,其他不变;即高 4 位为 3,则变为 0;高 4 位为 0,则变为 3(3) mov c

12、l,4again: shr dx,1 ;实现逻辑右移;采用“sar dx,1”,则实现算术右移rcr ax,1dec cljnz again习题 2.14已知 AL = F7H(表示有符号数-9),分别编写用 SAR 和 IDIV 指令实现的除以 2 的程序段,并说明各自执行后,所得的商是什么? 解答(1)用 sar 编写mov al,0f7h ; -9 送 AL 1111 1001sar al,1 ; 结果:AL=1111 1100B=0FBH 即-5- 8 -(2)用 idiv 编写mov al,0f7h ; -9 送 alcbw ; 字节符号扩展位字mov bl,2 ; 注意除数不可为立

13、即数idiv bl ; 结果:商为 al=fch (-4); 余数:ah=ffh (-1) 结论:符号数的除法用 idiv 准确。 习题 2.15指令指针 IP 是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值? 解答指令指针 IP 不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。习题 2.16控制转移类指令中有哪三种寻址方式? 解答控制转移类指令的寻址方式:相对寻址、直接寻址方式和间接寻址方式(又可以分成寄存器和存储器间接寻址)。习题 2.17什么是短转移 short jump、近转移 near j

14、ump 和远转移 far jump?什么是段内转移和段间转移?8086 有哪些指令可以实现段间转移? 解答短转移:指段内128127 之间的转移,位移量用一个字节表示近转移:指段内32K 之间的转移,位移量用一个字表示远转移:指段间 1MB 范围的转移段内转移:指在同一个代码段内的转移,可以是短转移或者近转移段间转移:指转移到另外一个代码段,就是远转移8086/8088CPU 的 JMP、CALL 和 INT n 指令可以实现段间转移习题 2.188086 的条件转移指令的转移范围有多大?实际编程时,你如何处理超出范围的条件转移? 解答8086 的条件转移的转移范围:在当前指令地址的 +127

15、-128 之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。- 9 -习题 2.19假设 DS=2000H, BX=1256H,SI=528FH,位移量 TABLE=20A1H,232F7H=3280H,264E5H=2450H,试问执行下列段内间接寻址的转移指令后,转移的有效地址是什么? (1) JMP BX(2) JMP TABLEBX(3) JMP BXSI解答(1)转移的有效地址 EA= BX=1256H(2)转移的有效地址 EA= DS:20A1H+1256H=232F7=3280H(3)转移的有效地址 EA= DS:1256H+528F

16、H=264E5H=2450H习题 2.20判断下列程序段跳转的条件 (1) xor ax,1e1ehje equal(2)test al,10000001bjnz there(3)cmp cx,64hjb there解答(1) AX1e1eh(异或后为 0)(2) AL 的 D0 或 D7 至少有一位为 1(3) CX(无符号数) 64h习题 2.21设置 CX = 0,则 LOOP 指令将循环多少次?例如: mov cx,0delay: loop delay解答216 次。习题 2.22假设 AX 和 SI 存放的是有符号数,DX 和 DI 存放的是无符号数,请用比较指令和条件转移指令实现以

17、下判断: (1)若 DX DI,转到 above 执行;(2)若 AX SI,转到 greater 执行;- 10 -(3)若 CX = 0,转到 zero 执行;(4)若 AXSI 产生溢出,转到 overflow 执行;(5)若 SIAX,转到 less_eq 执行;(6)若 DIDX,转到 below_eq 执行。解答(1)若 DX DI,转到 above 执行cmp dx,dija above ;jnbe above(2)若 AX SI,转到 greater 执行cmp ax,sijg greater ;jnle greater(3)若 CX = 0,转到 zero 执行cmp cx,

18、0jz zero ; jcxz zero (4)若 AXSI 产生溢出,转到 overflow 执行;cmp ax,sijo overflow(5)若 SIAX,转到 less_eq 执行;cmp si,ax ; cmp ax,sijle less_eq ; jge less_eq(6)若 DIDX,转到 below_eq 执行。cmp di,dx ; cmp dx,dijbe below_eq ; jae below_eq习题 2.23有一个首地址为 array 的 20 个字的数组,说明下列程序段的功能。 mov cx,20mov ax,0mov si,axsum_loop: add ax

19、,arraysiadd si,2loop sum_loop- 11 -mov total,ax解答将首地址为 array 得 20 个字的数组求和,并将结果存入 total 单元中。习题 2.24按照下列要求,编写相应的程序段: (1)起始地址为 string 的主存单元中存放有一个字符串(长度大于 6),把该字符串中的第 1 个和第 6 个字符(字节量)传送给 DX 寄存器。(2)从主存 buffer 开始的 4 个字节中保存了 4 个非压缩 BCD 码,现按低(高)地址对低(高)位的原则,将它们合并到 DX 中。(3)编写一个程序段,在 DX 高 4 位全为 0 时,使 AX = 0;否则

20、使 AX = -1。(4)有两个 64 位数值,按“小端方式 ”存放在两个缓冲区 buffer1 和 buffer2 中,编写程序段完成buffer1 buffer2 功能。(5)假设从 B800h : 0 开始存放有 100 个 16 位无符号数,编程求它们的和,并把 32 位的和保存在 DX.AX 中。(6)已知字符串 string 包含有 32KB 内容,将其中的$符号替换成空格。(7)有一个 100 个字节元素的数组,其首地址为 array,将每个元素减 1(不考虑溢出)存于原处。(8)统计以 $ 结尾的字符串 srting 的字符个数。解答(1)解答:mov si,0mov dl,s

21、tringsi ;第 1 个字符送 dl 寄存器:mov dl,stirng0mov si,5mov dh,stringsi ;第 6 个字符送 dh 寄存器:mov dl,stirng5(2)解答:xor si,si ;si 清零mov al,buffersi ;第一字节inc simov ah,buffersi ;第二字节mov cl,4shl ah,cl ;BCD 码移到高半字节or al,ah ;组合成压缩 BCD 码- 12 -mov dl,al ;存入 dl 寄inc simov al,buffersi ;第三字节inc simov ah,buffersi ;第四字节mov cl,

22、4shl ah,cl ;BCD 码移到高半字节or al,ah ;组合成压缩 BCD 码mov dh,al ;存入 dh 寄(3)解答:test dx,0f000h ; test dh,0f0hjz next ; jnz nextmov ax,-1 ; mov ax,0jmp againnext: mov ax,0 ; mov ax,0ffffhagain: .(4)解答:mov ax, word ptr buffer1sub ax, word ptr buffer2 ;先减低 16 位mov dx, word ptr buffer1+2sbb dx, word ptr buffer2+2 ;

23、后减高 16 位,需减低 16 位的借位(5)解答:mov ax,0b800hmov ds,ax ;段地址xor si,si ;地址偏移量 si=0xor dx,dx ;和的高字 dx=0mov cx,99 ;加的次数mov ax,si ;第一个数again: inc si ;指向下一个字单元 inc si- 13 -add ax,si ;加下一个数jnc noc ;无进位转inc dx ;有进位 dx=dx+1noc: dec cx ;次数-1jnz cx,again ;非 0 继续加 (6)解答 1:不使用串操作指令(更好)mov si,offset stringmov cx,8000h

24、; 32k=215=8000hagain: cmp byte ptr si, $ ;$ 24hjnz next ; 不要采用 jz 进行分支mov byte ptr si, ; 20hnext: inc siloop again ; dec cx; jnz again(6)解答 2:使用串操作指令mov di,offset stringmov al,$mov cx,8000hcldagain: scasbjnz nextmov byte ptr es : di-1, next: loop again(7)解答 1:mov si,offset array mov cx,100again: dec

25、 byte ptr si- 14 -inc siloop again(7)解答 2:xor si,si ; si-0mov cx,100 ; 循环次数again: dec arraysiinc siloop again(7)解答 3:mov si,offset arraymov di,simov ax,ds mov es,axmov cx,100cldagain: lodsb dec alstosbloop again(8)解答:xor si,si ;si-0coun: cmp stringsi,$je doneinc sijmp coundone: . 习题 2.25对下面要求,分别给出 3

26、 种方法,每种方法只用一条指令。 (1)使 CF=0 (2)使 AX=0 (3)同时使 AX=0 和 CF=0解答(1)解答:- 15 -clcand ax,axor ax,ax(2)解答:xor ax,axand ax,0mov ax,0(3)解答:and ax,0xor ax,axsub ax,ax习题 2.26参照本习题的示意图,分析调用序列,画出每次调用及返回时的堆栈状态。其中 CALL 前是该指令所在的逻辑地址;另外,段内直接调用指令的机器代码的字节数为 3,段间直接调用指令则为 5个字节。 解答主程序转子 suba 时段内调用:断点 1 为 2000h:0400h+3,转子是只将

27、IP 压栈。suba 转子 subb 时段间调用:断点 2 为 2000h:0840h+5, 转子时须将 cs 段地址和 IP 压栈suba 转子 subc 时段内调用:断点 3 为 2000h:0c021h+3 ,转子是只将 IP 压栈。注:压栈时先修改 sp 再压入断点,弹栈时先弹出断点再修改 sp。习题 2.27已知 AX 、BX 存放的是 4 位压缩 BCD 表示的十进制数,请说明如下子程序的功能和出口参数。 add al,bldaaxchg al,ahadc al,bhdaaxchg al,ahret解答- 16 -压缩 BCD 码加法:AXAXBX出口参数:AXBCD 码和习题 2

28、.28AAD 指令是用于除法指令之前,进行非压缩 BCD 码调整的。实际上,处理器的调整过程是:ALAH10AL,AH0。如果指令系统没有 AAD 指令,请用一个子程序完成这个调整工作。 解答shl ah,1 ;ah=2*a (设原 ah=a)mov dl,ah ;dl=2*amov cl,2 ;设定移位次数shl ah,cl ;ah=8*aadd ah,dl ;ah=10*aadd al,ah ;al=10*a+alxor ah,ah ;清零 ahint 3 ;返回 DOS注意: 入口:AX 中存放有“和”(两非压缩 BCD 码)出口:AL 中 已为调整后的二进制数习题 2.29解释如下有关

29、中断的概念: (1) 内部中断和外部中断(2) 单步中断和断点中断(3) 除法错中断和溢出中断(4) 中断向量号和中断向量表解答(1)内部中断是由于 8086CPU 内部执行程序引起的程序中断;外部中断是来自 8086CPU 之外的原因引起的程序中断;(2)单步中断是若单步标志 TF 为 1,则在每条指令执行结束后产生的中断;断点中断是供调试程序使用的,它的中断类型号为 3 通常调试程序时,把程序按程序的任务分成几段,然后,每段设一个段点;(3)除法错中断是在执行除法指令时,若除数为 0 或商超过了寄存器所能表达的范围产生的中断;溢出中断是在执行溢出中断指令 INTO 时,若溢出标志 OF 为 1 时产生的中断;(4)中断向量号是 中断类型号;中断向量表是中断向量号与它所对应的中断服务程序起始地址的转换表。习题 2.30试比较 INT n 和段间 CALL 指令、IRET 和段间 RET 指令的功能。 - 17 -解答INT n 响应中断时,除象 CALL 保护断点外,还应保护 FR;段间 CALL 指令用在主程序中实现子程序的调用。IRET 返回时,除象 RET 恢复断点外,还应恢复 FR;子程序执行完成后,应返回主程序中继续执行,这一功能由 RET 指令完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报