汇编和机器指令相关

【提示】建议用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)
posted @ 2023-01-15 17:54  (ToT)  阅读(340)  评论(0)    收藏  举报