0
我不明白爲什麼下面幾行是使用movl
來推送數據在堆棧指針下由GCC生成。C函數調用約定:爲什麼movl代替pushl?
movl -4(%ebp), %eax # -4(%ebp) <- local variable 1
movl 8(%ebp), %edx # 8(%ebp) <- first parameter
movl %edx, 8(%esp) # ??? WHY NOT: pushl %edx
movl %eax, 4(%esp) # ??? WHY NOT: pushl %eax
movl -8(%ebp), %eax # ??? WHY NOT: pushl -8(%ebp)
movl %eax, (%esp)
call athena
movl %eax, f
我想這段代碼試圖推動3個參數的函數調用。但爲什麼不使用pushl
。這段代碼的用法是什麼?它是如何工作的?
我不知道它爲什麼這樣工作。也許是因爲代碼與通過寄存器傳遞參數的x86-64相似? (例如,它們只會有一個「裝入值」指令)。 另外,你見過這個問題嗎? http://stackoverflow.com/questions/22267767/why-is-gcc-using-mov-instead-of-push-in-function-calls – Marco
PUSH是一種傳統的指令,在現代內核上執行不力。它對ESP寄存器的值有間接的依賴關係。這使得執行亂序很難。 MOV沒有這樣的問題。如英特爾優化手冊中所述,編碼規則25. –
這裏是否缺少某些東西?我希望在'movel's會是'sub%esp,xxx'之前的某個地方,其中'xxx'是要傳遞參數的大小?然後當電話返回時,不久之後,'add%esp,xxx'? – lurker