mov指令&寄存器 - 混乱!

时间:2010-11-04 03:05:53

标签: assembly

我正在阅读“计算机系统:程序员视角”,第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中(强调 - 存储值,不是地址)

我是对的? 谢谢!

3 个答案:

答案 0 :(得分:14)

是的,听起来你说得对。恕我直言,AT& T 8(%ebp)语法不如英特尔[ebp+8]更直观,更明确。括号显示您正在使用寄存器中地址的值,该数字是您实际需要的地址的偏移量。

答案 1 :(得分:3)

是的,这是使用AT& T语法,其形式为:

instruction     source, dest

英特尔程序集the opposite order

从框架指针向上移动8个字节8(%ebp)你也是对的。特别是它移动8个字节的原因是因为参数以相反的顺序被压入堆栈(当查看典型的函数调用时,“右”到“左”)。因此,首先推送y,然后推送xp,最后推送调用函数的返回地址(这就是为什么你移动8个字节而不是4个字节)。

答案 2 :(得分:1)

您需要了解什么是堆栈框架。了解确切pushpop指令的作用。 在该代码之前有一个

   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