一、条件转移指令
助记符 | 检测的转移条件 | 功能描述 | |
---|---|---|---|
JE/JZ | ZF=1 | Jump Equal == 跳转 | Jump Zero !=不跳转 |
JNE/JNZ | ZF=0 | Jump Not Equal!= 跳转 | Jump Not Zero ==不跳转 |
JG/JNLE | ZF=0&&SF=OF | Jump Greater >跳转 | Jump Not Less or Equal <=不跳转 |
JGE/JNL | SF=OF | Jump Greater Equal>=跳转 | Jump Not Less <不跳转 |
JL/JNGE | SF!=OF | Jump 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)
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | 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,也被称为弹栈)。