C呼叫子函式所徵用的暫存器

2021-06-19 06:34:54 字數 1510 閱讀 8554

c語言在被編譯器編譯的過程中,會有生成彙編**的過程。故而用c語言寫一段程式的內部機制跟用彙編**寫一段程式的機制時一樣的。比如在子函式中,子函式的返回值存在暫存器eax中,那麼對應的彙編**就是用eax儲存子函式的輸出值。即在c中已經包含了這個機制,但彙編**還需要用**來實現這個用eax儲存子函式返回值的機制。其實匯程式設計序擁有多種方式儲存子函式的返回值(全域性變數,某個暫存器),只是在c中呼叫彙編函式時,要符合c原有的種種機制,從而在彙編**中,用eax暫存器來儲存函式的32位返回值。

也就是說,要用彙編**寫乙個函式,能夠供c程式呼叫,那麼這段彙編**就要符合c語言程式的機制。比如將要返回的值放在eax暫存器中。在c程式中就可以按照c函式的呼叫方式呼叫此彙編函式,彙編函式在eax中存的值將自動被系統當成返回值。

在c程式中呼叫子函式時,有的暫存器有特殊的作用。c呼叫子函式所徵用的暫存器有:eax,st(0),ebx,ebp,esp,edi,esi。

儲存函式輸出變數,存函式返回值的暫存器:eax,st(0)。

eax儲存函式的輸出值,但若子函式的返回值為32位整型時,eax的值為函式返回值,為64位時用edx:eax儲存低。

st(0)用來儲存函式的的浮點型輸出值,但若子函式返回值為浮點型,st(0)的值為函式返回值。

呼叫子函式前後暫存器值必須不變的有:ebx,ebp,esp,edi,esi。

ebx被用來儲存全域性偏移表的位址值。[啥是全域性偏移表]

ebp被用來指向父函式中的棧頂。

esp被用來指向在子函式中棧的新棧頂。

edi及esi被用作區域性暫存器使用。

這些暫存器在子函式呼叫後都不得改變其值。就是說如果在子函式中要用到這些暫存器,那麼一定要對這些暫存器原有的值進行備份,使用完這些暫存器後再將備份值還原到各暫存器中。

在c中編寫彙編函式,在彙編子函式中採取這樣的結構:

.section  .text

.type  func,  @function

func:

pushl  %ebp

movl  %esp,  %ebp

subl   $12,   %esp

pushl  %edi

pushl  %esi

pushl  %ebx

popl  %ebx

popl  %esi

popl  %edi

movl  %ebp,  %esp

popl  %ebp

ret用棧備份對於父函式來說不可改變的暫存器的值,這可以當做在c程式中編寫彙編函式的固定結構。如果沒有用到某個暫存器,則響應的push和pop的**就可以省略掉。採取這樣的備份,就保證了c語言支援巢狀呼叫:子函式返回前各暫存器都得到了原來在父函式中的值,從未經改變。

可在彙編函式中隨意使用的暫存器:ecx,edx,st(1) ~~ st(7)

c note over。

用模組呼叫的方法例化暫存器

底層暫存器使用封裝例化的方式,方便插入延時與門控時鐘 降低動態功耗 也可以通過傳入引數控制儲存器的大小 例化方法 sirv gnrl dfflr e203 pc size pc dfflr pc ena,pc nxt,pc r,clk,rst n module實體 module sirv gnrl ...

IAA32過程呼叫暫存器的保護規則

iaa32過程呼叫暫存器的保護規則 2014 08 07 0 收藏 由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該...

IAA32過程呼叫暫存器的保護規則

由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該暫存器裡面的內容進行保護,以至於不會出錯,暫存器的保護規則也是因為程...