导图社区 部分汇编指令
边学边整理出的一些汇编指令及其简单描述
编辑于2020-04-18 19:42:02指令功能
英文缩写
SR
段寄存器
UR
通用寄存器
N或n
立即数
F
标志位
M或[EA]
存储器操作数
B
字节
W
字
DW
双字
DST
目的操作数
SRC
源操作数
OD
操作数
传送指令
一般传送
MOV DST, SRC
N-->UR
N-->M
UR-->UR
UR-->SR
UR-->M
SR-->UR
SR-->M
M-->UR
M-->SR
CS一般不能修改
交换传送
XCHG OD1,OD2
UR<-->UR
M<-->UR
XLAT
(BX+AL)→AL
堆栈传送
PUSH SRC
SP=SP-2 ; SRC-->(SP)
POP DST
(SP)-->DST ; SP=SP+2
SRC,DST 均为字
地址传送
LEA UR16,[EA]
EA-->UR16
LDS UR16,[EA]
(EA)-->UR16 ; (EA+2)-->DS
LES UR16,[EA]
(EA)-->UR16 ; (EA+2)-->ES
标志传送
LAHF
PSW低8位-->AH
SAHF
AH-->PSW低8位
PUSHF
SP=SP-2 ; PSW-->(SP)
POPF
(SP)-->PSW ; SP=SP+2
算数运算指令
加减运算
单目运算
INC OD
OD=OD+1
DEC OD
OD=OD-1
NEG OD
OD=0-OD
INC, DEC 对CF无影响
双目运算
ADD DST, SCR
DST=DST+SCR
ADC DST, SCR
DST=DST+SCR+CT
SUB DST, SCR
DST=DST-SCR
SBB DST, SCR
DST=DST-SCR-CF
CMP DST, SCR
DST-SCR
乘除运算
MUL/IMUL SRC
SCR 只能是 UR 或 M
B
AL*SCR-->AX
AH !=0 , CF=OF=1
W
AX*SCR-->DX, AX
DX !=0 , CF=OF=1
DIV/IDIV SRC
SCR 只能是 UR 或 M
B
AX / SRC = AL ~~~ AH
AL > 0ffH , 引起0号中断
W
AX / SRC = AX ~~~ DX
AX > 0ffffH , 引起0号中断
扩展
CBW
将AL有符号扩展成AX
CWD
将AX有符号扩展成DXAX
BCD修正
DAA
若AL的低4位落在 A~F 或 AF=1,则AL=AL + 6,AF=1
若AL的高4位落在 A~F 或 CF=1,则AL=AL + 60H,AF=1
一般跟在第一操作数为AL的 ADD 或 ADC 指令之后,用于对压缩BCD码加法的修正
DAS
若AL的低4位落在 A~F 或 AF=1,则AL=AL - 6,AF=1
若AL的高4位落在 A~F 或 CF=1,则AL=AL - 60H,AF=1
一般跟在第一操作数为AL 的 SUB 或 SBB 指令之后,用于对压缩 BCD码减法的修正
AAA
若AL的低4位落在 A~F 或 AF=1,则AL=AL + 6,AF=1, CF=1
AH=AH + CF , 清除AL高四位
一般跟在第一操作数为AL的 ADD 或 ADC 指令之后,用于对非压缩BCD码加法的修正
AAS
若AL的低4位落在 A~F 或 AF=1,则AL=AL - 6,AF=1, CF=1
AH=AH - CF, 清除AL高四位
一般跟在第一操作数为AL 的 SUB 或 SBB 指令之后,用于对非压缩 BCD码减法的修正
AAM
AX/10 = AH~~~AL
将2位十六进制数分解为十位数和个位数
AAD
AH*10 + AL -->AX
实现将非压缩BCD码转化为十六进制数据
位运算指令
逻辑运算
单目运算
NOT OD
OD按位取反后送给自己
OD只能是UR 或 M
双目运算
OR DST, SRC
使DST某些位不变(SRC对应位为0),某些位置1(SRC对应位为1)
XOR DST, SRC
使DST某些位不变(SRC对应位为0),某些位置反(SRC对应位为1)
AND DST, SRC
使DST某些位不变(SRC对应位为1),某些位清零(SRC对应位为0)
TEST DST, SRC
测试判断DST某些位是否同时为零(SRC对应被测试位为1,其余为0)
DST 为UR或M, SRC可为N或UR或M
移位运算
非循环移位
SHL/SAL OD, 1/CL
OD左移1/CL位
OD = OD*2^CL
SHR OD,1/CL
OD逻辑右移1/CL位
无符号 OD = OD / ( 2^CL)
SAR OD, 1/CL
OD算术右移1/CL位
有符号 OD = OD / ( 2^CL)
OD只能是UR或M,CF是最后移出的那位二进制的值
循环移位
ROL OD, 1/CL
OD左循环移1/CL位
ROR OD, 1/CL
OD右循环移1/CL位
RCL OD, 1/CL
OD带进位左循环移1/CL位
RCR OD, 1/CL
OD带进位右循环移1/CL位
OD只能是UR或M,CF是最后移出的那位二进制的值
CPU控制指令
CLI
IF=0
STI
IF=1
CLD
DF=0
STD
DF=1
CLC
CF=0
STC
CF=1
CMC
CF置反
NOP
空指令
HLT
使CPU暂停
完整编程时不使用
ESC
交权给协处理器
WAIT
等待协处理器处理完毕
LOCK
在某些指令执行期间对总线加锁
I/O指令
PORT 端口直接寻址
IN AL/AX, PORT/DX
OUT PORT/DX, AL/AX
字节直接对PORT输入或输出
字对 PORT 和 PORT+1 输入或输出
串操作指令
具体操作指令
串拷贝指令
MOVSB
(DS:SI)-->(ES:DI)
若 DF=0, SI, DI +1 若 DF=1, SI, DI - 1
MOVSW
(DS:SI)-->(ES:DI)
若 DF=0, SI, DI +2 若 DF=1, SI, DI - 2
串装载指令
LODSB
(DS:SI)-->AL
若 DF=0, SI +1 若 DF=1, SI - 1
LODSW
(DS:SI)-->AX
若 DF=0, SI +2 若 DF=1, SI - 2
串填充指令
STOSB
AL-->(ES:DI)
若 DF=0, DI +1 若 DF=1, DI - 1
STOSW
AX-->(ES:DI)
若 DF=0, SI, DI +2 若 DF=1, SI, DI - 2
串查找指令
SCASB
AL--(ES:DI)
若 DF=0, DI +1 若 DF=1, DI - 1
若 ZF=0, 串中不存在(AL) 若 ZF=1, 串中存在(AL)
SCASW
AX--(ES:DI)
若 DF=0, DI +2 若 DF=1, DI - 2
若 ZF=0, 串中不存在(AX) 若 ZF=1, 串中存在(AX)
串比较指令
CMPSB
(DS:SI)--(ES:DI)
若 DF=0, SI, DI +1 若 DF=1, SI, DI - 1
CMPSW
(DS:SI)--(ES:DI)
若 DF=0, SI, DI +2 若 DF=1, SI, DI - 2
前缀指令
REP
后可接
MOVSB
MOVSW
LODSB
LODSW
STOSB
STOSW
执行流程
若CX == 0 , 执行下一条指令 若CX != 0, 执行后接指令
CX = CX - 1 , 回到第一步
REPE/REPZ
后可接
SCASB
SCASW
CMPSB
CMPSW
执行流程
若CX == 0 , 执行下一条指令 若CX != 0, 执行后接指令
CX = CX - 1
若ZF == 0 , 执行下一条指令 若ZF == 1 , 回到第一步
REPNE/REPNZ
后可接
SCASB
SCASW
CMPSB
CMPSW
执行流程
若CX == 0 , 执行下一条指令 若CX != 0, 执行后接指令
CX = CX - 1
若ZF == 1 , 执行下一条指令 若ZF == 0 , 回到第一步
转移指令
无条件转移
JMP指令
JMP SHORT 标号 JMP NEAR 标号 JMP FAR 标号 这三个指令均可由 JMP 标号 代替 系统自动识别为哪一种指令
段内转移
直接转移 (相对转移)
JMP SHORT 标号
IP = IP + D8 = IP(JMP) + 2 + D8
JMP NEAR PTR 标号
IP = IP + D16 = IP(JMP) + 3 + D16
间接转移 (绝对转移)
JMP UR16
IP = UR16
JMP WORD PTR [EA]
IP = (EA)
段间转移
直接转移 (相对转移)
JMP FAR 标号
IP =( CS : IP(JMP) + 1 ) CS = ( CS : IP(JMP) + 3 )
间接转移 (绝对转移)
JMP DWORD PRT [EA]
IP = (EA) CS = (EA + 2 )
程序调用与返回
CALL
1,保护断点 2,产生转移
段内调用
直接调用 (相对调用)
CAll NEAR PTR 标号
PUSH IP
IP = IP + D16 = IP(CALL) + 3 + D16
间接调用 (绝对调用)
CALL UR16
PUSH IP
IP = UR16
CALL WORD PTR [EA]
PUSH IP
IP = (EA)
段间调用
直接调用 (相对调用)
CAll FAR PTR 标号
PUSH CS PUSH IP
IP =( CS : IP(CALL) + 1 ) CS =( CS : IP(CALL) + 3 )
间接调用 (绝对调用)
CALL DWORD PTR [EA]
PUSH CS PUSH IP
IP = (EA) CS + (EA + 2)
RET
与CALL配套使用
段内返回
POP IP
段间返回
POP IP POP CS
中断调用与返回
中断号取值00H~FFH, 共256个 中断调用主要用于调用系统服务程序 中断调用入口地址称中断向量 内存最开始1KB空间按顺序存放中断向量 这1KB空间也称中断向量表 中断向量地址为中断号XYH*4
INT XYH
1,保护PWS、CS、IP 2,产生跳转
PUSHF PUSH CS PUSH IP
IP = ( 0: XYH) CS = (0: XYH + 2)
IRET
POP IP POP CS POPF
有条件转移
寻址方式均是短转移 格式均为: JCC 标号 JCC为某一有条件转移助记符
按标志位转移
ZF
JZ(JE) 标号
ZF == 1 转移
JNZ(JNE) 标号
ZF == 0 转移
CF
JC(JB、JNAE) 标号
CF == 1 转移
JNC(JNB、JAE) 标号
CF == 0 转移
OF
JO 标号
OF == 1 转移
JNO 标号
OF == 0 转移
PF
JP(JPE) 标号
PF == 1 转移
JNP(JPO) 标号
PF == 0 转移
SF
JS 标号
SF == 1 转移
JNS 标号
SF == 0 转移
按数据大小转移
一般在比较指令后使用
无符号数比较
JA (JNBE) 标号
大于 >
JAE (JNB、JNC) 标号
大于等于(不小于) >=
JB (JNAE、JC) 标号
小于 <
JBE (JNA) 标号
小于等于(不大于) <=
有符号数比较
JG (JNLE) 标号
大于 >
JGE (JNL) 标号
大于等于(不小于) >=
JL (JNLE) 标号
小于 <
JLE (JNG) 标号
小于等于(不大于) <=
循环转移
LOOP 标号
执行循环体
CX = CX - 1
若CX != 0 , 回到第一步 若CX == 0, 执行下一条指令
LOOPE (LOOPZ) 标号
执行循环体
CX = CX - 1
若CX != 0 且 ZF == 1, 回到第一步 若CX == 0 或 ZF == 0 , 执行下一条指令
LOOPNE (LOOPNZ) 标号
执行循环体
CX = CX - 1
若CX != 0 且 ZF == 0, 回到第一步 若CX == 0 或 ZF == 1 , 执行下一条指令