前面的汇编用工具转换的,整理的太差了现在重新整理

cdq

cdq(Convert Doubleword to Quadword)是一个汇编指令,用于将 EAX 寄存器中的有符号双字(32 位)扩展为 EDX:EAX 寄存器对中的有符号四字(64 位)。

语法格式:
cdq

工作原理:
cdq 指令将 EAX 寄存器的值视为有符号整数,并将其进行符号扩展,即将 EAX 寄存器的最高位(符号位)复制到 EDX 寄存器的所有位上。这样就可以将 32 位有符号整数扩展为 64 位有符号整数。

示例:
假设 EAX 寄存器中存储的值为 0x00001234(正数)或者 0xFFFFEDCB(负数),执行 cdq 指令后:

当 EAX 为正数时,EDX:EAX 的结果为 0x00000000 00001234。
当 EAX 为负数时,EDX:EAX 的结果为 0xFFFFFFFF FFFFFEDCB。
通过 cdq 指令,我们可以在执行 32 位有符号除法(idiv 指令)之前,将被除数(通常存储在 EAX 寄存器中)进行符号扩展,以保证得到正确的结果。

请注意,cdq 指令仅适用于有符号数的扩展,对于无符号数的扩展,可以使用 cdqe 指令(Convert Doubleword to Quadword Sign Extension)。

cld

CLD(Clear Direction Flag)是 x86 汇编语言中的一条指令,用于清除方向标志位(Direction Flag)。

语法格式:
CLD

工作原理:
方向标志位控制了字符串操作指令(如 MOVSB、LODSB 等)的方向。当方向标志位被设置为 1 时,字符串操作指令将从高地址向低地址进行操作;当方向标志位被设置为 0 时,字符串操作指令将从低地址向高地址进行操作。

使用 CLD 指令可以将方向标志位(DF)设置为 0,使字符串操作指令按照正常的低地址向高地址的方式工作。

示例:
假设当前方向标志位为 1,即字符串操作指令会从高地址向低地址操作。执行 CLD 指令后,方向标志位被设置为 0,字符串操作指令将按照正常的低地址向高地址操作。

请注意,CLD 指令只能在实模式下使用,在保护模式下无效。

cmp

CMP(比较)指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。

语法格式:
CMP 目的操作数, 源操作数

原理:
当实际的减法发生时,CMP指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如下表所示:
CMP结果 ZF CF
目的操作数 < 源操作数 0 1
目的操作数 > 源操作数 0 0
目的操作数 = 源操作数 1 0
如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如下表所示:
CMP结果 标志位
目的操作数 < 源操作数 SF ≠ OF
目的操作数 > 源操作数 SF = OF
目的操作数 = 源操作数 ZF = 1

lodsb

LODSB(Load String Byte)是 x86 汇编语言中的一条指令,用于从内存中读取一个字节并将其加载到 AL 寄存器中。该指令通常与字符串操作和循环结构一起使用。

语法格式:
lodsb

工作原理:

DS:SI 寄存器指向要读取的内存地址。
从 DS:SI 指向的内存地址读取一个字节的数据,并将其加载到 AL 寄存器中。
根据 DF(方向标志位)的设置,自动递增或递减 SI 寄存器的值,以便指向下一个字节。
如果 DF为 0,则 SI 递增;如果 DF 为 1,则 SI 递减。
可以通过重复执行 LODSB 指令来顺序读取连续的字节数据。
请注意,LODSB 指令属于汇编语言指令,在高级编程语言中无法直接使用。它主要用于字符串操作、数据拷贝和处理等场景中。

lodsd

LODSD(Load Doubleword into EAX)是 x86 汇编语言中的一条指令,用于将双字(32 位)数据加载到 EAX 寄存器中。

语法格式:
LODSD

工作原理:
LODSD 指令从内存中读取一个双字(32 位)数据,并将其加载到 EAX 寄存器中。具体操作步骤如下:

使用 ESI 寄存器作为地址指针,指向要读取的数据的起始地址。
从指定地址读取双字数据。
将读取的数据存储到 EAX 寄存器中。
自动根据 DF(方向标志位)的设置,更新 ESI 寄存器的值,使其指向下一个双字数据的地址。
当 DF 为 0 时,字符串操作指令按照正常的低地址向高地址的方向进行操作。
当 DF 为 1 时,字符串操作指令按照高地址向低地址的方向进行操作。
示例:
假设 ESI 寄存器当前存储的地址为 0x1000,而该地址处存储的双字数据为 0x12345678。执行 LODSD 指令后,EAX 寄存器的值将变为 0x12345678,并且 ESI 寄存器的值会自动递增,指向下一个双字数据的地址。

请注意,LODSD 指令通常与其他字符串操作指令配合使用,用于在字符串操作过程中加载数据。此外,LODSD 指令只能在实模式下使用,在保护模式下无效。

