2007/02/18

Quadword Aligned

昨天最後做了一張 variadic arguments 的投影片,裡面最後一句說如果 printf 的引數不夠多,"the behavior is undefined, e.g. printing out the previous call’s local variables." 為了驗證這一句,上 linux6 工作站寫段測試程式,在 main 裡面放一個 unsigned long i = 5; 然後呼叫 printf("%lu\n");。很可惜地,沒有出現預期的結果 XD。於是改成 printf("%lu %lu %lu %lu %lu\n");,還是沒有。於是我讓 gcc 譯出 assembly 看看它在 stack 裡面塞了什麼東西,看到傳說中的 rsp, rbp 等 64-bit registers,也看到它把第一引數塞在 edi。多傳兩個引數,也被塞在 esi 和 edx XD。之後才知道:

The standard calling convention used by C programs under Linux on x86-64 is a little different; see System V Application Binary Interface—AMD64 Architecture Processor Supplement for details. Specifically, it optimizes calls by passing the first few arguments in registers instead of on the stack.

(from http://web.mit.edu/6.035/www/handouts-2005/x86-64-architecture-guide.html#calling_convention)

於是轉到一般 x86 的工作站上測試。在其中一台機器成功印出 i 值,不過排在第四個。再翻 assembly,發現神祕的現象:

Josh Ko says: (上午 1:33:48)
為什麼都有一行 and  %esp, -16 XD
...
Josh Ko says: (上午 1:34:49)
該不會是傳說中的 align 吧 XD
...
Josh Ko says: (上午 1:40:43)
這一次還特地先騰出三個 int 的空間才呼叫 printf XD
...
Josh Ko says: (上午 1:40:58)
呼叫完馬上就丟掉了 XD
Josh Ko says: (上午 1:41:19)
sub %esp, 12
push OFFSET FLAT:.LC0
call printf
add %esp, 16
...
Josh Ko says: (上午 1:41:48)
呼叫完就丟掉了,所以完全是為呼叫準備的 XD
...
Josh Ko says: (上午 1:42:55)
也可能是要湊倍數 XD

然後剛剛看到了,雖然是 PPC 的文件,不過應該沒錯 XD:

To ensure optimal alignment, the stack pointer is quadword aligned (i.e., its address is a multiple of 16).

(from The PowerPC Compiler Writer's Guide)

這應該能解釋一切 ─ computer architecture 要好好學 XD。

--
and %esp, -16 乍看之下完全不知道發生什麼事 XD。

Labels:

Blogger Fall2/18/2007 2:10 pm 說:

這也告訴我,組合語言要好好學。
--
碰到組語->Dead…

 

<< 回到主頁