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: Programming
這也告訴我,組合語言要好好學。
--
碰到組語->Dead…
<< 回到主頁