loop

loop 指令来实现循环功能,cx 或者 ecx 中存放循环次数。当 ecx 为 1 的时候,跳出循环。

语法格式:
地址 1 汇编代码
…………
…………
…………
地址 2 loop 地址 1

工作原理:
1、(ecx)=(ecx)-1;
2、判断CX中的值,不为零则转至标号处执行程序,如果为零则向下执行。
记住这里是先进行减法,再判断,所以当 ecx 等于 1 时,运行完就循环结束。

movsb movsw movsd

这三个指令,都是数据传送指令,都是从源地址向目的地址传送数据。

16 位模式下:
源地址是 DS:SI,目的地址是 ES:DI
32 位模式下:
源地址是 DS:ESI,目的地址是 ES:EDI

注意:在传送完成之后,SI 和 DI(或者 ESI 和 EDI)会增加或者减小。
当 DF=0 时,表示正向传送,传送之后 SI 和 DI(或者 ESI 和 EDI)的值会增加;
当 DF=1 时,表示反向传送,传送之后 SI 和 DI(或者 ESI 和 EDI)的值会减小;

他们的区别是:
MOVSB:传送一个字节,之后 SI 和 DI(或者 ESI 和 EDI )加/减 1
MOVSW:传送一个字,之后 SI 和 DI(或者 ESI 和 EDI)加/减 2
MOVSD:传送一个双字,之后 SI 和 DI(或者 ESI 和 EDI)加/减 4

单纯的 movsb/ movsw/ movsd 只能执行一次,如果希望处理器自动地反复执行,可以加上指令前缀 rep;在寄存器 CX(16位模式)或者 ECX(32位模式)中设置传送的次数。当 CX/ECX 不等于 0 时,则执行 movsb/ movsw/ movsd,执行后,CX/ECX 的值减一,直到减为 0 为止。

movsx

MOVSX(Move with Sign-Extension)是 x86 汇编语言中的一条指令,用于将源操作数的低位扩展到目标寄存器,并保持其符号位不变。

语法格式:
MOVSX 目标寄存器, 源操作数

工作原理:
MOVSX 指令接受一个源操作数,并将其低位值进行符号扩展,然后存储到目标寄存器中。具体操作步骤如下:
选择目标寄存器(可以是 8 位或 16 位寄存器)。
选择源操作数(可以是 8 位或 16 位),注意源操作数的高位是带符号的。
将源操作数的低位值进行符号扩展(即复制最高有效位到高位),得到扩展后的结果。
存储扩展后的结果到目标寄存器中。

示例:
假设有以下情况:
AL 寄存器中存储的是8位有符号数 0xFF(-1 的补码表示)。
AX 寄存器中存储的是16位有符号数 0x1234(正数)。
执行下面的指令后:

MOVSX EBX, AL ; 将AL的值(0xFF)符号扩展后存储到EBX寄存器
MOVSX ECX, AX ; 将AX的值(0x1234)符号扩展后存储到ECX寄存器

结果如下:
EBX 的值为 0xFFFFFFFF(-1 的补码表示)。
ECX 的值为 0x00001234(正数)。

通过 MOVSX 指令,我们可以将源操作数扩展为带符号的目标寄存器,以确保正确处理有符号数据。

请注意,MOVSX 指令只能进行有符号数的扩展。对于无符号数的扩展,可以使用 MOVZX 指令(Move with Zero-Extension)。

rep

rep(Repeat)是一个汇编指令前缀,用于指示重复执行接下来的指令。

rep 指令通常与字符串操作相关的指令一起使用,如 movs, stos, cmps 等。它指示了这些指令在每次执行后是否应该继续重复执行,直到满足某个条件为止。

语法格式:
rep 指令

工作原理:
rep 指令会根据 ECX 寄存器的值进行迭代重复执行接下来的指令。每次指令执行完毕后,ECX 寄存器的值会递减 1,当 ECX 的值变为 0 时,循环结束。

示例:
假设有以下代码片段:

mov ecx, 10     ; 设置循环次数为10
mov esi, source ; 设置源地址
mov edi, dest   ; 设置目标地址
rep movsd       ; 重复执行movsd指令,将源地址的双字复制到目标地址

在上述代码中,rep 指令与 movsd 指令一起使用。首先,设置循环次数为 10,并指定源地址和目标地址。然后,rep movsd 指令将重复执行 movsd 指令,将源地址的双字复制到目标地址,直到 ECX 的值变为 0,即循环结束。

请注意,在使用 rep 指令时,需要确保循环次数和指令序列正确设置,以避免出现意外结果或者死循环。

ror

ROR(Rotate Right)是 x86 汇编语言中的一条指令,用于将一个操作数向右循环移位。

语法格式:
ROR 目标操作数, 移位次数

