XOR使寄存器清零:
xor 寄存器, 寄存器
作用是使寄存器清零,相较于mov 寄存器, 0
,xor
它占用2个byte,而mov
更多。
此外,对于x64,xor eax, eax
也会清除rax的高32位。
初始化结构体可能发生一个指令初始化多个变量
mov eax, xxx
当eax储存一个指向结构体的指针,假如有一个结构体布局如下:
+0x000 TYPE :UChar
+0x001 Importance :UChar
+0x002 Number :Uint2B
+0x004 DpcListEntry :_LIST_ENTRY
则mov eax, 0x113
不但用0x13初始化了TYPE,还用0x01初始化了Importance(注意根据小端储存来分析)
这种骚操作由编译器实现。
Jcc(cc: conditional code)是区分有符号/无符号类型的方法之一
条件代码 | 文字描述 | 机器描述 |
---|---|---|
B/NAE | 小于 无符号 | CF = 1 |
NB/AE | 不小于 无符号 | CF = 0 |
E/Z | 等于/为零 | ZF = 1 |
NE/NZ | 不等于/不为零 | ZF = 0 |
L | 小于 有符号 | (SF ^ OF) = 1 |
GE/NL | 大于或等于 有符号 | (SF ^ OF) = 0 |
G/NLE | 大于 有符号 | ((SF ^ OF) | ZF) = 0 |
看着没用也确实“没用”的nop
nop
是单字节的“无操作”,其本质是xchg (e)ax, (e)ex
的别名,相当于啥也没干,但实际上编译器可以利用nop实现对齐。
还有multi-byte nop, 则是一系列长度不等的“啥也不干”指令。
intel手册原文:
The multi-byte NOP instruction performs no operation on supported processors and generates undefined opcode exception on processors that do not support the multi-byte NOP instruction. The memory operand form of the instruction allows software to create a byte sequence of “no operation” as one instruction. For situations where multiple-byte NOPs are needed, the recommended operations (32-bit mode and 64-bit mode) are:
Length Assembly Byte Sequence
------- ------------------------------------------ --------------------------
1 byte nop 90
2 bytes 66 nop 66 90
3 bytes nop dword ptr [eax] 0F 1F 00
4 bytes nop dword ptr [eax + 00h] 0F 1F 40 00
5 bytes nop dword ptr [eax + eax*1 + 00h] 0F 1F 44 00 00
6 bytes 66 nop word ptr [eax + eax*1 + 00h] 66 0F 1F 44 00 00
7 bytes nop dword ptr [eax + 00000000h] 0F 1F 80 00 00 00 00
8 bytes nop dword ptr [eax + eax*1 + 00000000h] 0F 1F 84 00 00 00 00 00
9 bytes 66 nop word ptr [eax + eax*1 + 00000000h] 66 0F 1F 84 00 00 00 00 00
注意:你不能假设编译器一定会区分开
nop dword ptr [eax + 00h]
nop dword ptr [eax + 00000000h]