解析SS SP BP暫存器

2021-06-22 11:48:20 字數 1346 閱讀 1242

ss, sp, bp 三個暫存器

ss:存放棧的段位址;

sp:堆疊暫存器sp(stack pointer)存放棧的偏移位址;

bp: 基數指標暫存器bp(base pointer)是乙個暫存器,它的用途有點特殊,是和堆疊指標sp聯合使用的,作為sp校準使用的,只有在尋找堆疊裡的資料和使用個別的定址方式時候才能用到

比如說,堆疊中壓入了很多資料或者位址,你肯定想通過sp來訪問這些資料或者位址,但sp是要指向棧頂的,是不能隨便亂改的,這時候你就需要使用bp,把sp的值傳遞給bp,通過bp來尋找堆疊裡資料或者位址.一般除了儲存資料外,可以作為指標暫存器用於儲存器定址,此時它預設搭配的段暫存器是ss-堆疊段暫存器.bp是16位的,再擴充16位就是ebp,用於32位程式設計環境的.一般高階語言的引數傳遞等等,轉換為彙編後經常由bp/ebp來負責定址\處理.

sp,bp一般與段暫存器ss 聯用,以確定堆疊暫存器中某一單元的位址,sp用以指示棧頂的偏移位址,而bp可 作為堆疊區中的乙個基位址,用以確定在堆疊中的運算元位址。

(下面這個像win32彙編中的)

bp為基址暫存器,一般在函式中用來儲存進入函式時的sp的棧頂基址

每次子函式呼叫時,系統在開始時都會儲存這個兩個指標並在函式結束時恢復sp和bp的值。像下面這樣:

在函式進入時:

push bp     // 儲存bp指標

mov bp,sp  // 將sp指標傳給bp,此時bp指向sp的基位址。

// 這個時候,如果該函式有引數,則[bp + 2*4]則是該子函式的第乙個引數,[bp+3*4]則是該子函式的 第二個引數,以此類推,有多少個引數則[bp+(n-1)*4]。

.....

.....

函式結束時:

mov sp,bp  // 將原sp指標傳回給sp

pop bp       // 恢復原bp的值。

ret              // 退出子函式

下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編**

;假設執行函式前堆疊指標esp為nn

push   p2    ;引數2入棧, esp -= 4h , esp = nn - 4h

push   p1    ;引數1入棧, esp -= 4h , esp = nn - 8h

call test       ;壓入返回位址 esp -= 4h, esp = nn - 0ch (注意call指令會把返回位址壓入堆疊)

;//進入函式內

原來esp就是一直指向棧頂的指標,而ebp只是訪問某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等

複製去google翻譯

SS, SP, BP 三個暫存器

ss,sp,bp 三個暫存器 ss 存放棧的段位址 sp 堆疊暫存器sp stack pointer 存放棧的偏移位址 bp 基數指標暫存器bp base pointer 是乙個暫存器,它的用途有點特殊,是和堆疊指標sp聯合使用的,作為sp校準使用的,只有在尋找堆疊裡的資料和使用個別的定址方式時候才...

詳細解析ESP暫存器與EBP暫存器

詳細解析esp 暫存器與 ebp暫存器 最近在看彙編碼,經常在程式的開頭看到 esp和 ebp暫存器的出現 由於本人基礎知識的不牢靠 便上網查閱相關的資料 可惜網上的資料都不給力 都只是流於形式 沒有好好的解釋這兩個東西是什麼 終於通過 google 國外的 得到乙個相當不錯的網頁 上面解釋的很清晰...

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...