工作原理:
ROR 指令将目标操作数按照指定的移位次数向右循环移位。每次移位,最右边的位将被移到最左边,而其他位依次向右移动。移位的次数可以是一个立即数或者由寄存器或内存中取得。

示例:
假设有以下情况:
EAX 寄存器中存储的是 32 位无符号整数 0x12345678。
要求将 EAX 寄存器的值向右循环移动 2 位后存回到 EAX 寄存器中。
执行下面的指令后:

ROR EAX, 2 ; 将 EAX 的值向右循环移动 2 位

结果如下:
EAX 的值为 0xC48D1E1E。

通过 ROR 指令,我们可以将操作数进行向右循环移位,可以用于数据加密、哈希算法等方面的应用。

请注意,ROR 指令可以用于各种大小的数据,包括 8 位、16 位、32 位和 64 位。移位次数超过操作数长度时,移位次数会取模。同时,在移位过程中,最右边的位可能会影响标志位的设置。

sbb

SBB(带借位减法)指令从目的操作数中减去源操作数和进位标志位的值。

语法格式:
sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1-操作对象2-CF
比如指令sbb ax,bx实现的功能是: (ax)=(ax)-(bx)-CF
sbb指令执行后,将对CF进行设置。

sete

sete 指令的意思就是根据 ZF 标志位的值设置一个变量的值是 1 和 0。

语法格式:
sete 指令通常和算数指令或者逻辑运算指令一起出现。
CMP eax,5
sete cl

stosd

stosd(Store Doubleword)是一个汇编指令,用于将 EAX 寄存器中的双字(32 位)值存储到 ES:EDI 指向的内存地址,并根据方向标志位进行地址的增减。

语法格式:
stosd

工作原理:
stosd 指令将 EAX 寄存器的值存储到 ES:EDI 指向的内存地址中,并根据方向标志位(DF)的设置来决定 EDI 寄存器的增减方式。如果 DF=0,即向前移动,那么存储后,EDI 的值将会增加 4 个字节;如果 DF=1,即向后移动,那么存储后,EDI 的值将会减少 4 个字节。

示例:
假设 ES:EDI 指向一个内存地址 0x00400000,EAX 寄存器器中的值为 0x12345678,执行 stosd 指令后:

如果 DF=0,则将 0x12345678 存储到地址 0x00400000,并将 EDI 的值增加 4,即 EDI=0x00400004。
如果 DF=1,则将 0x12345678 存储到地址 0x00400000,并将 EDI 的值减少 4,即 EDI=0x003FFFFC。
stosd 指令通常用于字符串操作或者填充内存时,可以快速存储一系列双字数据。

请注意,使用 stosd 指令时,需要保证 ES 和 EDI 寄存器的正确设置,以及确保目标内存地址可写。

test

Test 命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test 命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。

TEST AX,BX 与 AND AX,BX 命令有相同效果,只是 Test 指令不改变 AX 和 BX 的内容,而 AND 指令会把结果保存到 AX 中。

语法格式:
test ecx, ecx
jz somewhere
判断寄存器是否为空

原理:
将两个操作数进行按位 AND,设结果是 TEMP
1、SF = 将结果的最高位赋给 SF 标志位,例如结果最高位是 1,SF 就是 1
2、看 TEMP 是不是 0,如果 TEMP 是 0,ZF 位置 1;如果 TEMP 不是 0,ZF 位置 0
3、PF = 将 TEMP 的低 8 位,从第 0 位开始,逐位取同或。也就是第 0 位与第 1 位的同或结果,去和第 2 位同或,结果再去和第 3 位同或......直到和第 7 位同或。PF 位是奇偶校验位,如果结果低 8 位中 1 的个数是偶数,PF=1;否则PF=0
4、CF 位 置 0
5、OF 位 置 0

xchg

xchg(Exchange)是一个汇编指令,用于交换两个操作数的值。

语法格式:
xchg dest, src

其中,dest 和 src 可以是寄存器、内存地址、或者寄存器与内存地址的组合。

工作原理:
xchg 指令将目标操作数(dest)和源操作数(src)之间的值进行交换,即将 dest 的值赋给 src,同时将 src 的值赋给 dest。这个过程是原子性的,不会被中断。

示例:

xchg eax, ebx
将eax和ebx寄存器中的值进行交换。

xchg [eax], ebx
将eax寄存器指向的内存地址中的值与 ebx 寄存器中的值进行交换。

xchg [eax+4], dword ptr [ebx]
将eax寄存器指向的内存地址上偏移 4 个字节处的值与 ebx 寄存器指向的内存地址中的值进行交换。注意,此处需要使用 dword ptr 关键字表示操作数的尺寸为双字(32 位)。

请注意,xchg 指令在多核处理器上可能存在一些特殊行为和限制,对于并发编程,建议谨慎使用。