2015-05-23 376 views
3

我對堆棧段(ss)和堆棧指針(sp)寄存器有點困惑。 當堆棧爲空時,sp值是否等於ss值? 我讀到,當我們推一個單詞(2字節)到堆棧時,sp減2,如果第一個語句爲真(sp = ss),那麼我可以說如果堆棧不是空的,堆棧指針的值總是更小或等於堆棧段的值是否爲真? 如果我們影響一個sp值使它大於ss?即: MOV SS,200H MOV SP,400H MOV AX,1010h 推斧頭8086中的堆棧段和堆棧指針

請糾正任何錯誤,感謝名單提前

回答

4

沒有,ss是段寄存器和別人一樣,如csds。按照通常的實模式規則,他們參與形成物理地址,如address = 16 * segment + offset,其中來自sp的堆棧偏移。因此,推入堆棧的最後一項地址爲16 * ss + sp。您不知道堆棧何時爲空,除非您知道堆棧的末尾有,並且ss的數值與sp相比根本沒有意義。

1

堆棧段(SS)寄存器和堆棧指針(SP)寄存器用於創建地址的不同部分到堆棧:

ss aaaaaaaaaaaaaaaa---- 
sp ----aaaaaaaaaaaaaaaa 

使用的地址是ss * 16 + sp。段寄存器選擇整個1024 kB內存空間中的一個64 kB段,堆棧指針是該段內的偏移量。

當堆棧爲空時,堆棧指針指向爲堆棧分配的空間的頂部。

如果ss寄存器包含例如0200h,則堆棧段從02000h變爲11fffh。但是,實際堆棧可能會比堆棧段小。如果堆棧的大小例如是16 kB,那麼當堆棧增長時,sp開始於4000h並且趨向0000h。

+0

謝謝@Guffa,但是您的意思是「堆棧指針指向分配給堆棧的空間的頂部」?在這種情況下sp包含什麼?在你給ss = 200h的例子中,當按下數據時sp是如何改變的,以使段從020000h變爲02ffff h? –

+0

@OussamaGuessoum:當ss = 0200h時,sp中的值0000h到ffffh可用於到達地址020000h到02fffffh,因爲地址是ss * 16 + sp。如果ss是0200h,並且sp在4000h開始,並且您推送一個字節,則sp將變爲3fffh,並且該字節在地址023fffh處結束。 – Guffa

+0

好吧,圖像越來越清晰非常感謝你,如果SP包含0000h,我們嘗試推送一個字節或SP包含ffffh,我們嘗試彈出一個字節會發生什麼?這是一個堆疊流?我從你那裏學習很多謝謝你的幫助:) –