相对基址变址寻址;I/O端口指令IN和OUT使用的端口寻址方式有直接寻址和间接寻址。 2. 设(DS)=2000H,(ES)= 2100H,(SS)= 1500H,(SI)= 00A0H,(BX)= 0100H,(BP)= 0010H,
数据变量VAL的偏移地址为0050H,请指出下列指令的源操作数字段是什么寻址方式?它的物理地址是多少?
(1) MOV AX,21H (2) MOV AX,BX (3) MOV AX,[1000H] (4) MOV AX,VAL (5) MOV AX,[BX] (6) MOV AX,ES:[BX] (7) MOV AX,[BP] (8) MOV AX,[SI] (9) MOV AX,[BX+10] (10) MOV AX,VAL[BX]
(11) MOV AX,[BX][SI] (12) MOV AX,VAL[BX][SI] 解:(1)MOV AX,21H
立即寻址,源操作数直接放在指令中 (2)MOV AX,BX
寄存器寻址,源操作数放在寄存器BX中 (3)MOV AX,[1000H]
直接寻址,EA = 1000H,PA =(DS)×10H+EA = 2000H×10H+1000H = 21000H (4)MOV AX,VAL 直接寻址,EA = [VAL] = 0050H,PA =(DS)×10H+EA = 2000H×10H+0050H = 20050H (5)MOV AX,[BX]
寄存器间接寻址,EA =(BX)= 0100H,PA =(DS)×10H+EA = 2000H×10H+0100H = 20100H
(6)MOV AX,ES:[BX]
寄存器间接寻址,EA =(BX)= 0100H,PA =(ES)×10H+EA = 2100H×10H+0100H = 21100H
(7)MOV AX,[BP]
寄存器间接寻址,EA =(BP)= 0010H,PA =(SS)×10H+EA = 1500H×10H+0010H = 15010H
(8)MOV AX,[SI]
寄存器间接寻址,EA =(SI)= 00A0H,PA =(DS)×10H+EA = 2000H×10H+00A0H = 200A0H
(9)MOV AX,[BX+10]
寄存器相对寻址,EA =(BX)+10D = 0100H+000AH= 010AH,PA =(DS)×10H+EA = 2000H×10H+010AH = 2010AH (10)MOV AX,VAL[BX]
寄存器相对寻址,EA =(BX)+[VAL]= 0100H+0050H= 0150H,PA =(DS)×10H+EA = 2000H×10H+0150H = 20150H (11)MOV AX,[BX][SI]
第 6 页 共 27 页
基址变址寻址,EA = (BX)+(SI)= 0100H+00A0H = 01A0H,PA = (DS)×10H+EA = 2000H×10H+01A0H = 201A0H (12)MOV AX,VAL[BX][SI]
基址变址相对寻址,EA = (BX)+(SI)+[VAL]= 0100H+00A0H+0050H = 01F0H,PA =(DS)×10H+EA = 2000H×10H+01F0H = 201F0H
3. 给定寄存器及存储单元的内容为:(DS) = 2000H,(BX) = 0100H,(SI) = 0002H,(20100) =32H,(20101)=51H,(20102) =26H,(20103)= 83H,(21200)=1AH,(21201)=B6H,(21202)=D1H,(21203)=29H。试说明下列各条指令执行完后,AX寄存器中保存的内容是什么。
(1) MOV AX,1200H (2) MOV AX,BX (3) MOV AX,[1200H] (4) MOV AX,[BX] (5) MOV AX,1100H[BX] (6) MOV AX,[BX][SI] 解:(1)MOV AX,1200H 执行后,(AX)= 1200H (2)MOV AX,BX 执行后,(AX)= (BX)= 0100H (3)MOV AX,[1200H] 直接寻址,EA = [VAL] = 1200H,PA =(DS)×10H+EA = 2000H×10H+1200H = 21200H,执行后,(AX)= B61AH (4)MOV AX,[BX]
EA = (BX)= 0100H,PA =(DS)×10H+EA = 2000H×10H+0100H = 20100H,执行后,(AX)= 5132H
(5)MOV AX,1100H[BX]
EA =(BX)+1100H = 0100H+1100H = 1200H,PA =(DS)×10H+EA = 2000H×10H+1200H = 21200H,执行后,(AX)= B61AH (6)MOV AX,[BX][SI]
EA =(BX)+(SI)= 0100H+0002H = 0102H,PA =(DS)×10H+EA = 2000H×10H+0102H = 20102H,执行后,(AX)= 29D1H
4. 试说明指令MOV BX,10H[BX]与指令LEA BX,10H[BX]的区别。
答:前者是数据传送类指令,表示将数据段中以(BX+10H)为偏移地址的16位数据送寄存器BX.;后者是取偏移地址指令,执行的结果是(BX)= (BX)+10H,即操作数的偏移地址为(BX)+10H。
5. 假设(DS)=3000H,(CS)=1000H,(IP)=1500H,(BX)=1000H,位移量大DATA=50H
(31000H)=1250H,(31050H)=2400H,(31052H)=6000H。确定下列转移指令的转移地址。 (1)JMP 2500H (2) JMP BX
(3)JMP WORD PTR[BX] (4) JMP DWORD PTR[BX+DATA] 解:(1)JMP 2500H
第 7 页 共 27 页
(IP)=2500H (2) JMP BX
(IP)=(BX)=1000H (3)JMP WORD PTR[BX]
物理地址=(DS)*10H+(BX)=3000H*10H+1000H=31000H,所以(IP)=1250H
(4) JMP DWORD PTR[BX+DATA] 物理地址=(DS)*10H+(BX)+(DATA)=3000H*10H+1000H+50H=31050H,所以(IP)=2400H 6. 设堆栈指针SP的初值为2500H, (AX)=1234H,(BX)=5678H。执行指令PUSH AX后,
(SP)=?,再执行指令PUSH BX及POP AX之后,(SP)=? (AX)=? (BX)=? 解:堆栈指针SP总是指向栈顶,每执行一次PUSH指令SP-2,执行一次POP指令SP+2.所以,执行PUSH AX指令后,(SP)=24FEH;再执行PUSH BX及POP AX后,(SP)=24FEH,(AX)=(BX)=5678H
7. 分析下列指令的正误,对于错误的指令要说明原因并加以改正。 (1) MOV AH,BX (2) MOV [BX],[SI]
(3) MOV AX,[SI][DI] (4) MOV MYDAT[BX][SI],ES:AX (5) MOV BYTE PTR[BX],1000 (6) MOV BX,OFFSET MAYDAT[SI] (7) MOV CS,AX (8) MOV DS,BP 解:(1) MOV AH,BX
错误,寄存器类型不匹配,可改为MOV AX,BX (2) MOV [BX],[SI]
错误,两个操作数不能都为存储单元,可改为MOV BX,[SI]或MOV [BX],SI (3) MOV AX,[SI][DI]
错误,寻址方式中只能出现一个变址寄存器,可改为MOV AX,[BX][DI]。 (4) MOV MYDAT[BX][SI],ES:AX
错误,AX前不能有段跨越前缀,去掉ES:,改为MOV MYDAT[BX][SI],AX (5) MOV BYTE PTR[BX],1000 错误,1000超出字节空间存储范围 (6) MOV BX,OFFSET MAYDAT[SI] 正确
(7) MOV CS,AX
错误,MOV指令CS不能做目的操作数,可改为MOV DS,AX (8) MOV DS,BP 正确
注:本题错误改正部分有的答案并不唯一,可参考原题题意改成合法形式。 8. 设VAR1、VAR2为字变量,LAB为标号,分析下列指令的错误之处并加以改正。 (1) ADD VAR1,VAR2 (2) MOV AL,VAR2 (3) SUB AL,VAR1 (4) JMP LAB[SI]
第 8 页 共 27 页
(5) JNZ VAR1
解:(1) ADD VAR1,VAR2
错误,两个操作数不能都为存储单元,可改为 MOV BX,VAR2 ADD VAR1,BX
(2) MOV AL,VAR2
错误,数据类型不匹配,可改为MOV AX,VAR2 (3) SUB AL,VAR1
错误,数据类型不匹配,可改为SUB AX,VAR1 (4) JMP LAB[SI]
错误,寄存器相对寻址形式中不能用标号做位移量,可改为JMP VAR1[SI] (5) JNZ VAR1
错误,条件跳转指令只能进行段内短跳转,所以后面只能跟短标号。可改为JNZ LAB (6) JMP NEAR LAB
错误,缺少运算符PTR,可改为JMP NEAR PTR LAB
注:本题错误改正部分有的答案并不唯一,可参考原题题意改成合法形式。
9. 已知 (AL)=6CH, (BL)=0A9H,试问执行指令ADD AL,BL后,AF、CF、OF、PF、SF、和
ZF的值各为多少?
解:指令ADD AL,BL的功能为AL+BL→AL,其运算过程如下:
6CHA9H 115H
由以上运算可知,
低4位向高4位有进位,所以AF=1; 最高位产生了进位,所以CF=1;
该运算是一个正数加一个负数,所以不会产生溢出,所以OF=0;只有正数+正数=负数,或者负数+负数=正数时,才可能产生溢出现象;
该运算结果的低8位为0001 0101,含有奇数个1,所以PF=0; 该运算结果的最高位为符号位,为0,所以SF=0; 当前的运算结果不为零,所以ZF=0。 10.试判断下列程序执行后,(BX)=的内容。
MOV CL,5 MOV BX,01C9H ROL BX,1 RCR BX,CL
解:该程序段是首先将BX内容不带进位循环左移1位,再循环右移5位。即相当于将原BX内容不带进位循环右移4位
第 9 页 共 27 页
01C9H=0000 0001 1100 1001B
程序执行后,为1001 0000 0001 1100B 故结果为901CH
11.写出能够完成下列操作的8086CPU指令。 (1) 把4629H传送给AX寄存器; (2) 从AX寄存器中减去3218H; (3) 把BUF的偏移地址送入BX中。
12.根据以下要求写出相应的汇编语言指令。
(1) 把BX和DX寄存器的内容相加,结果存入DX寄存器中;
(2) 用BX和SI的基址变址寻址方式,把存储器中的一个字节与AL内容相加,并保存在AL寄存器中;
(3) 用寄存器BX和位移量21B5H的变址寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器单元中;
(4) 用位移量2158H的直接寻址方式把存储器中的一个字与数3160H相加,并把结果送回该存储器中;
(5) 把数25H与(AL)相加,结果送回寄存器AL中。 13.按下列要求写出相应的指令或程序段。 (1)使BL寄存器中的高、低四位互换; (2)屏蔽AX寄存器中的b10和b5位;
(3)分别测试AX寄存器中b13和b2位是否为1。
14.执行以下两条指令后,标志寄存器FLAGS的六个状态为各为何值?
MOV AX,95C8H ADD AX,8379H
解:指令的功能为95C8H+8739H→AL,其运算过程如下:
95C8H
8379H
11941H 由以上运算可知,
低4位向高4位有进位,所以AF=1; 最高位产生了进位,所以CF=1;
该运算是两个负数相加结果为正数,产生溢出,所以OF=1; 该运算结果的低8位为0100 0001,含有偶数个1,所以PF=1; 该运算结果的最高位为符号位,为0,所以SF=0; 当前的运算结果不为零,所以ZF=0。
第 10 页 共 27 页