习题三 8086指令系统
主要内容: 8086指令系统。主要介绍8086的基本数据类型、寻址方式和指令系统,重点掌握8086指令系统的寻址方式、堆栈操作指令、算术运算指令及其对标志位的影响,串操作指令,控制传送指令。3.1
下面这些指令哪些是正确的?哪些是错误的?如是错误的,请说明原因。
XCHG CS,AX (?) MOV [BX],[1000] (?) PUSH CS (?) POP CS (?)
IN BX,DX (?)
3.2 设DS=2100H,SS=5200H,BX=1400H,BP=6200H,说明下面两条指令所进行的具体操作: MOV WORD PTR [BP], 2000 MOV WORD PTR [BX], 2000
3.3 设当前SS=2010H,SP=FE00H,BX=3457H,计算当前栈顶的地址为多少?当执行PUSH BX 指令后,栈
顶地址和栈顶2个字节的内容分别是什么?
【答】当前栈顶指针(SP)=2FF00H,物理地址=20100H+FE00H=2FF00H
当执行PUSH BX 指令后,栈顶指针(SP)=FE00-2=FDFEH,栈顶物理地址=2FDFEH,栈顶2个字节的内容分别57H,34H。
3.4 已知(DS)= 091DH,(SS)= IE4AH,(AX)= 1234H,(BX)= 0024H,(CX)= 5678H, (BP)= 0024H,(SI)= 0012H,(DI)= 0032H,[09226] = 00F6H,[09228]=1E40H, [lE4F6]=091DH,试求单独执行下列指令后的结果? (l)
MOV
CL ,20H [BX][SI];
【答】由于源操作数有效地址EA=20H+0024H+0012H=0056H,
其物理地址PA=DS*16+EA=091DH*16+56H=09226H, 因此(CL)= F6H
(2)
MOV
[BP][DI],CX;
【答】由于目的操作数有效地址EA= 0024H+0032H=0056H,
目的操作数物理地址PA= SS*16+EA=1E4A0H+0056H=1E4F6H, 因此[1E4F6]=5678H
(3)
LEA MOV
BX ,20H[BX][SI] AX ,2[BX]
【答】第一条指令:源操作数物理地址PA=091D0H+(20+0024H+0012H)=09226H,因此(BX)=0056H
第二条指令:源操作数物理地址PA=091D0H+(2+0056)=09928H, 因此(AX)=1E40H
(4)
LDS MOV
SI ,[BX][DI]
[SI],BX
【答】第一条指令: 源操作数物理地址PA=091D0H+(0024H+0032H)=09226H
因此(SI)= 00F6H, (DS)=1E40H
第一条指令:目的操作数物理地址PA=1E400H+00F6H=1E4F6H 因此1E4F6H单元的内容为0024H, 即[1E4F6H]=0024H (5) 3.5
XCHG XCHG
CX,32H[BX] 20[BX][SI] ,AX
【答】同理可得:(CX)= 00F6H(AX)= 00F6H, [ 09226H]= 1234H
单选题:
MOV AL,82H CBW
A、 AX=0FF82H
B、AX=8082H
C、AX=0082H
D、AX=0F82H
(1)执行下面指令序列后,结果是( )。
【答】A
(2)与MOV BX,OFFSET VAR指令完全等效的指令是( )。
A、MOV C、LES
BX,VAR BX,VAR
B、LDS BX,VAR D、LEA BX,VAR
【答】D
(3)编写分支程序,在进行条件判断前,可用指令构成条件,其中不能形成条件的指令有
( )。
A、 CMP
B、SUB
C、AND
D、MOV
【答】D
(4)下面指令执行后,改变AL寄存器内容的指令是( )。
A、TEST AL,02H C、CMP AL,B
B、OR AL,AL D、AND AL,BL
【答】D
(5)设DH=10H,执行NEG DH指令后,正确的结果是( )。
A、DH=10H CF=1 C、DH=10H CF=0
B、DH=0F0H CF=0 D、DH=0F0H CF=1
【答】D
(6)设DS=8225H,DI=3942H,指令NEG BYTE PTR[DI]操作数的物理地址是( )。
A、85B92H
B、86192H
C、BB690H
D、12169H
【答】A
(7)检查BUF的内容是否为正偶数,如是正偶数,则0TAL。下面程序段正确的是( )。
A、
MOV JS SHR JNC MOV MOV AND JNZ MOV MOV TEST JNZ MOV MOV JNP TEST JNZ MOV
AL,BUF K1 AL,1 K1 AL,0 AL,BUF AL,11 K2 AL,0 AL,BUF AL,81H K3 AL,0 AL,BUF K4 AL,80H K4 AL,0
K1:
……
B、
K2:……
C、
K3:……
D、
K4:……
【答】C
(8)下列指令中,执行速度最快的是( )。
A、 MOV AX,100 B、 C、 MOV AX,BX D、
MOV AX,[BX] MOV AX,[BX+BP]
【答】C
3.6 8086 CPU执行如下指令后
MOV AL,01100100B SUB AL,58H DAS
;(AL)=0CH,AF=1,CF=0 ;(AL)=06 ,AF=1,CF=0
【答】 首先用TD调试验证上面的结果;自己定义两个数据,重新验证,写出结果。
3.7 设(IP)= 3D8F H,(CS)= 4050H,(SP)= 0F17C H,当执行CALL 2000:0094H后,试求出 IP、CS、
SP、[SP]、[SP+1][SP+2] 和[SP+3]的内容? 【答】(IP)=0094H ,( CS)=2000H ,(SP)=F178H
[SP]=8FH , [SP+1]=3DH , [SP+2]=50H, [SP+3]=40H, [SP+3]=40H
3.8 设(DS)= 2000H,(BX)= 1256H,(SI)= 528FH,TABLE的偏移量= 20A1H,[232F7H]=3280H,[ 264E5H]
= 2450H,执行下述指令
(1)JMP BX ;IP= 1256H (2)JMP TABLE[BX] ;IP= 3280H
(3)JMP [BX][SI] ;IP= 2450H 3.9 分别用一条语句实现下述指明的功能 (1)栈顶内容弹出送字变量DI。 ( POP DI ) (2)双字变量AYD存放的地址指针送ES和SI。 ( LES SI ,AYD ) (3)不允许中断即关中断。 ( CLI ) (4)子程序返回调用程序。 ( RET ) (5)AX的内容加1,要求不影响CF。 ( INC AX )
(6)BX的内容加1,要求影响所有标志位。 ( ADD BX, 1 ) (7)若操作结果为零转向标号GOON。 ( JZ GOON ) 3.10 8086/8088用什么途径来更新CS和IP的值?
【答】执行CALL、JMP、INT指令,可以改变CS和IP中的值,即改变程序走向。 3.11 8086状态标志寄存器中,作为控制用的标志位有( 3 )个,其中,不可用指令操作的是(DF、 IF、 TF)
3.12 字节扩展指令和字扩展指令用在什么场合?举例说明。
【答】需要对带符号数字节扩展为字时,要预先执行CBW指令。需要对带符号数字扩展为双字时,要预先执行CWD。
例:求-503/267=?,将商存1000H单元.
MOV AX,-503 MOV BX,267 CWD IDIV
MOV [1000H],AX HLT
3.13 以下是格雷码的编码表
0——0000 ,1——0001 ,2——0011, 3——0010, 4——0110 5——0111 ,6——0101, 7——0100, 8——1100, 9——1101 请用换码指令和其他指令设计一个程序段,实现格雷码往ASCII的转换。 【答】
格雷码 0000 0001 ASCII码 30H 31H 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 TABLE SEGMENT
33H 32H 37H 36H 34H 35H 0 0 0 0 38H 39H TAB_DA DB 30H,31H,33H,32H,37H,36H,34H,35H,0,0
DB 0,0,38H,39H
GRA DB 05H ASCII_DA DB ? TABLE ENDS CODE
SEGMENT
ASSUME CS:CODE,DS:TABLE START: MOV MOV MOV MOV
XLAT
MOV ASCII_DA,AL
CODE
ENDS END START
3.14 设当前的SP=1000H,执行PUSHF指令后,SP=(0FFE H),若改为执行INT 20H指令后,则SP=( 0FFA
H)。
【答】执行PUSHF指令后,SP=(0FFE H)。执行INT 20H指令后,则SP=( 0FFA H)。
3.15 HLT指令用在什么场合?如CPU 在执行HLT 指令时遇到硬件中断并返回后,以下应执行哪条指令? 【答】HLT用在使CPU处于暂停状态而等待硬件中断的场合。
在执行HLT指令遇到硬件中断并返回后将执行HLT后面的一条指令。
3.16 为什么用増量指令或减量指令设计程序时,在这类指令后面不用进位标志作为判断依据? 【答】増量指令或减量指令不影响进位标志CF。
3.17 用普通运算指令执行BCD码运算时,为什么要进行十进制调整?具体讲,在进行BCD码的加、减、乘、
除运算时,程序段的什么位置必须加上十进制调整指令?
【答】在BCD码中,采用4位二进制数对一个十进制数的编码,只允许0-9这10个数字出现,但CPU运算
结果一般会超过此范围,因此要进行十进制调整。进行加、减法或乘法运算时,调整指令必须紧跟在算术指令后面,在进行除法运算时,调整指令放在除法指令之前。
3.18 中断指令执行时,堆栈的内容有什么变化?中断处理子程序的人口地址是怎样得到的?
【答】中断指令执行时,堆栈内容变化如下:标志寄存器被推入堆栈,且SP减2,然后CPU将主程序的下一
条指令地址即断点地址推入堆栈,即段值CS推入堆栈且SP减2,偏移量推入堆栈,且SP减2。中断处理
AX,TABLE DS,AX
BX,OFFSET TAB_DA AL,GRA
子程序的入口地址即中断向量,对应的中断类型号的4倍即为中断向量地址,在该地址处的4个字节内容,高地址单元两个字节为中断入口地址的段地址,低地址单元两个字节为中断入口地址的偏移地址。 3.19 中断返回指令IRET和普通子程序返回指令RET 在执行时,具体操作内容什么不同?
【答】IRET从堆栈中依次弹出断点处指令指针IP、代码段CS内容与标志寄存器的值,而RET从堆栈中依次弹出断点处指令指针IP值、代码段CS内容,不需要弹出标志寄存器的值。
3.20 将存放在0A00H单元和0A02H单元的两个无符号数相乘,结果存放在地址为0A04H开始的单元中。 【答】参考程序:
MOV MOV MUL MOV
【答】参考程序:
MOV AND MOV SHL AND OR
【答】参考程序:
MOV AND MOV
AL, [0400H] AL, 0F0H [0400H], AL
BH BX, AX BX , 8000H CL, 4 AX, CL AX,7FFFH AX, BX AL,[0A00H] BL,[0A02H] BL [0A04],AX
3.21 编程序将AX中数,最高位保持不变,其余全部左移4位。
3.22 将0400H单元中的数,低4位置零,高4位保持不变。
3.23 将BX中的数,对高位字节求反,低位字节保持不变。 【答】参考程序:NOT 【答】参考程序:
TEST JZ MOV HLT
ZERO:
MOV HLT
3.25 利用字串操作指令,将1000H~10FFH单元全部清零。 【答】参考程序:
CLD MOV MOV MOV REP
【答】参考程序:
CLD
DI,1000H CX,100H AL,0 STOSB AL,0
BX,0010 0000 0000 0000B ZERO AL,01H
3.24 检测Bx中第13位(D13),为0时,把AL置0,为1时,把AL置1。
3.26 从1000H开始,存放有200个字节,要查出字符#(ASCII码为23H), 把存放第一个#的单元地址送入BX中。
MOV MOV MOV MOV JZ
FOUND: DEC
MOV
NOFOUND: HLT
DI,1000H CX,200 DX,CX AL,23H FOUND DI BX,DI
REPNZ SCASB JMP NOFOUND
3.27 编程计算((X+Y)*10)+Z)/X,X、Y、Z都是16位无符号数,结果存在RESULT开始的单元。 【答】参考程序:
MOV ADD MOV MUL ADD ADC MOV DIV MOV MOV HLT
3.28 用简单指令编程求-3/2=?,将商存DL,余数存DH单元。用TD调试后,写出DL,DH的内容。 【答】参考程序:
MOV CBW MOV IDIV MOV MOV HLT
BL,2 BL DL,AL DH,AH
AL,-3 AX,X AX,Y BX,0AH BX AX,Z DX,0H BX,X BX RESULT,AX RESULT+2,DX