Operation System: 關於暫存器和棧
對於Intel架構的處理器,從8位的暫存器(8位的CPU)一直演進到如今的64位(64位暫存器),為了承上啟下,到現在的64位的CPU還是可以運行當年8位CPU的程式,而如今的暫存器當中,依然是可以從64位中分出8位來應對8位的程式。
如今的暫存器如下圖所示:(圖片來源:http://wdxtub.com/2016/04/16/thin-csapp-2/):
如圖所示,%ah, %al是8位的。%ax包含ah和al,是16bits。eax是32位,包含前面兩種。另外最大的rax是64bits的。有幾個暫存器有特殊的用途:%rax用來存返回值。%rsp是用來保持棧指標地址的,也就是當呼叫函式的時候要往下移的那個指標。其餘的暫存器都可以用來寄存臨時值。
其實還有一個暫存器叫:%rip,其實就是我們所指的PC。是無法訪問和改變的。
另外,值得一提的是,到了64位的時代,傳參的方式和32位不同了。32位的傳參是通過呼叫函式前的壓棧,不斷把新的引數壓到棧中。而64bits則是通過把引數移到暫存器中。
Arguments passed in registers:
%rdi, %rsi, %rdx, %rcx, %r8, %r9
Return value: %rax
棧是每個程序分得的記憶體空間的一部分。從http://blog.csdn.net/firehotest/article/details/52337697 這篇文章可以看出,棧是rsp不斷往地址低反向增長的記憶體區域,而堆則是相反的,不斷往地址增加的方向。它們兩者共享著一篇為了程式增長所預留的空間。
所以,棧的形態如圖:
棧的經典behavior是每次呼叫函式前,就是把return address push(程式程式碼也會在記憶體裡的)進去。緊接著return address的就是另一片屬於另外一個函式的記憶體空間了。