[英]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個字節)。
你需要了解什么是堆棧框架。 了解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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.