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,arraysiadd si,2loop sum_loop