如何理解含movl的x86汇编代码中-4(%rsp)的含义?
x86 AT&T汇编寻址与lea指令规则解答
你混淆了AT&T汇编的语法规则和其他汇编语法的寻址写法,核心错误点和解释如下:
- 首先明确:
-4(%rsp)是AT&T汇编标准的基址偏移寻址写法,没有你认为的需要额外加双层括号的规则,(-4(%rsp))属于非法语法。
这类寻址写法的含义默认对应「访问计算出的地址指向的内存空间」,仅在lea指令中有特殊定义:- 用于普通指令(如mov)时:先计算地址 = %rsp寄存器值 -4,再读写这个地址对应的内存位置,所以第一行
movl $0,-4(%rsp)是完全正确的写法,作用就是把立即数0写入rsp-4对应的内存,对应你注释的t=0逻辑。 - 用于lea指令时:lea全称是Load Effective Address(加载有效地址),设计目的就是专门做地址计算,它的源操作数哪怕用了内存寻址格式,也不会真的访问内存,只会把计算得到的地址值直接赋值给目标寄存器。你第二行的
leap属于笔误,正确写法是leaq -4(%rsp),%rax,作用就是把计算得到的rsp-4地址本身存入%rax,对应你注释的&t逻辑。
- 用于普通指令(如mov)时:先计算地址 = %rsp寄存器值 -4,再读写这个地址对应的内存位置,所以第一行
- 可以通过两个指令的对比快速理解差异:
movl -4(%rsp), %eax:读取rsp-4地址中存储的t的值,赋值给eax,等价于C逻辑eax = tleal -4(%rsp), %eax:仅计算rsp-4这个地址的数值,赋值给eax,等价于C逻辑eax = &t
内容的提问来源于stack exchange,提问作者dubugger
相关产品推荐
相关产品推荐

