X

曜彤.手记

随记,关于互联网技术、产品与创业

  1. NASM 程序结构
  2. 常用指令说明
  3. 寄存器
  4. AMD64 ABI 调用规范

NASM 小记录

本文记录一些在使用 NASM 时遇到的常用信息,以供快速查阅之用。

NASM 程序结构

常用指令说明

寄存器

X86-64 下的可用寄存器(16 个 64 位的整型寄存器):

  • r0(rax):算术指令中使用的一种“累加器”。通常也作为系统调用的序号,以及返回值的容器;Accumulator;
  • r1(rcx):用于循环控制;Cycle;
  • r2(rdx):在输入/输出操作期间存储数据。通常也作为系统调用中参数传递寄存器(第三个参数);Data;
  • r3(rbx):基址寄存器,用于存放早期处理器模型中的基址;Base;
  • r4(rsp):类似 i386 下的 esp,指向进程栈的栈顶;Stack;
  • r5(rbp):类似 i386 下的 ebp,栈帧寄存器,默认指向旧的 rbp 的值;Stack Base;
  • r6(rsi):字符串操作命令中的源索引;通常也作为系统调用中参数传递寄存器(第二个参数);Source Index;
  • r7(rdi):字符串操作命令中的目标索引;通常也作为系统调用中参数传递寄存器(第一个参数);Destination Index;
  • r8 - r15:通常用于存储临时变量;

AMD64 ABI 调用规范

  • 一定范围个数的参数通过寄存器传递,整数:rdi / rsi / rdx / rcx / r8 / r9,浮点数:xmm0 / xmm1 / xmm2 / xmm3 / xmm4 / xmm5 / xmm6 / xmm7;
  • 多余的参数通过栈传递,从右到左。由调用者来清理栈;
  • 当参数传递完毕后,函数被调用,[rsp] 指向函数返回地址,[rsp + 8] 指向栈空间中的第一个传入的参数(rbp 没有被应用);
  • rsp 在函数调用前需满足 16-byte 的内存边界对齐;
  • Callee-saved 寄存器 rbx \ rbp \ r12-r15 必须由被调用方保存状态,并在结束前重置(指如果在函数调用过程中被修改的话。其中 rbp 不推荐使用)
  • 被调用方还应该保存 XMCSR 和 x87 控制字的控制位,但是 x87 指令在 64 位代码中很少见,因此不必太担心这一点;
  • 整数返回值可以存放在 rax 或 rdx + rax 中,浮点值存放在 xmm0 或 xmm1 + xmm0 中;

(待更新)




评论 | Comments


Loading ...