我正在阅读“计算机系统:程序员视角”,第3章解释mov
指令,并且书中的解释让我感到困惑。
提供功能(第142页1版)
int exchange( int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
功能正文的汇编代码
movl 8(%ebp), %eax //Get xp
movl 12(%ebp), %edx //Get y
movl (%eax), %ecx //Get x at *xp
movl %edx, (%eax) //Store y at *xp
movl %ecx, %eax //Set x as return value
让我感到困惑的是,将要存储的是什么,以及在哪里 以下是我对此的理解:
movl 8(%ebp), %eax //Get xp
CPU在堆栈中向上移动+8个字节(来自帧指针%ebp
),获取存储在该位置的值,并将此值存储在寄存器%eax
中(强调 - 存储值,不是地址)
我是对的? 谢谢!
答案 0 :(得分:14)
8(%ebp)
语法不如英特尔[ebp+8]
更直观,更明确。括号显示您正在使用寄存器中地址的值,该数字是您实际需要的地址的偏移量。
答案 1 :(得分:3)
是的,这是使用AT& T语法,其形式为:
instruction source, dest
英特尔程序集the opposite order。
从框架指针向上移动8个字节8(%ebp)
你也是对的。特别是它移动8个字节的原因是因为参数以相反的顺序被压入堆栈(当查看典型的函数调用时,“右”到“左”)。因此,首先推送y
,然后推送xp
,最后推送调用函数的返回地址(这就是为什么你移动8个字节而不是4个字节)。
答案 2 :(得分:1)
您需要了解什么是堆栈框架。了解确切push
和pop
指令的作用。
在该代码之前有一个
push y_val
push xp_ptr
call exchange
.cont
...
.exchange
push ebp
mov ebp, esp
// .. rest of code
// stack frame:
old_ebp_val ; [ebp] points here
.cont ; [ebp + 4]
xp_ptr ; [ebp + 8]
y_val