学习记录,不是任务。(* ̄、ゝ ̄)
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时,循环结束。