在給定的時刻只能有乙個過程是活動的, 它佔使用cpu的程式暫存器組. 程式暫存器組作為乙個單個資源被所有的函式過程共享. 所以, 我們必須保證: 乙個過程(呼叫者)呼叫另乙個(被呼叫者)時, 被呼叫者不會覆蓋某個呼叫者稍後會使用到的暫存器的值.
為此, ia32(俗稱x86)採用了一組統一的暫存器使用慣例., 所有的過程呼叫都必須遵守, 包括程式庫中的過程.
根據慣例, 暫存器%eax, %ecx, %edx被劃分為由
呼叫者儲存的暫存器
. 暫存器%ebx, %esi, %edi被劃分為
由被呼叫者儲存的暫存器
. 此外,
每個函式被呼叫時,須儲存暫存器%ebp和%esp.
int p()
過程p希望它計算出來的x值在呼叫了q之後仍然有效. 如果x放在乙個呼叫者儲存暫存器中, 而p(呼叫者)必須在呼叫q之前儲存這個值, 並在q返回之後恢復該值.
如果x在乙個被呼叫者儲存暫存器中, q(被呼叫者)想使用這個暫存器, 那麼q在使用這個暫存器之前, 必須儲存這個值, 並在返回前恢復它.
在這兩種情況中, 儲存就是將暫存器的值壓入棧中, 而恢復是指從棧中彈出到暫存器中.
《深入理解計算機系統》
暫存器使用
x64 體系結構提供了 16 個通用暫存器 以後稱為整數暫存器 以及 16 個可供浮點使用的 xmm 暫存器。易失暫存器是由呼叫方假想的臨時暫存器,並要在呼叫過程中銷毀。非易失暫存器需要在整個函式呼叫過程中保留其值,並且一旦使用,則必須由被呼叫方儲存。下表說明了每種暫存器在整個函式呼叫過程中的使用方...
組合語言之暫存器使用bx si di bp
自 如果你看到這篇部落格時正在做第七章問題,強烈建議先去把8.1 8.4看了,因為你在這章寫 踩的有關 的坑,在8.1 8.4都有說明,下面都是8.1的內容 暫存器的分類 暫存器主 要 用 途通用 暫存器資料 暫存器ax 乘 除運算,字的輸入輸出,中間結果的快取 al位元組的乘 除運算,位元組的輸入...
認識處理器 暫存器使用(待改)
對於乙個組合語言程式設計人員來說是不可或缺的。現在你知道,暫存器是處理器內部的一些儲存資料的儲存單元。僅僅了解這些是不足以寫出乙個可用的組合語言程式的,但你已經可以大致讀懂一般組合語言程式了 不必驚訝,因為組合語言的祝記符和英文單詞非常接近 因為你已經了解了關於基本暫存器的絕大多數知識。在正式引入第...