第 3章 指令系统
3-4判断下述8086/8088指令的写法是否正确。
(1) MOV [AX], BH (3) MOV [SP], AX (5) OUT 10H, CL (7) PUSH AL
(9) MOV ES:[SI], DI 答:
(1) MOV [AX], BH (2) MOV [BP], AX
( 错 ) (对) ( 错 )
原因:AX不能用作寄存器间接寻址中的寄存器。 只能用BX,BP,SI,DI. (3) MOV [SP], AX
(2) MOV [BP], AX (4) MOV [DI], [SI] (6) INC WORD PTR [SI] (8) CMP 36H, AL
(10) MOV BYTE PTR [BX], 800
原因: SP不能用作寄存器间接寻址中的寄存器。 只能用BX,BP,SI,DI.
(4) MOV [DI], [SI] ( 错 )
原因: 8086/8088没有将存储器中的操作数传送到另一个存储单元的寻址方式。
(5) OUT 10H, CL
( 错 )
原因: 8086/8088的输入/输出指令只能用累加器AL或AX。 (6) INC WORD PTR [SI] (对) (7) PUSH AL ( 错 ) 原因:堆栈指令的操作数为16位。 (8) CMP 36H, AL ( 错 ) 原因:目的操作数不能为立即数。 (9) MOV ES:[SI], DI (对)
(10) MaV BYTE PTR [BX], 800 ( 错 )
原因:源操作数(立即数) 800大于一个字节(目的操作数位于字节存储单元中〉。 3-5设有关寄存器及存储单元的内容如下: DS=2000H, BX=0100H, AX=1200H, SI=0002H, [20102H]=33H, [20103]=44H, [21200]=9BH,
[21201H]=99H, [21202H]=0AAH, [21203H]=88H。 问:下列各条指令单独执行后相关寄存器或存储单元的内容为多少?
(1) MOV AX, 1800H (2) MOV AX, BX
(3) MOV BX, [1200H] (4) MOV DX, [BX+1100H] (5) MOV [BX+SI], AL (5) MOV AX, [BX+SI+1100H] 答.
(1) (AX)=1800H (2) (AX)=(BX)=0100H (3) (BX)=999BH (4)(DX)=999BH
(5) [20102H] = AL =00H (6) (AX)=88AAH
1
一、习题 1.选择题
3-1下列寄存器组中在段内寻址时可以提供偏移地址的寄存器组是 。 A. AX, BX, CX, DX B. BX, BP, S1, D1 I C. SP, 1P, BP, DX I D. CS, DS, ES,SS
3-2循环指令LOOPNZ终止循环的条件是 。 A. CX=0且ZF=0 B. CX=0或ZF=1 C.CX≠0且ZF=0 D.CX≠0或ZF=1
3-3执行INC指令除对町、ZF有影响外,还要影响的标志位是 。 A. OF, AF, PF B. OF, AF, CF c. OF, PF, CF D. AF, PF, CF
3-4设DH=10H,执行NEG DH指令后,正确的结果是 。 A. DH =l0H, CF=1 B. DH=10H, CF=0 C DH=10H, CF=0 D. DH=0F0H
3-5下面指令执行后,改变AL寄存器内容的指令是 。 A. TEST AL, 02H B. OR AL, AL C. CMP AL, BL D. AND AL, CL
3-6下面几条乘法指令中,错误的是 。 A.MUL BX B.MUL AL C.MUL 1000
D.MUL BYTE PTR[DI]
3-7若VAR是己经定义的变量,下面几条除法指令中,正确的是 。 A.DIY VAR B.DIV [BX+SI] C.DIV [10+SI+BX] D.DIY [DI]
3-8下列每组两条指令,具有相同功能的是 A.NOT AX B.NOT AX C NEG AX
XOR AX, 0 XOR AX,OFFFFH XOR AX, 0
2
D. NEG AX A.带符号数乘2 B.带符号数除2 C.无符号数乘2 D.无符号数除2
XOR AX,OFFFFH
3-9逻辑移位指令SHR可在一定范围内用于 。
3-10算术移位指令SAR可在一定范围内用于 。 A.原码数除以2 B.带符号数除以2 C.补码数除以2 D.无符号数除以2
2.填空题
3-11唯一不能用于乘法指令源操作数的寻址方式是 。
3-12对于指令MOV AX, [BP],默认的源操作数所在的段是 。
3-13 8位带符号数扩展为16位带符号数的指令CBW的源操作数默认是在寄存器 。 3-14如果AX中存放的是负数的补码,执行指令CWD后,寄存器DX 的内容将是 。 3-15汇编程序会对指令MOV [SI], 1000报错,维持原有指令功能不变,修改后正确的指令应该是 。
3-16若(AL)=04H, (BL)=OFFH,执行指令MUL BL后,标志OF= , CF= . 3-18条件转移指令JE测试的条件是 。
3-19条件转移指令JG一般应该在一条 指令后面直接使用,才会正确地实现条件转移。 3-20若(DS)=2000H, [21000H] = 56H, [21001H] =78H,执行指令MOV AX, [1000]后,寄存器AX的内容是 。
3.判断题
3-21指令MOV SI, [AX]的源操作数的寻址方式是寄存器间接寻址。 ( )
3-22当NEG 指令的操作数是一个用补码表示的负数时,指令执行后达 到这个负数的绝对值。( ) 3-23如果SUB01是另一个代码段的一个标号,用指令JMP SUB01就 可以实现段间直接转移。( ) 3-24若VARI己经定义为一个变量,指令LEA BX,VARl[SI]将VARI的值加上SI后传送给BX。( ) 3-25 SP是堆栈指针,应该随时指向堆栈的栈顶。所以,用MOV指令来改变SP的值在汇编的时候会
报告语法错误。( )
3-26奇偶标志PF是根据运算结果中\的数目来决定标志的值:如果 \的数目是偶数,PF=l( ) 3-27 MUL [SI]是有错误的指令,但是PUSH [SI]却是没有错误的指令。( )
3-28 重复因子和字符串操作指令结合使用,如REP MOVSW,每执行一次这样的指令,数据长度计
数的CX寄存器内容仍然是减1,而不是减2。( )
3-29字符串操作指令,如MOVSW,每执行一次,指针SI和DI就会自动加2,或者减2。 ( ) 3-30变址寻址(有的书上称为寄存器相对寻址〉中所使用的偏移量是一个带符号数,也就是说,偏移量本身就是可正可负的。( ) 4.简答和编程题
E. 3-31判断下列指令是否正确,若有错,指出错误所在,其中VAR1为字 变量, TALI为标号。
3
(1) MOV CS, [3202H] (3) MOV DS, SEG VARI (5) LEA AX, OFFSET VARI (7)JMP TALI[SI] (9) IN
AL, DX
(2) XCHG AX,1234H (4) ADD AL, [BX+BP+10] (6) OUT 7EH, AX (10)MUL AL, CL
(8) JE VARI
3-32己知(DS)=2F00H, (ES)=9FOOH, (SS)=5A80H, (BX)=0800H,(BP)=0040H。计算下列指令源操作数的物理地址,并指出寻址方式。
(1) MOV AX, [BP+6] (2) ADD AX, ES:[BX]
3-35当指令SUB AX,CX 执行后CF =1,试说明最高有效位发生了什么现象? 3-36己知(AX) =0FF60H, CF =0,执行下述指令序列后, (AX) =? CF =?
MOV DX, 96 XOR DH, OFFH SBB AX, DX
3-37设寄存器 AL、BL、CL中内容均为76H,执行下述指令序列后, (AL) = ? (BL) = ? (CL) = ?
XOR AL, 0FH AND BL, 0FH OR CL, 0FH 3-38试编写一个程序片断,计算两个非压缩十进制数7与4的乘法操作。 3-39设AX、BX、CX中的数是带符号数,下列程序求AX、BX、CX中
的最小值,结果放在AX中,请将程序填写完整。
CMP AX, BX
(1) JLE NEXT
XCHG AX, BX
NEXT: CMP CX, AX
(2) JGE EXIT XCHG AX, CX
EXIT: NOP
3-42测试AL寄存器的D5和D0位,若同时为0,程序转向L1去将AL置1;否则将AL清0,同时清CF和OF标志。试写出程序段。
二、习题解答 1.选择题
3-1答案:B
说明: BX和BP也称为基址寄存器, SI和DI也称为变址寄存器。 3-2答案:B
说明: LOOPNZ指令继续执行的条件是两个: CX≠0和ZF=0,终止执行则只要两个条件中的-个就可以。 3-3答案:A
说明: INC指令不影响CF标志, DEC指令也是。 3-4答案:D
说明: NEG指令称为求补指令,但不是求补码的指令。10H是正数,也要用0去减,减完以后的CF一般总
4
是1。 3-5答案:D
说明: TEST指令和CMP指令都不改变目的操作数。选项B是AL本身的或运算,也不会改变AL,只有选项D正确。 3-6答案:C
说明:立即数不能作为乘法指令的操作数。乘法运算要根据操作数来决定是做8位乘法还是16位乘法。系统认为立即数不能提供这样的信息,所以不能 作为乘法指令的操作数。
3-7答案:A
说明:存储器操作数可以作为除法指令的操作数。但是选项B、C、D都没有明确操作数的位数是8位还是16位,是不正确的,只有选项A正确,因为在定义变量的时候一定会明确它的位数。 3-8答案:B
说明:两条指令都可以完成对AX内容的按位求反操作。 3-9答案:D
说明:一般来说,右移1位相当于操作数除以2,SHR的逻辑移位,右移后最高位添0,只能是对无符号数有除2的功能。 3-10答案:C
说明:算术移位指令在右移移位后,最高位按原来的符号位来填充:负数还是负数,正数还是正数。但是,不能说算术右移1位对带符号数除以2,因为带符号数可以有3种编码方式。如果采用原码,就不是除以2了。所以,只有答案C是正确的。 2.填空题
3-11答案:立即寻址
说明:因为立即数不可以作为乘法指令的操作数。
3-12答案:堆栈段
说明:用BP间接寻址时,段寄存器默认是SS,源操作数在堆栈段。 3-13答案: AL
说明:这是CBW指令默认的源操作数。 3-14答案: OFFFFH,或者答\全1\
说明: CWD也是对带符号数的扩展指令, 16位负数扩展到32位时,高16位都是1。 3一15答案: MOV WORD PTR[SI], 1000
说明:要说明存储器操作数的位数。现在只能是16位,因为十进制数1000 的二进制数要用16位。
3一16答案: 1; 1
说明: MuL是无符号数乘法指令,无符号数04H和0FFH相乘一定超过8位。乘法运算后,标志OF和CF都等于1,表示高位积不等于0。
3-18答案: ZF=l
说明:JE是相等就转移的条件转移指令。测试的条件就是ZF是不是等于1。 3-19答案: CMP指令或者比较指令
说明:比较指令会保留比较后的标志, JG指令实际上就是根据这些标志来决定是不是要转移的。回答\逻辑运算指令\也可以算对,但是,实际的编程时,都是使用比较指令的,会有更好的可读性。
3-20答案: 7856H
说明: 16位数传送时,存储器高地址字节内容存放到寄存器的高8位,低地址字节内容存放到寄存器的低8位。
5