习题四
1.8086语言指令的寻址方式有哪几类?用哪一种寻址方式的指令执行速度最快?
答:数据操作数的寻址方式有七种,分别为:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对基址变址和相对基址变址寻址。其中寄存器寻址的指令执行速度最快。
2.若DS=6000H,SS=5000H,ES=4000H,SI=0100H,BX=0300H,BP=0400H,D=1200H,数据段中变量名NUM的偏移地址为0050H,试指出下列源操作数的寻址方式和物理地址是多少?
(1)MOV AX,[64H] 答:寻址方式为直接寻址;PA=60064H (2)MOV AX,NUM 答:寻址方式为直接寻址; PA=60005H (3)MOV AX,[SI] 答:寻址方式为寄存器间接寻址;PA=60100H (4)MOV AX,[BX] 答:寻址方式为寄存器间接寻址;PA=60300H (5)MOV AX,[BP] 答:寻址方式为寄存器间接寻址;PA=50400H (6)MOV AL,[DI] 答:寻址方式为寄存器间接寻址;PA=61200H (7)MOV AL,[BX+1110H] 答:寻址方式为寄存器相对寻址;PA=61410H (8)MOV AX,NUM[BX] 答:寻址方式为寄存器相对寻址;PA=60305H (9)MOV AX,[BX+SI] 答:寻址方式为基址变址寻址;PA=60400H (10)MOV AX,NUM[BX][DI] 答:寻址方式为相对基址变址寻址;PA=61505H
3.设BX=637DH,SI=2A9BH,位移量为C237H,试确定由这些寄存器和下列寻址方式产生的有效地址。
(1)直接寻址 答:有效地址为 EA=C237H (2)用BX的寄存器间接寻址 答:有效地址为 EA=637DH (3)用BX的相对寄存器间接寻址 答:有效地址为 EA=125B4H (4)基址加变址寻址 答:有效地址为 EA=8E18H (5)相对基址变址寻址 答:有效地址为 EA=1504FH 其中,(3)和(5)中产生进位,要把最高位1舍去。
4.指出下列指令是否正确,若不正确情说明原因。
(1) MOV DS, 2010H ;立即数不能传送到DS
(2) PUSH AL ;栈操作,操作数类型必须为WORD类型 (3) MOV DX,[SP] ;SP寄存器不能做间址寄存器
(4) IN AL,0A00H ;I/O指令的直接寻址,地址只能为8位 (5) XCHG CL,CH ;正确
(6) SHR AX,3 ;移位超过一位时,应采用CL寄存器间址 (7) AAA CX ;非组合的BCD码加法调整AAA指令应为隐含操作数 (8) ADD [BP+DI] ;加法指令ADD,缺少源操作数
(9) OUT DX,CL ;I/O指令操作数只能用AX、AL提供,端口地址可以是8位的
直接地址或用DX间址
(10)CBW BH ;符号扩展指令为隐含操作数
(11)ADD 03ECH ;加法指令应为双操作数指令,立即数不能做目的操作数 (12)MOV BX, [SI+DI] ;源操作数形式错误,SI和DI不能同时做为间址寄存器 (13)MOV DI, [AX] ;AX不能做为间址寄存器
(14)OUT 258H, BX ;I/O指令格式错误,见(9)题的解释
(15)SHL AX, 3 ;移位指令,位移位数大于1时,应用CL来指明 (16)MOV 64H,AL ;立即数不能做为目的操作数 (17)ADD AL,6600H ;源、目的操作数的类型不一致 (18)MOV[BX],[SI] ;传送指令中,两个操作数不能同时为存储器操作数 (19)XCHG AX,8800H ;交换指令的操作数不能使用立即数 (20)MOV AX,[BX+DX] ;传送指令的源操作数,不能使用立即数 (21)LEA BX,1000H
;有效地址传送指令的源操作数不能为立即数,必须是存储器操作数 (22)DIV 0010H ;正确
(23)LEA DX,DI ;同(21)题,源操作数不能为寄存器操作数 (24)MUL AX,200H ;乘法指令的目的操作数是隐含的,不能出现在指令中 (25)MOV AX, [BX+BP]
;传送指令中源操作数格式错,BX和BP不能同时为间址寄存器
(26)CMP [BX], [SI] ;比较指令的两个操作数不能同时为存储器操作数 (27)OUT DX, BX ;I/O指令中,源操作数只能使用AL或AX寄存器 (28)AND OFH,AL ;“与”指令中,目的操作数不能使用立即数 (29)SAL [BX],CX ;移位指令,移位位移不能用CX寄存器指明 (30)JMP FAR [BX+SI] ;转移指令中转移的目标地址表达方式错误
;如果是段内间接转移,应为:JMP WORD PTR[BX+SI] ;如果是段间间接转移,应为:JMP DWORD PTR[BX+SI]
(31)JNZ AAA;不相等转移指令中,符号地址(标识符)不能使用系统中的保留字 (32)JMP NEXT ;正确
(33)SBC AX, [DX] ;指令助记符错,源操作数表示方式错 (34)MOV CS,DS
;段寄存器之间不能传送数据,CS寄存器也不能做为目的操作数 (35)ADD DS, AX ;加法指令中段寄存器不能做为操作数
(36)MOV AL,CX ;源、目的操作数的类型不一致,见(17)题 (37)INC [BX] ;没有指定存储器操作数类型 (38)MOV CL,A8H
;源操作数为16进制的立即数,16进制数以字母开头时应在前面加“0” (39)MOV ES,DS ;错同(34)题
(40)IN AL,BX ;I/O指令端口地址表示错误,只能用8位立即数或DX间址 5.设一个字节数据X存放AL寄存器中,试说明下列程序的功能:
XOR AH,AH ;AH清零
SAL AX,1 ;AX左移一位,相当于2X MOV BX,AX ;2X送BX暂存 MOV CL,2
SAL AX,CL ;AX左移二位,2X×4=8X ADD AX,BX ;2X+8X=10X
该段程序实现了字节数据X乘10,结果在AX中。
6.试编程实现:
(1)AL寄存器的低4位清0 (2)BL寄存器的低4位置1 (3)CL寄存器的低4位取反
(4)测试DL寄存器的最低2位是否同时为0,若是,将0送入BL寄存器;否则将1送 入BL寄存器。
答:程序段如下
AND AL,0F0H ;① AL寄存器的低4位清0
OR BL,0FH ;② BL寄存器的低4位置1 XOR CL,0FH ;③ CL寄存器的低4位取反
;④ 测试DL寄存器 TEST DL,03H
JZ NEXT MOV BL,1 JMP NEXT1
NEXT:MOV BL,0 NEXT1:HLT
7.若有两个4字节的无符号数相加,这两个数分别存放在2000H和3000H开始的存储单元 中,得到的和存放在2000H开始的内存单元。试编程完成。 答:程序段如下
MOV AX,[3000H] ADD [2000H],AX MOV AX,[3002H] ADC [2002H],AX
8.设从2000H为首址的内存中,存放着10个带符号的字节数据,试编程完成:找出其中最大的数,并存入2000H单元。
答:程序段如下
MOV BX,2000H MOV CX,9
MOV AL,[BX] N2:INC BX
CMP AL,[BX] JGE N1
MOV AL,[BX] N1:LOOP N2
MOV [2000H],AL HLT
9.用寄存器间接寻址方式时,BX、BP、SI、DI分别针对什么情况来使用?用这4个寄存器分别组合间接寻址时,物理地址是怎样计算的?举例说明。
答:BX、SI、DI用于在数据段寻址,BP用于在堆栈段寻址。
在数据段物理地址为:PA=DS×10H+BX/SI/DI
或者为:PA=DS×10H+BX+SI 或(BX+DI)
在堆栈段物理地址为:PA=SS×10H+BP
或者为:PA=SS×10H+BP+SI 或(BP+DI) 举例如下:
MOV AX,[BX+SI] ;在数据段寻址,PA=DS×10H+BX+SI MOV AX,[BP+DI] ;在堆栈段寻址,PA=SS×10H+BP+DI 10.已知:DS=2000H,BX=0300H,SI=0002H,(20300H)=12H,(20301)=34H,(20302H)=56H,(20303H)=78H,(21400H)=2AH,(21401H)=4CH,(21402H)=B7H,(21403H)=65H试说明下列各条指令执行完后AX寄存器的内容。
(1)MOV AX,1400H ;答:执行完该条指令后 AX=1400H (2)MOV AX,BX ;答:执行完该条指令后 AX=0300H (3)MOV AX,[1400H] ;答:执行完该条指令后 AX=4C2AH (4)MOV AX,[BX] ;答:执行完该条指令后 AX=3412H
11.根据以下要求,试写出相应的汇编语言指令。
(1)把BX寄存器和DX寄存器的内容相加,结果存入BX寄存器中。 答:指令为 ADD BX,DX
(2)用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节与AL寄存器的内容相加,并把结果送到AL寄存器中。
答:指令为 ADD AL,[BX+SI]
(3)用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX相加,并把结果存回存储器中。
答:指令为 ADD [BX+0B2H],CX
(4)用位移量为0524H的直接寻址方式把存储器中的一个字与立即数3C5AH相加,并把结果送回该存储单元。
答:指令为 ADD [0524H],3C5AH
12.已知堆栈段寄存器SS的内容是0FF0AH,堆栈指针寄存器SP的内容是0008H,先执行两条把8057H和0F7CH分别进栈的PUSH指令,再执行一条POP BX指令。试画出堆栈区和SP的内容过程变化示意图(标出存储单元的物理地址)。
答:将8057H和0F7CH分别进栈后,SP=0004H,再执行一条POP BX指令后,SP=0006H, BX=0F7CH。堆栈区和SP的内容过程变化示意图如下: SP=0004H SP=0006H SP=0008H 0FF0A0H SS=0FF0AH 0FF0A1H 0FF0A2H 0FF0A3H 7 C H 0FF0A4H 7 C H SP → 0 F H 0FF0A5H 0 F H 5 7 H 0FF0A6H 5 7 H SP → 8 0 H 0FF0A7H 8 0 H ××H 0FF0A8H ××H ××H SP → ××H 0FF0A9H ××H ××H ××H 0FF0AAH
××H ××H 13.字节扩展指令和字扩展指令用在什么场合?举例说明。 答:用在除法运算中,对带符号数的被除数进行扩展;
例如:当被除数在AX中,除数在BX中时
CDW
IDIV BX
14.写出执行以下计算的指令系列。其中X、Y、Z、R、W均为存放16位带符号数单元的地址。
(1)Z ← W +(Z-X) 答:指令系列如下
MOV AX,Z SUB AX,X ADD AX,W MOV Z,AX
(2)Z ← W -(X+6)-(R-9) 答:指令系列如下
ADD X,6 SUB R,9 MOV AX,W SUB AX,X SUB AX,R MOV Z,AX
(3)Z ←(W×X)/(Y+6),R ← 余数 答:指令系列如下
MOV AX,W IMUL X
MOV BX,Y ADD BX,6 IDIV BX MOV R,DX
(4)Z ←((W-X)/ 5×Y)× 2 答:指令系列如下
MOV AX,W SUB AX,X CDW IDIV 5 IMUL Y IMUL 2
ADD DX,CF MOV Z,AX
15.写出完成以下操作的程序段。假设各变量的值均为用压缩BCD码表示的二位十进制数 (1)U ← V+(S-6) 答:程序如下