簡體   English   中英

mov指令和寄存器 - 混亂!

[英]mov instructions & registers - confusion !

我正在閱讀“計算機系統:程序員視角”,第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 (強調 - 存儲值,而不是地址)

我是對的 ? 謝謝 !

是的,聽起來你說得對。 恕我直言,AT&T 8(%ebp)語法不如英特爾[ebp+8]更直觀,后者更為清晰。 括號顯示您正在使用寄存器中地址的值,該數字是您實際需要的地址的偏移量。

是的,這是使用AT&T語法,其形式如下:

instruction     source, dest

英特爾組裝是相反的順序

你也正確地從幀指針向上移動8個字節的8(%ebp) 特別是它移動8個字節的原因是因為參數以相反的順序被壓入堆棧(當查看典型的函數調用時,“右”到“左”)。 因此,首先推送y ,然后是xp ,最后是調用函數的返回地址(這就是為什么你移動8個字節而不是4個字節)。

你需要了解什么是堆棧框架。 了解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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM