汇编指令基础
1.EFLAGS
2.测试与比较
2.1 test
1 |
|
2.2 cmp
1 |
|
3.跳转
3.1 JCC条件跳转
- 短跳:2字节,1字节硬编码 + 1字节有符号偏移
- 长跳:6字节,2字节硬编码 + 4字节有符号地址
指令 | 短跳 | 长跳 | 含义 | EFLAGS |
---|---|---|---|---|
JZ/JE | 0x74 | 0x0F 0x84 | 相等则跳转 | ZF == 1 |
JNZ/JNE | 0x75 | 0x0F 0x85 | 不相等则跳转 | ZF == 0 |
JS | 0x78 | 0x0F 0x88 | 负数则跳转 | SF == 1 |
JNS | 0x79 | 0x0F 0x89 | 正数则跳转 | SF == 0 |
JP/JPE | 0x7A | 0x0F 0x8A | 1出现次数为偶数则跳转 | PF == 1 |
JNP/JPO | 0x7B | 0x0F 0x8B | 1出现次数为奇数则跳转 | PF == 0 |
JC/JB/JNAE | 0x72 | 0x0F 0x82 | 无符号数 (进位)低于则跳转 | CF == 1 |
JNC/JNB/JAE | 0x73 | 0x0F 0x83 | 无符号数 (不进位)高于等于则跳转 | CF == 0 |
JO | 0x70 | 0x0F 0x80 | 有符号数 溢出则跳转 | OF == 1 |
JNO | 0x71 | 0x0F 0x81 | 有符号数 无溢出则跳转 | OF == 0 |
JBE/JNA | 0x76 | 0x0F 0x86 | 无符号数 低于等于则跳转 | ZF == 1 || CF == 1 |
JNBE/JA | 0x77 | 0x0F 0x87 | 无符号数 高于则跳转 | ZF == 0 || CF == 0 |
JL/JNGE | 0x7C | 0x0F 0x8C | 有符号数 小于则跳转 | SF != OF |
JNL/JGE | 0x7D | 0x0F 0x8D | 有符号数 大于等于则跳转 | SF == OF |
JLE/JNG | 0x7E | 0x0F 0x8E | 有符号数 小于等于则跳转 | ZF != OF || ZF == 1 |
JNLE/JG | 0x7F | 0x0F 0x8F | 有符号数 大于则跳转 | SF == 0F && ZF == 0 |
3.2 CALL无条件跳转
1 |
|
跳转目标地址 = 当前指令地址 + 当前指令长度 + 4字节偏移
1 |
|
x86:后面跟4字节内存地址。
跳转目标地址 = ptr:[ 4字节内存地址 ]
x64:后面跟4字节偏移,再使用偏移计算公式得到4字节内存地址。
跳转目标地址 = ptr:[ 当前指令地址 + 当前指令长度 + 4字节偏移 ]
1 |
|
跳转目标地址 = 4字节地址、cs = 目标cs
3.3 JMP无条件跳转
1 |
|
跳转目标地址 = 当前指令地址 + 当前指令长度 + 1字节偏移
1 |
|
跳转目标地址 = 当前指令地址 + 当前指令长度 + 4字节偏移
1 |
|
x86:后面跟4字节内存地址。
跳转目标地址 = ptr:[ 4字节内存地址 ]
x64:后面跟4字节偏移,再使用偏移计算公式得到4字节内存地址。
跳转目标地址 = ptr:[ 当前指令地址 + 当前指令长度 + 4字节偏移 ]
1 |
|
跳转目标地址 = 4字节地址、cs = 目标cs
3.4 x64下的Inline HOOK
enter
1 |
|
ret
1 |
|
4.基本运算
4.1 除法
无符号:div + 除数
有符号:idiv + 除数,余数的符号与被除数相同。
被除数 | 除数 | 商 | 余数 |
---|---|---|---|
ax | reg/mem8 | al | ah |
dx:ax | reg/mem16 | ax | dx |
edx:eax | reg/mem32 | eax | edx |
rdx:rax | reg/mem64 | rax | rdx |
4.2 乘法
单操作数:
无符号:mul + 乘数
有符号:imul + 乘数
被乘数 | 乘数 | 乘积 |
---|---|---|
al | reg/mem8 | ax |
ax | reg/mem16 | dx:ax |
eax | reg/mem32 | edx:eax |
rax | reg/mem64 | rdx:rax |
对于无符号数,计算后如果dx/edx/rdx寄存器不为0,则CF位被置位。
对于有符号数,计算后如果dx/edx/rdx寄存器不为ax/eax/rax的符号扩展,则OF和CF位被置位。
双操作数:不支持8位,必须是有符号数。
1 |
|
三操作数:不支持8位,必须是有符号数。
1 |
|
4.3 移位
逻辑:shl、shr
算数:sal、sar
逻辑左移与逻辑左移没区别,算数右移左边补符号位,逻辑右移坐标补0。右移除以2,左移乘以2。
5.数据传送
5.1 扩展传送
1 |
|
5.2 隐式传送
1 |
|
5.3 字符串获取
1 |
|
5.4 字符串加载
1 |
|
汇编指令基础
http://helloymf.github.io/2022/09/12/asm-basic/