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...