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