基本指令

指令说明
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。
XORXOR 异或指令实现按位异或运算。 当且仅当操作数中的位不同时,XOR 运算将结果位设置为 1。 如果操作数的位相同(均为 0 或均为 1),则结果位清除为 0。
TESTTEST 指令的工作原理与 AND 运算相同,但与 AND 指令不同的是,它不会更改第一个操作数。 因此,如果我们需要检查寄存器中的数字是偶数还是奇数,我们也可以使用 TEST 指令来完成此操作,而无需更改原始数字。
NOTNOT 指令实现按位 NOT 运算。 NOT 运算反转操作数中的位。 操作数可以在寄存器中,也可以在存储器中。

条件执行

指令说明
CMP指令比较两个操作数。 一般用在条件执行中。 该指令基本上将一个操作数与另一个操作数相减,以比较操作数是否相等。 它不会干扰目标或源操作数。 它与条件跳转指令一起用于决策。

无条件跳转

指令说明
JMP提供了一个标签名称,其中控制流立即转移

条件跳转

用于算术运算的有符号数据上使用的条件跳转指令:

说明描述已测试标志
JE/JZJump Equal or Jump ZeroZF
JNE/JNZJump not Equal or Jump Not ZeroZF
JG/JNLEJump Greater or Jump Not Less/EqualOF, SF, ZF
JGE/JNLJump Greater/Equal or Jump Not LessOF, SF
JL/JNGEJump Less or Jump Not Greater/EqualOF, SF
JLE/JNGJump Less/Equal or Jump Not GreaterOF, SF, ZF

用于逻辑运算的无符号数据的条件跳转指令:

说明描述已测试标志
JE/JZJump Equal or Jump ZeroZF
JNE/JNZJump not Equal or Jump Not ZeroZF
JA/JNBEJump Above or Jump Not Below/EqualCF, ZF
JAE/JNBJump Above/Equal or Jump Not BelowCF
JB/JNAEJump Below or Jump Not Above/EqualCF
JBE/JNAJump Below/Equal or Jump Not AboveAF, CF

条件跳转指令有特殊用途并检查标志的值:

说明描述已测试标志
JXCZJump if CX is Zeronone
JCJump If CarryCF
JNCJump If No CarryCF
JOJump If OverflowOF
JNOJump If No OverflowOF
JP/JPEJump Parity or Jump Parity EvenPF
JNP/JPOJump No Parity or Jump Parity OddPF
JSJump Sign (negative value)SF
JNSJump 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:SIMOVSBMOVSWMOVSD
LODS AX, DS:SILODSBLODSWLODSD
STOS ES:DI, AXSTOSBSTOSWSTOSD
CMPS DS:SI, ES: DICMPSBCMPSWCMPSD
SCAS ES:DI, AXSCASBSCASWSCASD

重复前缀:

当在字符串指令之前设置 REP 前缀时,例如 - REP MOVSB,会导致基于 CX 寄存器中的计数器重复指令。 REP执行该指令,将CX减1,并检查CX是否为零。 它重复指令处理,直到 CX 为零。

方向标志(DF)决定操作的方向。

REP 前缀还有以下变体:

loker66fan
老当益壮,宁移白首之心;穷且益坚,不坠青云之志。——王勃
👋我是loker66fan
分享作者『lokerfan』发表的文章『汇编基础指令』https://a.loker.love/post/examples/2/
© 请您在需要时著名本文内容来源信息,若在文末注明“参考、扩展”等字样涉及转载第三方内容,请您一同复制