2017-02-25 181 views
0

我正在研究一個計算機系統檢查問題,要求在程序中的各個點上的堆棧指針偏移量,我對如何設置堆棧幀感到困惑。我已經在32位和64位系統之間學習了幾個星期的程序集,但是我還沒有看過一條指令來指示棧指針。ANDing堆棧指針

有人可以解釋這個服務的目的是什麼,第四條指令後%esp的偏移量和我計算的%esp正確嗎?我已經在代碼中註釋了我認爲在每條指令之後偏移量的值。

main: 
0x0x0804848a <+0>: push %ebp     ;-0x4 
0x0x0804848b <+1>: mov  %esp, %ebp   
0x0x0804848d <+3>: and  $0xfffffff0, %esp ;[-0x4, -0x13] 
0x0x08048490 <+6>: sub  $0x20, %esp   ;[-0x24, -0x33] 
0x0x08048493 <+9>: movl $0xa, 0x1c(%esp)   
0x0x0804849b <+17>: movl $0xa, (%esp)   
0x0x080484a2 <+24>: call 0x804841d <r>  ;[-0x28, -0x37] 
+1

它意味着將sp設置爲16字節對齊的地址。下一條指令現在分配8個整數。 –

+0

實際上是16個字節。 –

回答

2

如果你用從0x3開始的堆棧指針重複你的算術,你將會開悟。

對齊。許多類型的CPU需要對齊才能獲得最佳性能或像SSE這樣的向量指令才能工作。

+2

值得注意的是,這是因爲堆棧向下增長。因此,取出較低的位使得sp指向未使用的堆棧內存。 –