X86-64 CPU架構以及64 位GCC對程序編譯處理的一些變化

X86-64 CPU架構以及64 位GCC對程序編譯處理的一些變化

作者:JochenZou
轉載請註明出處:http://blog.csdn.net/youkawa/article/details/45458921

  1. 通用寄存器全部擴展到了64位,寄存器名稱前面由R開頭,如RAX, RBX, RCX, RDX, RSI和RDI
  2. 指令指針(Instruction pointer)、基址指針(base pointer)以及堆棧指針(stack
    pointer)也全部擴展到了64位,這些專用寄存器分別稱爲RIP,RBP,RSP
  3. 添加了8個通用寄存器R8~R15
  4. 指針長度爲64位即8-bytes長度;
  5. 涉及到棧操作的Push/pop指令入棧出棧操作數的長度爲64位即8-bytes長度;
  6. 函數參數主要依靠6個寄存器來傳遞,當寄存器不夠用時才把參數壓入棧中存儲。按存儲參數的順序(從左到右)依次爲RDI, RSI, RDX, RCX, R8, R9
  7. 最大canonical address大小爲0x00007FFFFFFFFFFF.
  8. GCC對函數局部變量分配的空間大小爲16字節的倍數,例如分配char a[15],則回從[RBP-0X10]地址開始存放局部變量,若定義char a[17],則從[RBP-0X20]地址開始存放局部變量;
  9. GCC對函數局部變量分配空間有以下幾種方式:
    (1)當函數內部有調用其他外部函數(有CALL指令)的時候,使用SUB RSP , 0xXX指令分配棧空間, 然後使用MOV [RBP-X], 0xXX的形式入棧,如果沒有對局部變量初始化,而且函數後面也沒有使用這一變量,則GCC不會爲其開闢空間。
    (2)當函數內部沒有調用其他外部函數時,在進行prologue操作(即push rbp; mov rbp, rsp)之後,不會有SUB RSP , 0xXX指令開闢棧空間的操作,而是直接使用MOV QWORD PTR [RBP-0xXX], 0xXX的方式直接使用棧空間;
    (3)當函數內部靜態調用lib庫函數的時候,因爲此時被調用函數內聯到了主調函數裏面,所以不會有CALL指令,仍然按(2)的方式操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章