XOR使寄存器清零:

xor 寄存器, 寄存器作用是使寄存器清零,相较于mov 寄存器, 0xor它占用2个byte,而mov更多。
此外,对于x64,xor eax, eax也会清除rax的高32位。

初始化结构体可能发生一个指令初始化多个变量

mov eax, xxx当eax储存一个指向结构体的指针,假如有一个结构体布局如下:

  1. +0x000 TYPE :UChar
  2. +0x001 Importance :UChar
  3. +0x002 Number :Uint2B
  4. +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:

  1. Length Assembly Byte Sequence
  2. ------- ------------------------------------------ --------------------------
  3. 1 byte nop 90
  4. 2 bytes 66 nop 66 90
  5. 3 bytes nop dword ptr [eax] 0F 1F 00
  6. 4 bytes nop dword ptr [eax + 00h] 0F 1F 40 00
  7. 5 bytes nop dword ptr [eax + eax*1 + 00h] 0F 1F 44 00 00
  8. 6 bytes 66 nop word ptr [eax + eax*1 + 00h] 66 0F 1F 44 00 00
  9. 7 bytes nop dword ptr [eax + 00000000h] 0F 1F 80 00 00 00 00
  10. 8 bytes nop dword ptr [eax + eax*1 + 00000000h] 0F 1F 84 00 00 00 00 00
  11. 9 bytes 66 nop word ptr [eax + eax*1 + 00000000h] 66 0F 1F 84 00 00 00 00 00

注意:你不能假设编译器一定会区分开

  1. nop dword ptr [eax + 00h]
  2. nop dword ptr [eax + 00000000h]

参考资料https://www.felixcloutier.com/x86/nop