由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該暫存器裡面的內容進行保護,以至於不會出錯,暫存器的保護規則也是因為程式的不可再現性而存在的。
在ia32上,實行了乙個統一的暫存器保護規則。首先,我們要看一下,計算機中有多少個比較重要的暫存器
(偷偷懶我就不寫暫存器前面的百分號了o(∩_∩)o)
eax 這個暫存器屬於呼叫者儲存暫存器,通常用來儲存一些函式的返回值
edx ecx這兩個也是屬於呼叫者儲存暫存器,並且 屬於通用暫存器,可以隨意儲存資料,沒有 什麼特定的 限制。
ebx edi esi這三個暫存器屬於被呼叫者儲存暫存器。通常來說edi 和 esi可能會儲存一些被呼叫函式的引數。
這裡要說明一下乙個概念,就是我很疑惑的,什麼叫做呼叫者儲存暫存器,什麼叫做被呼叫者儲存暫存器。
兩者的區別,我覺得可以用下面的圖示來說明一下。
上面的圖示說明 ,暫存器按照規則被分類了,左面的三個暫存器是呼叫者負責儲存,右邊三個暫存器是被呼叫者負責儲存。也就是說,在過程呼叫的時候,如果被呼叫者程式會覆蓋左邊三個暫存器的內容,那麼,如果這三個暫存器內容在過程呼叫結束之後還要用到沒呼叫過程之前的那個數值的話,就要有人在過程呼叫發生之前儲存這個暫存器裡面的數值,但是由誰來儲存呢?只能由呼叫者去儲存,也就是說,被呼叫者是不會管你這裡面有什麼重要的資料的,他拿過來就用,但是呼叫者如果需要這裡面的資料,就要自己提前儲存。說的再直白一點,就是暫存器是任何程式都可以隨便用的,但是裡面資料的儲存工作就是有責任人的。左邊三個暫存器的責任人是呼叫者,右邊三個暫存器的責任人是被呼叫者。
我覺得這樣理解是正確的,如果我恰好理解反了,還希望大家給我指出來。
還有兩個比較重要的暫存器:
esp是棧頂指標的暫存器
ebp是基址暫存器
學過彙編的人會知道,在進行過程呼叫的時候,主要是用程式棧來支援過程的呼叫,並且機器也會利用棧來儲存一些引數。這樣一來,在過程呼叫中,上面兩個暫存器裡面的資料就變得相當重要。在乙個過程呼叫的時候,必須要儲存舊的ebp裡面的資料,並且初始化的時候也需要movl ebp esp這樣的指令將兩個棧指標初始化一下,之後,esp會隨著過程的呼叫進行擴充套件增長,在過程呼叫結束的時候,要有一些指令進行恢復和清理工作,把棧恢復成這次呼叫之前的樣子。那麼我們就要進行如下 兩個指令 mov ebp esp popl ebp 第一條指令是清理工作,也就是釋放棧空間,把棧頂指標移動到基址指標的地方,因為在call指令執行的時候,呼叫者會把被呼叫過程完成之後下一條指令的位址壓入棧中。所以,在popl將舊的基位址恢復之後,esp也就向棧低移動 到了下一條指令執行的位址那裡。這樣一來呼叫完成之後的恢復和清理工作也就結束了。
IAA32過程呼叫暫存器的保護規則
iaa32過程呼叫暫存器的保護規則 2014 08 07 0 收藏 由於作業系統中的共享性質,所以,暫存器也就成為了各個程序或者過程共享資源的一種。那麼發生過程 呼叫的時候,如果呼叫者要用到乙個暫存器裡面的值,但是這個暫存器的內容很可能在被呼叫者執行過程中修改,那麼我們就要在被呼叫過程執行之前,對該...
ARM9暫存器 ARM thumb 過程呼叫標準
根據 arm thumb 過程呼叫標準 1,r0 r3 用作傳入函式引數,傳出函式返回值。在子程式呼叫之間,可以將 r0 r3 用於任何用途。被呼叫函式在返回之前不必恢復 r0 r3。如果呼叫函式需要再次使用 r0 r3 的內容,則它必須保留這些內容。2,r4 r11 被用來存放函式的區域性變數。如...
STM32定時器的預裝暫存器及影子暫存器話題
摘自 經常有人問起預裝暫存器和影子暫存器的話題,其實stm32相關系列的手冊裡有介紹,有文件做介紹,這裡借花獻佛地一起分享下。在談預裝暫存器及影子暫存器的差別前,不妨先對stm32定時器的時基單元做個基本了解。stm32各系列的定時器結構和框架基本是一樣的,時基單元也一樣。下面時基單元是以stm32...