2014-05-10 47 views
2

我是新手到組件的編程和我試圖通過64但GNC編譯器(GCC)發射的組件進行解碼。彙編代碼:後面邏輯計算偏移量堆

void fun(int a, int b) 
    { 
    int h=0; 
    } 

    int main() 
    { 
    int d = 0; 
    fun(d,10); 
    } 

的大會,這是

.globl fun 
    .def fun; .scl 2; .type 32; .endef 
fun: 
    pushq %rbp  # 
    movq %rsp, %rbp #, 
    subq $16, %rsp #, 
    movl %ecx, 16(%rbp) # a, a 
    movl %edx, 24(%rbp) # b, b 
    movl $0, -4(%rbp)  #, h 
    leave 
    ret 
    .def __main; .scl 2; .type 32; .endef 
.globl main 
    .def main; .scl 2; .type 32; .endef 
main: 
    pushq %rbp  # 
    movq %rsp, %rbp #, 
    subq $48, %rsp #, 
    call __main # 
    movl $0, -4(%rbp)  #, d 
    movl -4(%rbp), %eax # d, tmp59 
    movl $10, %edx #, 
    movl %eax, %ecx # tmp59, 
    call fun # 
    leave 
    ret 

我對本次大會的一些疑慮。

[1]什麼是用於在主從棧指針中減去48的精確算術。 [2]的樂趣,相信從基指針的偏移量來訪問參數從16(返回地址和基指針即兩個存儲器位置進棧(stack幀爲8個字節)開始的功能,但爲什麼下一偏移是24而不是16

movl %ecx, 16(%rbp) # a, a 
    movl %edx, 24(%rbp) # b, b 

爲什麼它不是: MOVL%ecx中,16(%RBP)#A,A MOVL%EDX,20(%RBP)#b,b

[3 ]什麼是後面在樂趣從棧指針中減去16,當只有一個局部變量所涉及的邏輯。不應該是其8?

謝謝。

+0

我不能重現你的裝配也不管我嘗試哪些選項和gcc版本:http://pastebin.com/Fa6TLqWC編譯器使用:http://gcc.godbolt.org/ – Brandon

回答

0
  1. 一般來說,你只能猜測爲什麼編譯器它做什麼。在這種情況下,優化顯然沒有啓用,所以編譯器可能只是分配一個最壞情況下的棧幀,而這個幀沒有被優化。您可能想嘗試啓用優化。
  2. rbp指向堆棧上的推rbprbp+8是返回地址,rbp+16是第一個參數,rbp+24是第二個參數。請注意,在64位模式下,堆棧用於8個字節的塊。
  3. 大概調用約定要求16字節對齊。

要點[2][3]請參閱相應的abi文檔。