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只是訪問某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等
另看一下這一篇
解析SS SP BP暫存器
ss,sp,bp 三個暫存器 ss 存放棧的段位址 sp 堆疊暫存器sp stack pointer 存放棧的偏移位址 bp 基數指標暫存器bp base pointer 是乙個暫存器,它的用途有點特殊,是和堆疊指標sp聯合使用的,作為sp校準使用的,只有在尋找堆疊裡的資料和使用個別的定址方式時候才...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...
暫存器,標誌暫存器
涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...