汇编和机器指令相关
| 【提示】建议用ctrl + F 键来快速定位有效信息 |
|---|
| ---------文章内容从互联网已有资料整理--------- |
汇编语言指令集
汇编指令是汇编语言中使用的一些操作符(如mov,inc,loop)和助记符,还包括一些伪指令(如assume,end)。用于告诉汇编程序如何进行汇编的指令,它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
一、数据传输指令
它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。
1. 通用数据传送指令
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址. 例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
二、算术运算指令
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
DEC 减 1.
NEC 求反(以 0 减之).
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AAS 减法的ASCII码调整.
DAS 减法的十进制调整.
MUL 无符号乘法.
IMUL 整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM 乘法的ASCII码调整.
DIV 无符号除法.
IDIV 整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或 商回送AX,余数回送DX, (字运算).
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
三、逻辑运算指令
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
四、串指令
DS:SI 源串段寄存器 :源串变址.
ES:DI 目标串段寄存器:目标串变址.
CX 重复次数计数器.
AL/AX 扫描值.
D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
Z标志 用来控制扫描或比较操作的结束.
MOVS 串传送.
( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )
CMPS 串比较.
( CMPSB 比较字符. CMPSW 比较字. )
SCAS 串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS 装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )
STOS 保存串.
是LODS的逆过程.
REP 当CX/ECX<>0时重复.
REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC 当CF=1且CX/ECX<>0时重复.
REPNC 当CF=0且CX/ECX<>0时重复.
五、程序转移指令
1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT 中断指令
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.
六、伪指令
DW 定义字(2字节).
PROC 定义过程.
ENDP 过程结束.
SEGMENT 定义段.
ASSUME 建立段寄存器寻址.
ENDS 段结束.
END 程序结束.
七、处理机控制指令
标志处理指令 CLC(进位位置0指令)
CMC(进位位求反指令)
STC(进位位置为1指令)
CLD(方向标志置1指令)
STD(方向标志位置1指令)
CLI(中断标志置0指令)
STI(中断标志置1指令)
NOP(无操作)
HLT(停机)
WAIT(等待)
ESC(换码)
LOCK(封锁)
机器操作码与汇编对应表
缩写含义说明
指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,遵循下列约定:
l reg8: 8位寄存器。
l reg16: 16位寄存器。
l mem8: 8位内存数值。
l mem16: 16位内存数值。
l immed8: 8位立即数值。
l immed16: 16位立即数值。
l immed32: 32位立即数值。
l segReg: 16位段寄存器。
机器码和汇编对照表
格式说明:
00(机器操作码)
ADD(汇编助记符)reg8/mem8,reg8(操作数)
00
ADD reg8/mem8,reg8
01
ADD reg16/mem16,reg16
02
ADD reg8,reg8/mem8
03
ADD reg16,reg16/mem16
04
ADD AL,immed8
05
ADD AX,immed16
06
PUSH es
07
POP es
08
OR reg8/mem8,reg8
09
OR reg16/mem16,reg16
0A
OR reg8,reg8/mem8
0B
OR reg16,reg16/mem16
0C
OR al,immed8
0D
OR ax,immed16
0E
PUSH cs
0F
Not used
10
ADC reg8/mem8,reg8
11
ADC reg16/mem16,reg16
12
ADC reg8,reg8/mem8
13
ADC reg16,reg16/mem16
14
ADC al,immed8
15
ADC ax,immed16
16
PUSH ss
17
POP ss
18
SBB reg8/mem8,reg8
19
SBB reg16/mem16,reg16
1A
SBB reg8,reg8/mem8
1B
SBB reg16,reg16/mem16
1C
SBB al,immed8
1D
SBB ax,immed16
1E
PUSH ds
1F
POP ds
20
AND reg8/mem8,reg8
21
AND reg16/mem16,reg16
22
AND reg8,reg8/mem8
23
AND reg16,reg16/mem16
24
AND al,immed8
25
AND ax,immed16
26
Segment override
27
DAA
28
SUB reg8/mem8,reg8
29
SUB reg16/mem16,reg16
2A
SUB reg8,reg8/mem8
2B
SUB reg16,reg16/mem16
2C
SUB al,immed8
2D
SUB ax,immed16
2E
Segment override
2F
DAS
30
XOR reg8/mem8,reg8
31
XOR reg16/mem16,reg16
32
XOR reg8,reg8/mem8
33
XOR reg16,reg16/mem16
34
XOR al,immed8
35
XOR ax,immed16
36
Segment override
37
AAA
38
CMP reg8/mem8,reg8
39
CMP reg16/mem16,reg16
3A
CMP reg8,reg8/mem8
3B
CMP reg16,reg16/mem16
3C
CMP al,immed8
3D
CMP ax,immed16
3E
Segment override
3F
AAS
40
INC ax
41
INC cx
42
INC dx
43
INC bx
44
INC sp
45
INC bp
46
INC si
47
INC di
48
DEC ax
49
DEC cx
4A
DEC dx
4B
DEC bx
4C
DEC sp
4D
DEC bp
4E
DEC si
4F
DEC di
50
PUSH ax
51
PUSH cx
52
PUSH dx
53
PUSH bx
54
PUSH sp
55
PUSH bp
56
PUSH si
57
PUSH di
58
POP ax
59
POP cx
5A
POP dx
5B
POP bx
5C
POP sp
5D
POP bp
5E
POP si
5F
POP di
60
PUSHA
61
POPA
62
BOUND reg16/mem16,reg16
63
Not used
64
Not used
65
Not used
66
Not used
67
Not used
68
PUSH immed16
69
IMUL reg16/mem16,immed16
6A
PUSH immed8
6B
IMUL reg8/mem8,immed8
6C
INSB
6D
INSW
6E
OUTSB
6F
OUTSW
70
JO immed8
71
JNO immed8
72
JB immed8
73
JNB immed8
74
JZ immed8
75
JNZ immed8
76
JBE immed8
77
JA immed8
78
JS immed8
79
JNS immed8
7A
JP immed8
7B
JNP immed8
7C
JL immed8
7D
JNL immed8
7E
JLE immed8
7F
JG immed8
80
Table2 reg8
81
Table2 reg16
82
Table2 reg8
83
Table2 reg8, reg16
84
TEST reg8/mem8,reg8
85
TEST reg16/mem16,reg16
86
XCHG reg8,reg8
87
XCHG reg16,reg16
88
MOV reg8/mem8,reg8
89
MOV reg16/mem16,reg16
8A
MOV reg8,reg8/mem8
8B
MOV reg16,reg16/mem16
8C
MOV reg16/mem16,segReg
8D
LEA reg16,reg16/mem16
8E
MOV segReg,reg16/mem16
8F
POP reg16/mem16
90
NOP
91
XCHG ax,cx
92
XCHG ax,dx
93
XCHG ax,bx
94
XCHG ax,sp
95
XCHG ax,bp
96
XCHG ax,si
97
XCHG ax,di
98
CBW 99CWD
9A
CALL immed32
9B
WAIT
9C
PUSHF
9D
POPF
9E
SAHF
9F
LAHF
A0
MOV al,[mem8]
A1
MOV ax,[mem16]
A2
MOV [mem8],al
A3
MOV [mem16],ax
A4
MOVSB
A5
MOVSW
A6
CMPSB
A7
CMPSW
A8
TEST al,[mem8]
A9
TEST ax,[mem16]
AA
STOSB
AB
STOSW
AC
LODSB
AD
LODSW
AE
SCASB
AF
SCASW
B0
MOV al,immed8
B1
MOV cl,immed8
B2
MOV dl,immed8
B3
MOV bl,immed8
B4
MOV ah,immed8
B5
MOV ch,immed8
B6
MOV dh,immed8
B7
MOV bh,immed8
B8
MOV ax,immed16
B9
MOV cx,immed16
BA
MOV dx,immed16
BB
MOV bx,immed16
BC
MOV sp,immed16
BD
MOV bp,immed16
BE
MOV si,immed16
BF
MOV di,immed16
C0
Table1 reg8
C1
Table1 reg8, reg16
C2
RET immed16
C3
RET
C4
LES reg16/mem16,mem16
C5
LDS reg16/mem16,mem16
C6
MOV reg8/mem8,immed8
C7
MOV reg16/mem16,immed16
C8
ENTER immed16, immed8
C9
LEAVE
CA
RET immed16
CB
RET
CC
INT 3
CD
INT immed8
CE
INTO
CF
IRET
D0
Table1 reg8
D1
Table1 reg16
D2
Table1 reg8
D3
Table1 reg16
D4
AAM
D5
AAD
D6
Not used
D7
XLAT [bx]
D8
ESC immed8
D9
ESC immed8
DA
ESC immed8
DB
ESC immed8
DC
ESC immed8
DD
ESC immed8
DE
ESC immed8
DF
ESC immed8
E0
LOOPNE immed8
E1
LOOPE immed8
E2
LOOP immed8
E3
JCXZ immed8
E4
IN al,immed8
E5
IN ax,immed16
E6
OUT al,immed8
E7
OUT ax,immed16
E8
CALL immed16
E9
JMP immed16
EA
JMP immed32
EB
JMP immed8
EC
IN al,dx
ED
IN ax,dx
EE
OUT al,dx
EF
OUT ax,dx
F0
LOCK
F1
Not used
F2
REPNE
F3
REP
F4
HLT
F5
CMC
F6
Table3 reg8
F7
Table3 reg16
F8
CLC
F9
STC
FA
CLI
FB
STI
FC
CLD
FD
STD
FE
Table4 reg8
FF
Table4 reg16
汇编标志位flags
| 缩写 | 名字 | 作用 |
|---|---|---|
| CF | 进位标志位 | 在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,产生进位或借位时CF=1,否则CF=0 |
| PF | 奇偶标志位 | 相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0 |
| AF | 辅助进位标志位 | 运算过程中看最后四位,不论长度为多少。最后四位向前有进位或者借位,AF=1,否则AF=0 |
| ZF | 零标志位 | 相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0 |
| SF | 符号标志位 | 相关指令执行后结果为负那么SF=1,结果非负数则SF=0 |
| TF | 调试标志位 | 当TF=1时,处理器每次只执行一条指令,即单步执行 |
| IF | 中断允许标志位 | 它用来控制8086是否允许接收外部中断请求。若IF=1,8086能响应外部中断,反之则屏蔽外部中断 |
| DF | 方向标志位 | 在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;注意此处DF的值是由程序员进行设定的 CLD命令是将DF设置为0,STD命令是将DF设置为1 |
| OF | 溢出标志位 | 记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0 |
JCC指令
| JCC指令 | 中文含义 | 英文原意 | 检查符号位 | 典型C应用 |
|---|---|---|---|---|
| JZ/JE | 若为0则跳转;若相等则跳转 | jump if zero;jump if equal | ZF=1 | if (i == j);if (i == 0); |
| JNZ/JNE | 若不为0则跳转;若不相等则跳转 | jump if not zero;jump if not equal | ZF=0 | if (i != j);if (i != 0); |
| JS | 若为负则跳转 | jump if sign | SF=1 | if (i < 0); |
| JNS | 若为正则跳转 | jump if not sign | SF=0 | if (i > 0); |
| JP/JPE | 若1出现次数为偶数则跳转 | jump if Parity (Even) | PF=1 | (null) |
| JNP/JPO | 若1出现次数为奇数则跳转 | jump if not parity (odd) | PF=0 | (null) |
| JO | 若溢出则跳转 | jump if overflow | OF=1 | (null) |
| JNO | 若无溢出则跳转 | jump if not overflow | OF=0 | (null) |
| JC/JB/JNAE | 若进位则跳转;若低于则跳转;若不高于等于则跳转 | jump if carry;jump if below;jump if not above equal | CF=1 | if (i < j); |
| JNC/JNB/JAE | 若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jump if not carry;jump if not below;jump if above equal | CF=0 | if (i >= j); |
| JBE/JNA | 若低于等于则跳转;若不高于则跳转 | jump if below equal;jump if not above | ZF=1或CF=1 | if (i <= j); |
| JNBE/JA | 若不低于等于则跳转;若高于则跳转 | jump if not below equal;jump if above | ZF=0或CF=0 | if (i > j); |
| JL/JNGE | 若小于则跳转;若不大于等于则跳转 | jump if less;jump if not greater equal jump | SF != OF | if (si < sj); |
| JNL/JGE | 若不小于则跳转;若大于等于则跳转; | jump if not less;jump if greater equal | SF = OF | if (si >= sj); |
| JLE/JNG | 若小于等于则跳转;若不大于则跳转 | jump if less equal;jump if not greater | ZF != OF 或 ZF=1 | if (si <= sj); |
| JNLE/JG | 若不小于等于则跳转;若大于则跳转 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | if(si>sj) |

汇编语言指令集;机器操作码与汇编对应表;汇编标志位flags;JCC指令
浙公网安备 33010602011771号