EVEXprefix选择 EVEX 编码形式,使指令可以使用掩码、零化等扩展能力。
汇编语言是机器指令的文本表示。学习它的目标通常不是手写完整应用,而是理解 ABI、调用约定、栈帧、编译器生成代码和底层性能行为。
C/C++ 源码 → 预处理 → 汇编 → 目标文件 → 链接 → 可执行文件可以让编译器保留可读汇编:
gcc -O2 -S -masm=intel demo.c -o demo.s
objdump -d -Mintel ./demo较长的指令语法可以拆成若干语义槽位,助记符内部也能继续按字母分段。将鼠标移到片段或释义上,或用键盘聚焦片段,可以看到二者的对应关系。
EVEX.02v03add04p05d06{k}07{z} 08xmm0 09xmm1 10xmm2EVEXprefix选择 EVEX 编码形式,使指令可以使用掩码、零化等扩展能力。
vmnemonic表示 VEX/EVEX 编码的非破坏性向量指令形式。
addoperation对对应位置的元素执行加法。
pshape| 取值 | 含义 |
|---|---|
p | packed:一次处理多个元素 |
s | scalar:只处理最低位元素 |
dtype| 取值 | 含义 |
|---|---|
d | double:64 位双精度浮点数 |
s | single:32 位单精度浮点数 |
{k}modifier由操作掩码寄存器控制哪些目标元素会被写入。
{z}modifier未通过掩码的目标元素写零;省略时采用合并策略。
xmm0destination接收运算结果的 128 位向量寄存器。
xmm1source提供第一组待相加的双精度浮点元素。
xmm2source提供第二组待相加的双精度浮点元素。
; Intel 语法:计算 eax = edi + esi
add_two:
mov eax, edi
add eax, esi
ret在 x86-64 System V ABI 中,前两个整数参数通常位于 edi、esi,返回值放在 eax。不同平台的调用约定可能不同,阅读反汇编时必须先确认目标架构和 ABI。
先掌握十六进制、补码和位运算,再学习寄存器与寻址,随后观察简单 C 函数在 -O0 和 -O2 下的差异。调试时可使用 GDB 的 disassemble、info registers 和 x 命令。
