一、条件转移指令

助记符检测的转移条件功能描述
JE/JZZF=1Jump Equal == 跳转Jump Zero =不跳转
JNE/JNZZF=0Jump Not Equal!= 跳转Jump Not Zero ==不跳转
JG/JNLEZF=0&&SF=OFJump Greater >跳转Jump Not Less or Equal <=不跳转
JGE/JNLSF=OFJump Greater Equal>=跳转Jump Not Less <不跳转
JL/JNGESF!=OFJump Less <跳转Jump Not Greater or Equal >=不跳转
JLE/JNG**ZF=1 SF!=OF**

二、代码测试

JE/JZ != 不跳转

JNZ/JNE == 不跳转

JG/JNLE <= 不跳转

JGE/JNL < 不跳转

JL/JNGE >= 不跳转

JLE/JNG > 不跳转

三、标志寄存器PSW(程序状态字寄存器PSW)

1514131211109876543210
OFDFIFTFSFZF AF PF CF
溢出方向标志中断标志位跟踪标志符号标志位零 标志 辅助进位 奇偶 进位

四、常用记录

通用寄存器 32位 EAX EBX ECX EDX EDI ESI EBP ESP
通用寄存器 64位 RAX RBX RCX RDX RDI RSI RBP RSP //增加了R8-R15

mov eax,123 |立即寻址
mov eax,ebx |寄存器寻址

mov eax,dword ptr ds:[150330575] |直接寻址
//以下属于间接寻址
mov eax,dword ptr ds:[eax] |寄存器间接寻址
mov eax,dword ptr ds:[ebx+33] |基址+偏移
mov eax,dword ptr ds:[ebx+edx] |基址+变址 //基址变址寻址
mov eax,dword ptr ds:[ecx+edx+33] |基址+变址+偏移 //相对基址变址寻址
mov eax,dword ptr ds:[ecx4] |变址常量 //比例变址寻址方式
mov eax,dword ptr ds:[eax+ebx4] |基址+变址常量
mov eax,dword ptr ds:[eax+ebx4+330] |基址+变址常量+偏移

cmp指令 与sub指令相似 做一个减法的运算

Cmp eax,ebx //eax-ebx 相等时 ZF=1 其它情况ZF=0

Sub eax,ebx //eax=eax-ebx 相等时 ZF=1 其它情况ZF=0

JE/JZ 相等时跳转 if(a!=b){代码块1} else {代码块2}

JNE/JNZ 不相等跳转 if(a==b){代码块1} else {代码块2}

五、X86/X64call传参

X86---------------------

ebp+8+4*下标 //第几个参数 0,1,2,3,4

ebp+08
ebp+0C
ebp+10
ebp+14
ebp+18
ebp+1C
ebp+20

ebp-?? // 局部变量 栈帧上分配的空间

X64---------------------

rcx/ecx/cx/cl //第1个参数
rdx/edx/dx/dl //第2个参数
r8 /r8d/r8w/r8l //第3个参数
r9 /r9d/r9w/r9l //第4个参数

[rsp+20] // 第5个参数 [rsp+20+8*第几个参数] //0
[rsp+28] // 第6个参数
[rsp+30] // 第7个参数
[rsp+38] // 第8个参数
[rsp+40] // 第9个参数

六、CALL RET 汇编动作

call
1 esp = esp-4
2 把CALL指令的下一条指令地址 入栈

ret 指令的2个动作
1 跳转到[esp]
2 esp=esp+4

七、堆栈和变量

栈和局部变量的关系
栈的概念与栈底EBP,栈顶ESP的常识
汇编指令ebp与esp //RBP RSP
汇编指令push与pop

汇编指令sub与add
汇编指令lea 取地址&
汇编指令call与ret

栈具有固定大小,并以数组形式实现,栈是一个后进先出的结构.
栈有两个主要操作:入栈(push,也被称为压栈)和出栈(pop,也被称为弹栈)。

Last modification:December 27, 2024
如果觉得我的文章对你有用,请收藏