汇编代码指令初步学习

​ 学习记录,不是任务。(* ̄、ゝ ̄)

1
NOP:无操作指令,不进行任何操作。
1
2
PUSH:入栈指令,用于将数据压入堆栈。
POP:出栈指令,用于从堆栈中弹出数据。
1
2
3
4
5
pushad:将所有通用寄存器推入栈中,进行现场保护。
popad:从栈中弹出所有通用寄存器,进行现场还原。
类似用途的还有:
pushfd:将所有标志寄存器的内容推入栈中。
popfd:标志寄存器出栈。
1
2
3
4
5
mov:将源操作数的数据传送到目标操作数中,而不影响源操作数本身内容,可以实现数据的复制、转移或重新赋值。
movsx:将数据从一个较小的源操作数移动到一个较大的目标操作数,并在移动过程中保持数据的符号位不变。
movzx:将数据从一个较小的源操作数移动到一个较大的目标操作数,在移动过程中,目标操作数的高位将被填充为0。
lea:用于计算内存地址,并将该地址加载到指定的寄存器中。
xchg:用于交换两个操作数的值。
1
2
3
4
5
6
add:将两个操作数相加,并将结果存储在指定的寄存器或内存地址中。
sub:第一个操作数中减去第二个操作数的值,并将结果存储在指定的寄存器或内存地址中。
adc:用于执行带进位的加法操作。
sbb:用于执行带进位的减法操作。
inc:对操作数进行加1。
dec:对操作数进行减1。
1
2
3
4
mul:将两个操作数相乘,并将低位存储在ax寄存器中,高位存储在dx寄存器中。如果乘积不超过16位,那么dx寄存器将被清零。
div:整除运算,即将一个数(被除数)除以另一个数(除数),商存储在ax寄存器中,余数存储在dx寄存器中。
imul:执行有符号整数乘法。
idiv:指令执行有符号整数除法。

[^imul有点复杂……(┛◉Д◉)┛彡┻━┻]:

1
2
3
imul eax, ebx :将 eax 寄存器的值与 ebx 寄存器的值相乘,eax和ebx寄存器中的值相乘,乘积存储在eax(低位)和edx(高位)中。
imul eax, ebx, 10 :将ebx寄存器的值与10相乘,结果存储在eax中,如果乘积超过 eax 的容量,则高位部分将被丢弃。
imul eax, [bx+si] ; 将bx+si指向的内存位置的值与eax寄存器的值相乘,乘积存储在eax(低位)和edx(高位)中。
1
2
xadd:一个交换并加法的指令,结果返回第一个操作数。
neg:取反。
1
2
3
4
and:逻辑与运算,如果两个相应的二进制位都为1,则该位的结果为1,否则为0。
or:逻辑或运算,如果两个相应的二进制位中至少有一个为1,则该位的结果为1;如果两个位都为0,则该位的结果为0。
xor:逻辑异或运算,如果两个位不相同,则结果为1;如果两个位相同,则结果为0。
not:逻辑取反运算,1则为0,0则为1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cmp:比较指令,一般在跳转指令之前,用于比较两个操作数的大小。
在汇编语言中,CMP 指令用于比较两个操作数,并根据比较结果影响 CPU 的状态标志(也称为条件码或标志寄存器中的位)。这些状态标志包括:

零标志(Zero Flag, ZF)(最主要用途):
如果两个操作数相等,则设置此标志(ZF = 1)。
如果两个操作数不相等,则清除此标志(ZF = 0)。

符号标志(Sign Flag, SF):
根据比较结果的符号设置此标志。
如果结果为负,则设置此标志(SF = 1)。
如果结果为正或零,则清除此标志(SF = 0)。

溢出标志(Overflow Flag, OF):
在有符号数的比较中,如果结果超出了操作数所能表示的范围,则设置此标志。
如果没有溢出,则清除此标志。

进位标志(Carry Flag, CF):
在无符号数的比较中,如果第一个操作数小于第二个操作数,则设置此标志。
如果第一个操作数大于或等于第二个操作数,则清除此标志。

奇偶标志(Parity Flag, PF):
根据比较结果中 1 的个数的奇偶性设置此标志。
如果 1 的个数为偶数,则设置此标志(PF = 1)。
如果 1 的个数为奇数,则清除此标志(PF = 0)。


1
2
3
4
5
6
test:逻辑比较指令,对两个操作数执行按位AND逻辑操作。
标志位设置:
ZF(零标志):如果运算结果为0,则ZF=1;否则ZF=0。
SF(符号标志):运算结果的最高位(符号位)赋给SF。如果最高位是1,则SF=1;否则SF=0。
PF(奇偶校验标志):如果运算结果低8位中1的个数是偶数,则PF=1;否则PF=0。
CF(进位标志)和OF(溢出标志):CF和OF都被清零。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
jmp:无条件跳转指令。
je:相等则跳转。
jz:为0则跳转。
jne:不相等则跳转。
jnz:不为0则跳转。
js:同jl。
jns:同jge。
jp:当二进制1的个数为偶数时,PF标志位为1,当二进制1的个数为奇数时,PF标志位为0,当PF标志位为1时,jp发生跳转。
jnp:当PF标志位为0时,jnp发生跳转。
jo:当结果溢出了,OF标志位为1,jo会发生跳转,当OF标志位为0时,jo不发生跳转。
jno:OF标志位为0,jno会发生跳转。
jb:当结果需要借位或者进位的时候,CF变为1,当值1 的时候,jb发生跳转。
jnb:当CF值10的时候,jb发生跳转。
jbe:如果第一个操作数小于等于第二个操作数,即CF或者ZF标志位1的时候跳转。
jneb/ja:如果第一个操作数大于第二个操作数,即CF或者ZF标志位都为0的时候跳转。
jl:如果第一个操作数小于第二个操作数(符号标志 SF=1),则跳转。

跳转总结:

1
2
3
4
5
6
JE 或 JZ(Jump if Equal/Zero):如果比较结果相等(零标志 ZF=1),则跳转。
JNE 或 JNZ(Jump if Not Equal/Not Zero):如果比较结果不相等(零标志 ZF=0),则跳转。
JG 或 JNLE(Jump if Greater):如果第一个操作数大于第二个操作数(符号标志 SF=0 且 零标志 ZF=0),则跳转。这通常用于带符号数的比较。
JL 或 JNGE(Jump if Less):如果第一个操作数小于第二个操作数(符号标志 SF=1),则跳转。这同样通常用于带符号数的比较。
JGE(Jump if Greater or Equal):如果第一个操作数大于等于第二个操作数,则跳转。
JLE(Jump if Less or Equal):如果第一个操作数小于等于第二个操作数,则跳转。
1
2
call:用于跳转到子程序(即函数)的地址。在跳转之前,它会将下一个指令的地址(即返回地址)推入栈中。当子程序执行完毕后,ret指令会从栈中弹出这个地址,以便CPU回到调用点继续执行。
ret:结束当前的子程序或函数调用,从堆栈中弹出之前保存的返回地址,并将控制权转移到该地址,继续执行调用点后的指令。
1
loop:用于实现循环操作。它依赖于CX寄存器来控制循环的次数。每次执行LOOP指令时,CX寄存器的值会减1,当CX的值减到0时,循环结束。