基本指令
指令 | 说明 |
---|---|
mov | 用于将一个值写入某个寄存器 |
push | 将一个寄存器中的数据入栈 |
pop | 出栈,用一个寄存器接受出栈数据 |
算数指令
指令 | 说明 |
---|---|
INC | 指令用于将操作数加1。它适用于可以位于寄存器或内存中的单个操作数 |
DEC | 指令用于将操作数减1。它适用于可以位于寄存器或内存中的单个操作数。 |
ADD 和 SUB | 用于执行字节、字和双字大小的二进制数据的简单加法/减法,即分别用于8位、16位或32位操作数的加或减。 |
MUL和IMUL | 有两条指令用于将二进制数据相乘。MUL(乘法)指令处理无符号数据,IMUL(整数乘法)指令处理有符号数据。这两条指令都会影响进位和溢出标志。 |
DIV和IDIV | 除法运算生成两个元素 - 一个商和一个余数。在乘法的情况下,不会发生溢出,因为使用双倍长度寄存器来保存乘积。然而,在除法的情况下,可能会发生溢出。如果发生溢出,处理器会产生中断 |
逻辑指令
指令 | 说明 |
---|---|
AND | 指令用于通过执行按位 AND 运算来支持逻辑表达式。 如果两个操作数的匹配位均为 1,则按位 AND 运算返回 1,否则返回 0 |
OR | 指令用于通过执行按位或运算来支持逻辑表达式。 如果任一操作数或两个操作数的匹配位均为 1,则按位 OR 运算符返回 1。 如果两个位都为零,则返回 0。 |
XOR | XOR 异或指令实现按位异或运算。 当且仅当操作数中的位不同时,XOR 运算将结果位设置为 1。 如果操作数的位相同(均为 0 或均为 1),则结果位清除为 0。 |
TEST | TEST 指令的工作原理与 AND 运算相同,但与 AND 指令不同的是,它不会更改第一个操作数。 因此,如果我们需要检查寄存器中的数字是偶数还是奇数,我们也可以使用 TEST 指令来完成此操作,而无需更改原始数字。 |
NOT | NOT 指令实现按位 NOT 运算。 NOT 运算反转操作数中的位。 操作数可以在寄存器中,也可以在存储器中。 |
条件执行
指令 | 说明 |
---|---|
CMP | 指令比较两个操作数。 一般用在条件执行中。 该指令基本上将一个操作数与另一个操作数相减,以比较操作数是否相等。 它不会干扰目标或源操作数。 它与条件跳转指令一起用于决策。 |
无条件跳转
指令 | 说明 |
---|---|
JMP | 提供了一个标签名称,其中控制流立即转移 |
条件跳转
用于算术运算的有符号数据上使用的条件跳转指令:
说明 | 描述 | 已测试标志 |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JG/JNLE | Jump Greater or Jump Not Less/Equal | OF, SF, ZF |
JGE/JNL | Jump Greater/Equal or Jump Not Less | OF, SF |
JL/JNGE | Jump Less or Jump Not Greater/Equal | OF, SF |
JLE/JNG | Jump Less/Equal or Jump Not Greater | OF, SF, ZF |
用于逻辑运算的无符号数据的条件跳转指令:
说明 | 描述 | 已测试标志 |
---|---|---|
JE/JZ | Jump Equal or Jump Zero | ZF |
JNE/JNZ | Jump not Equal or Jump Not Zero | ZF |
JA/JNBE | Jump Above or Jump Not Below/Equal | CF, ZF |
JAE/JNB | Jump Above/Equal or Jump Not Below | CF |
JB/JNAE | Jump Below or Jump Not Above/Equal | CF |
JBE/JNA | Jump Below/Equal or Jump Not Above | AF, CF |
条件跳转指令有特殊用途并检查标志的值:
说明 | 描述 | 已测试标志 |
---|---|---|
JXCZ | Jump if CX is Zero | none |
JC | Jump If Carry | CF |
JNC | Jump If No Carry | CF |
JO | Jump If Overflow | OF |
JNO | Jump If No Overflow | OF |
JP/JPE | Jump Parity or Jump Parity Even | PF |
JNP/JPO | Jump No Parity or Jump Parity Odd | PF |
JS | Jump Sign (negative value) | SF |
JNS | Jump No Sign (positive value) | SF |
常见跳转总结:
循环
指令 | 说明 |
---|---|
LOOP | 假定ECX 寄存器包含循环计数。 当执行循环指令时,ECX寄存器递减,控制跳转到目标标号,直到ECX寄存器值,即计数器达到零值。 |
字符串
使用 $ 位置计数器符号来显式存储字符串长度,该符号表示位置计数器的当前值。
$ 指向字符串变量msg最后一个字符之后的字节。 因此,*$-msg*给出了字符串的长度
字符串指令
指令 | 说明 |
---|---|
MOVS | 该指令将 1 个字节、字或双字的数据从内存位置移动到另一个位置。 |
LODS | 该指令从内存中加载。 如果操作数是一个字节,则加载到 AL 寄存器,如果操作数是一个字,则加载到 AX 寄存器,如果操作数是双字,则加载到 EAX 寄存器。 |
STOS | 该指令将数据从寄存器(AL、AX 或 EAX)存储到内存。 |
CMPS | 该指令比较内存中的两个数据项。 数据可以是字节大小、字或双字。 |
SCAS | 该指令将寄存器(AL、AX 或 EAX)的内容与内存中项目的内容进行比较。 |
对于 16 位地址,使用 SI 和 DI 寄存器,对于 32 位地址,使用 ESI 和 EDI 寄存器。
下表提供了各种版本的字符串指令和假定的操作数空间。
基本指令 | 操作数位于 | Byte 操作 | Word 操作 | Double word 操作 |
---|---|---|---|---|
MOVS | ES:DI, DS:SI | MOVSB | MOVSW | MOVSD |
LODS | AX, DS:SI | LODSB | LODSW | LODSD |
STOS | ES:DI, AX | STOSB | STOSW | STOSD |
CMPS | DS:SI, ES: DI | CMPSB | CMPSW | CMPSD |
SCAS | ES:DI, AX | SCASB | SCASW | SCASD |
重复前缀:
当在字符串指令之前设置 REP 前缀时,例如 - REP MOVSB,会导致基于 CX 寄存器中的计数器重复指令。 REP执行该指令,将CX减1,并检查CX是否为零。 它重复指令处理,直到 CX 为零。
方向标志(DF)决定操作的方向。
- 使用CLD(清除方向标志,DF = 0)进行从左到右的操作。
- 使用STD(设置方向标志,DF = 1)使操作从右到左。
REP 前缀还有以下变体:
-
REP:无条件重复。 它重复该操作,直到 CX 为零。
-
REPE或REPZ:有条件重复。 当零标志指示等于/零时,它会重复该操作。 当 ZF 指示不等于/零或 CX 为零时,它会停止。
-
REPNE 或 REPNZ:也是有条件重复。 当零标志指示不等于/零时,它会重复该操作。 当 ZF 指示等于/零或 CX 递减至零时,它会停止。
更多指令在 汇编语言教程 (w3ccoo.com)