3.3 80x86指令系统
3.3 .1 数据传送指令
1.通用传送指令
(1)MOV 指令
格式: MOV DST,SRC
功能:将源操作数SRC的内容送到目的操作数DST中去。
(2)MOVSX带符号扩展传送指令(386以后)
格式: MOVSX DST,SRC
功能: (DST)符合扩展(SRC)
(3)MOVZX带零扩展传送指令(386以后)
格式: MOVZX DST,SRC
功能: (DST)零扩展(SRC)
例3.25 MOVZX DX, AL;816
例3.26 MOVZX EAX, DATA;1632
(4)PUSH进栈指令
格式: PUSH SRC
功能:16位指令:(SP)←(SP)—2
((SP)+1,(SP))← (SRC)
32位指令:(ESP)←(ESP)—4
((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(SRC)
(5)POP出栈指令
格式: POP DST
功能:16位指令:(DST)← ((SP)+1,(SP))
(SP)←(SP)+2
32位指令:(DST)((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) (ESP)(ESP)+4
(6)PUSHA/PUSHAD 所有寄存器进栈指令(286以后)
PUSHA:16位进栈次序AX,CX,DX,BX,指令执行前的SP,BP,SI,DI。执行后(SP)(SP)—16。
PUSHAD:32位进栈次序EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。执行后(ESP)(ESP)—32。
(7)POPA/POPAD 所有寄存器出栈指令(286以后)
POPA:16位出栈次序:DI,SI,BP,SP,BX,DX,CX,AX。
执行后(SP)(SP)+16。
POPAD:32位出栈次序:DI,SI,BP,SP,BX,DX,CX,AX。执行后(ESP)(ESP)+16。
(8)XCHG指令
格式: XCHG OPR1,OPR2
功能:完成OPR1操作数与OPR2操作数内容的交换。
不允许使用段寄存器和立即数。
例 XCHG BX,[BP+SI]
执行前 (BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H
执行后 (BX)=4154H,(2F246H)=6F30H
2.累加器专用传送指令
(1) IN输入指令
长格式: IN AL,PORT(字节);(AL)(PORT)
IN AX,PORT(字);(AX)(PORT+1,PORT)
IN EAX,PORT(双字);(EAX)(PORT+3…)
短格式: IN AL,(DX)(字节);(AL)(DX)
IN AX,(DX)(字);(AX)(DX+1,DX)
IN EAX,(DX)(双字);(EAX)(DX+3…)
(2) OUT输出指令
长格式: OUT PORT,AL(字节);(PORT)(AL)
OUT PORT,AX(字);(PORT+1,PORT)(AX)
OUT PORT,EAX(双字);(PORT+3…)(EAX)
例 IN AX,28H
MOV DATA-WORD,AX
例 MOV DX,3FCH
IN EAX,DX
例 OUT 5,AL
(3)XLAT 换码指令
格式:XLAT
功能:将AL与BX寄存器内容之和为偏移地址的存储单元内容送AL。
(AL)← ((BX)+(AL));16位
(AL)← ((EBX)+(AL));32位
例3.39 如(BX)=0040H,(AL)=0FH,(DS)=F000H,
(F004FH)=2CH
指令执行后 (AL)=2CH
3.地址传送指令
(1)LEA 指令
格式:LEA REG,SRC;(REG)SRC
功能:把源操作数的有效地址送到指定寄存器中。
例3.40 LEA BX, [BX+SI+0F62H]
如执行前(BX)=0400H,(SI)=003CH
指令执行后 (BX)=0040+003C+0F62=139EH
例3.41 LEA BX, LIST
MOV BX, OFFSET LIST
(2)LDS、LES、LFS、LGS和LSS指针送寄存器和段寄存器。
•LDS 指令
格式:LDS REG,SRC;(REG)(SRC)
(DS)(SRC+2)
功能:将SRC存储单元存放的4个字节送指定的寄存器和DS寄存器。
例3.42 LDS DI,[BX]
如执行前(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,
(0B080CH)=4000H
指令执行后 (DI)=05AEH,(DS)=4000H
4.标志寄存器传送指令
(1)LAHF标志送AH指令
格式: LAHF
功能:将标志寄存器的最右8位送AH寄存器。
(2) SAHF AH送标志寄存器指令
格式: SAHF
功能:将AH寄存器内容送标志寄存器的最右8位。
(3) PUSHF/PUSHFD 标志进栈指令
功能:
PUSHF:(SP)←(SP)—2
((SP)+1,(SP))←(FLAGS)
PUSHFD:(ESP)(ESP)—4
((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(FLAGS AND 0FCFFFFH)
(4) POPF/POPFD 标志出栈指令
功能:
PUSHF:(FLAGS)←((SP)+1,(SP))
(SP)←(SP)+2
PUSHFD:(FLAGS)((ESP)+3,(ESP)+2,(ESP)+1,(ESP))
(ESP)(ESP)+4
5. 类型转换指令
(1)CBW 字节转换为字指令
格式: CBW
功能:将AL的符号位扩充到AH中。
即若AL的符号位为0,则AH=00H
若AL的符号位为1,则AH=0FFH
(2)CWD/CWDE 字转换为双字指令
格式: CWD
功能:将AX的符号位扩充到DX中。
即若AX的符号位为0,则DX=0000H
若AX的符号位为1,则DX=0FFFFH
格式:CWDE(386以后)
功能:将AX的符号位扩充到EAX中,形成EAX的双字。
(3)CDQ 双字转换为4字节指令
格式:CDQ(386以后)
功能:将EAX的符号位扩充到EDX中,形成EDX:EAX的4字节。
(4)BSWAP 字节交换指令(386以后)
格式:BSWAP r32
功能:指令指定的32位寄存器的字节次序变反。
例3.44 BSWAP EAX
执行前 (EAX)=11223344H
执行后 (EAX)=44332211H
1. 与REP相匹配的指令
(1)重复操作前缀
格式:REP <串操作指令>
功能:1) 若CX=0 则退出REP操作,否则转2)执行
2) CX←CX—1
3) 执行REP 后面的<串操作指令>一次
4) 转回 1) 执行
说明:1)CLD 清除方向标志指令
格式:CLD
功能:DF←0,可使地址自动增加。
2)STD 设置方向标志指令
格式:STD
功能:DF←1,可使地址自动减少。
(2)MOVS 串传送指令
格式1:MOVSB ;字节操作
功能1: ES:(DI)←DS:(SI) ,
SI←SI ± 1 DI←DI ± 1
格式2:MOVSW ;字操作
功能2:ES:(DI)←DS:(SI) ,
SI←SI ± 2 DI←DI ± 2
例3.70 LEA SI,MESS1
LEA DI,MESS2
MOV CX,17
CLD
REP MOVSB
(3)STOS 存入串指令
格式1:STOSB ;字节操作
功能1:(DI)← AL , DI←DI ± 1
格式2:STOSW ;字操作
功能2:(DI) ←AX , DI←DI ± 2
例3.71 MOV AL,20H
LEA DI,MES
MOV CX,5
CLD
REP STOSB
(4)LODS 串读取指令
格式1:LODSB ;字节操作
功能1:AL← (SI) SI←SI ± 1
格式2:LODSW ;字操作
功能2:AX← (SI) SI←SI ± 2
2.与REPE/REPZ和REPNE/REPNZ相匹配的指令
(1)REPE/REPZ 相等(为0)时重复操作前缀
格式:REPE/RPEZ <串操作指令>
功能:1) 若(CX)=0或ZF=0 则退出REPE/REPZ操作,
否则转2)执行
2) (CX)← (CX)—1
3) 执行其后的串指令
4) 重复 1)~3)
(2)REPNE/REPNZ不相等(不为0)时重复操作前缀
格式:REPNE/RPENZ<串操作指令>
功能:1) 若(CX)=0或ZF=1 则退出REPNE/REPNZ操作,否则转2)执行
2) (CX) ←(CX)—1
3) 执行其后的串指令
4) 转回 1) 执行
使用注意:
1) 源串地址指针用SI,目的串地址指针用DI。
若使用重复前缀REP,要把串的长度存入CX寄存器中。
2) 根据实际情况确定合适的DF值,
增址方式置DF=0, 减址方式置DF=1。
3) 源串在数据段中,目的串在附加段中。
也可采用变通方式,即把源串和目的串定义在一个物理段内,把这个物理段定义为既是数据段,也是附加段。
(3)CMPS 串比较指令
格式1:CMPSB ;字节操作
功能1:(DI)—(SI) , SI←SI ± 1 , DI←DI ± 1
格式2:CMPSW ;字操作
功能2:(DI)—(SI) , SI←SI ± 2 , DI←DI ± 2
2)SCAS 串扫描指令
格式1:SCASB ;字节操作
功能1:AL—(DI) , DI←DI ± 1
格式2:SCASW ;字操作
功能2:AX—(DI) , DI←DI ± 2
例3.72 MOV AL,20H
LEA DI,MES ;(DI)=1500H,P83
MOV CX,11H
CLD
REPNZ SCASB ;(CX)=8,(DI)=1509H
例3.73 LEA SI,MES1;1500H
LEA DI,MES2;0200H
MOV CX,11H
CLD
REPE CMPSB
;(SI)=1505H,(DI)=0205H,(CX)=0CH,ZF=0。见P84
3.3.5 处理机控制指令与杂项操作指令
1. 标志处理指令
•CLC 进位位置0指令 CF←0
•CMC 进位位置0指令 CF←/CF
•STC 进位位置1指令 CF←1
•CLD 方向标志置0指令 DF←0
•STD 方向标志置1指令 DF←1
•CLI 中断标志置0指令 IF←0
•STI 中断标志置I指令 IF←1
2.其他处理机控制指令与杂项操作指令
•NOP 空操作指令
该指令不执行任何操作
•HLT 停机指令;CPU暂停工作
3.2.3 逻辑运算指令
1.逻辑运算指令
(1)AND 逻辑与指令
指令格式: AND DST,SRC;(DST)←(DST)∧(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“与”运算,且将结果送入目标操作数。
(2)OR 逻辑或指令
指令格式: OR DST,SRC;(DST)←(DST)∨(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“或”运算,且将结果送入目标操作数。
(3)NOT 逻辑非指令
指令格式: NOT OPR;(OPR)← /(OPR)
指令功能:将给定的操作数按位求反。
(4)XOR 逻辑异或指令
指令格式: XOR DST,SRC;(DST)←(DST)⊕(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“异或”运算,且将结果送入目标操作数。
(5)TEST 测试指令
指令格式: TEST OPR1,OPR2;(OPR1)∧(OPR2)
指令功能:将两个操作数按位进行逻辑“与”运算,但不保存结果,只根据特征设置状态位。
例3.57 MOV AL,0BFH
AND AL,0FCH ;屏蔽0、1位。
例3.58 MOV AL,43H
OR AL,20H ;第5位置1。
例3.59 MOV AL,40H
TEST AL,0AFH
;测试第0,1,2,3,5,7为0,ZF=1
例3.60 MOV DL,AL
NOT DL
TEST DL,00000100B
;测试AL第2位的值是否为1。
例3.61 MOV AL,11H
XOR 3 ;第0,1位变反。
例3.62 XOR AX,042EH
;测试AX=042EH?如ZF=1则 相等。
4.移位指令
(1)移位指令
1) SHL 逻辑左移指令
指令格式: SHL OPR,CNT
指令功能:把指定的操作数左移CNT位,每次最高位移入进位位CF,空出的最低位补0。8086 CPU CNT可以是1或CL。
2)SAL 算术左移指令
指令格式: SAL OPR,CNT
指令功能: 与SHL指令完全相同。
3)SHR 逻辑右移指令
指令格式: SHR OPR,CNT
指令功能:把指定的操作数右移CNT位,每次最低位移入进位位CF,空出的最高位补0。
4)SAR 算术右移指令
指令格式: SAR OPR,CNT
指令功能:把指定的操作数右移CNT位,每次最低位移入进位位CF,空出的最高位保持它原来的值。
(2)循环移位指令
1)ROL 循环左移指令
指令格式: ROL OPR,CNT
指令功能:把指定的操作数左环移CNT位,每次最高位移入进位位CF,其他位顺序左移一位,空出的最低位由原来的最高位填入。
2)ROR 循环右移指令
指令格式: ROR OPR,CNT
指令功能:把指定的操作数右环移CNT位,每次最低位移入进位位CF,其他位顺序右移一位,空出的最高位由原来的最低位填入。
3)RCL 带进位循环左移指令
指令格式: RCL OPR,CNT
指令功能:把指定的操作数连同进位位一起左环移CNT位,每次移位,CF移入操作数的最低位,操作数的最高位移入CF,其他位顺序左移一位。
4)RCR 带进位循环右移指令
指令格式: RCR OPR,CNT
指令功能:把指定的操作数连同进位位一起右环移CNT位,每次移位,CF移入操作数的最高位,操作数的最低位移入CF,其他位顺序右移一位。
例3.65 MOV CL,5
SAR [DI],CL
执行前 (DS)=0F800H,(DI)=180AH,
(0F980AH)=0064H
执行后 (0F980AH)=0003H,CF=0;100/32=3
例3.66 MOV CL,2
SHL SI,CL
执行前 (SI)=1450H
执行后 (SI)=5140H,CF=0;5200 *4=20800
例3.67 MOV CL,8
ROL AX,CL
ADD AX,BX
执行前 (AX)=0012H,(BX)=0034H
执行后 (AX)=1234H
3.3.2 算 术 指 令
1. 加法指令
(1)ADD加法指令
格式:ADD DST,SRC;(DST)←(SRC)+(DST)
功能:将源操作数和目标操作数作为两个二进制数相加,
并将结果送入目标操作数。
(2)ADC带进位加法指令
格式:ADC DST,SRC;(DST)←(SRC)+(DST)+CF
功能:将源操作数、目标操作数和进位标志CF的值相加后送目标操作数。
(3)INC加1指令
格式:INC OPR; (OPR)←(OPR)+1
功能:将除段寄存器以外任何寄存器或存储单元内容加1。
例3.45 ADD DX,0F0F0H
执行前 (DX)=4652H
执行后 (DX)=3742H,ZF=0,SF=0,CF=1,OF=0
例3.46 ADD AX,CX
ADC DX,BX
执行前 (DX)=0002H,(AX)=0F365H,
(BX)=0005H, (CX)=0E024H
执行后 (DX)=0008H,(AX)=0D389H
2. 减法指令
(1)SUB减法指令
格式:SUB DST,SRC;(DST)←(DST)—(SRC)
功能:从目标操作数中减去源操作数,并将结果存入目标操作数。
(2)SBB带借位的减法指令
格式:SBB DST,SRC;(DST)←(DST)—(SRC)—CF
功能:从目标操作数中减去源操作数,再减去借位CF,并把结果存入目标操作数。
(3)DEC 减1指令; (OPR)←(OPR)—1
格式:DEC OPR
功能:将目标操作数减1。
(4)NEG 求补指令
格式:NEG OPR;(OPR)←10000H—(OPR);16位
功能:使操作数按位求反再加1,结果送入目标操作数。
(5)CMP 比较指令
格式:CMP OPR1,OPR2;(OPR1)—(OPR2)
功能:用目标操作数减去源操作数,但并不将结果送回目标操作数,只是根据结果设置标志位。
例3.48 SUB [SI+14H],0136H
执行前 (DS)=3000H,(SI)=0040H,
(30054H)=4336H,
执行后 (30054H)=4200H,SF=0,ZF=0,CF=0,OF=0
例3.49 SUB DH,[BP+4]
执行前 (DH)=41H,(SS)=0000H,(BP)=00E4H,
(000E8H)=5AH
执行后 (DH)=0E7H,SF=1,ZF=0,CF=1,OF=0
例3.50 W←X+Y+24—Z;32位用16位指令完成
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2
ADD AX,24
ADC DX,0
SUB AX,Z
SBB DX,Z+2
MOV W,AX
MOV W+2,DX
3. 乘法指令
(1)MUL无符号数相乘指令
格式:MUL SRC;字节:(AX)←(AL)*(SRC)
字:(DX,AX)←(AX)*(SRC)
功能:将累加器(AX或AL)与源操作数作为无符号数相乘。
字节运算:AL×SRC 结果存放在AX 中。
字运算:AX×SRC 结果存放在DXAX 中。
(2)IMUL带符号数乘法指令
格式:IMUL SRC
功能:将累加器(AX或AL)与源操作数作为带符号数相乘。
字节运算:AL×SRC 结果存放在AX 中。
字运算:AX×SRC 结果存放在DXAX 中。
例3.52 如 (AL)=0B4H,(BL)=11H
MUL BL 结果(AX)=0BF4H=3060D,CF=OF=1
IMUL BL 结果(AX)=0FAF4H= —1292D,CF=OF=1
4. 除法指令
(1)DIV 无符号数除法指令
格式:DIV SRC;
字节:(AL)←(AX)/(SRC)的商
(AH)←(AX)/(SRC)的余数
字:(AX)←(DX,AX)/(SRC)的商
(DX)←(DX,AX)/(SRC)的余数
功能:将两个无符号数相除。
字节运算:AX÷SRC 结果商在AL 中,余数在AH中。
字运算:DXAX÷SRC 结果商在AX 中,余数在DX中。
(2)IDIV 带符号数除法指令
格式:IDIV SRC
功能:将两个带符号数相除。
例3.55 如 (AX)=0400H,(BL)=0B4H
DIV BL
;结果 商(AL)=05,余数(AH)=7CH=124D
IMUL BL
;结果 商(AL)=0F3= —13,余数(AH)=24H=36D
例3.56
3.2.3十进制算术运算指令
1. 压缩的BCD码调整指令
•DAA 加法的十进制调整指令
格式:DAA
功能:在两个压缩的BCD码相加后使用,隐含AL为目标操作数。
MOV AL,17H
ADD AL,18H
DAA
•DAS 减法的十进制调整指令
格式:DAS
功能:在两个压缩的BCD码相减后使用,隐含AL为目标操作数。
2. 非压缩的BCD码调整指令
•AAA 加法的ASCII码调整指令
格式:AAA
功能:在两个非压缩的BCD码相加后使用,隐含AL为目标操作数。
•AAS 减法的ASCII调整指令
格式:AAS
功能:在两个非压缩的BCD码相减后使用,隐含AL为目标操作数。
•AAM 乘法的ASCII码调整指令
格式:AAM
功能:在两个非压缩的BCD码相乘后使用,隐含源操作数为AL,目标操作数为AX。
•AAD 除法的ASCII码调整指令
格式:AAD
功能:将AX中的非压缩的BCD码调整成二进制,送入AL作为被除数。