我對堆棧段(ss)和堆棧指針(sp)寄存器有點困惑。 當堆棧爲空時,sp值是否等於ss值? 我讀到,當我們推一個單詞(2字節)到堆棧時,sp減2,如果第一個語句爲真(sp = ss),那麼我可以說如果堆棧不是空的,堆棧指針的值總是更小或等於堆棧段的值是否爲真? 如果我們影響一個sp值使它大於ss?即: MOV SS,200H MOV SP,400H MOV AX,1010h 推斧頭8086中的堆棧段和堆棧指針
請糾正任何錯誤,感謝名單提前
我對堆棧段(ss)和堆棧指針(sp)寄存器有點困惑。 當堆棧爲空時,sp值是否等於ss值? 我讀到,當我們推一個單詞(2字節)到堆棧時,sp減2,如果第一個語句爲真(sp = ss),那麼我可以說如果堆棧不是空的,堆棧指針的值總是更小或等於堆棧段的值是否爲真? 如果我們影響一個sp值使它大於ss?即: MOV SS,200H MOV SP,400H MOV AX,1010h 推斧頭8086中的堆棧段和堆棧指針
請糾正任何錯誤,感謝名單提前
沒有,ss
是段寄存器和別人一樣,如cs
或ds
。按照通常的實模式規則,他們參與形成物理地址,如address = 16 * segment + offset
,其中來自sp
的堆棧偏移。因此,推入堆棧的最後一項地址爲16 * ss + sp
。您不知道堆棧何時爲空,除非您知道堆棧的末尾有,並且ss
的數值與sp
相比根本沒有意義。
堆棧段(SS)寄存器和堆棧指針(SP)寄存器用於創建地址的不同部分到堆棧:
ss aaaaaaaaaaaaaaaa----
sp ----aaaaaaaaaaaaaaaa
使用的地址是ss * 16 + sp
。段寄存器選擇整個1024 kB內存空間中的一個64 kB段,堆棧指針是該段內的偏移量。
當堆棧爲空時,堆棧指針指向爲堆棧分配的空間的頂部。
如果ss寄存器包含例如0200h,則堆棧段從02000h變爲11fffh。但是,實際堆棧可能會比堆棧段小。如果堆棧的大小例如是16 kB,那麼當堆棧增長時,sp開始於4000h並且趨向0000h。
謝謝@Guffa,但是您的意思是「堆棧指針指向分配給堆棧的空間的頂部」?在這種情況下sp包含什麼?在你給ss = 200h的例子中,當按下數據時sp是如何改變的,以使段從020000h變爲02ffff h? –
@OussamaGuessoum:當ss = 0200h時,sp中的值0000h到ffffh可用於到達地址020000h到02fffffh,因爲地址是ss * 16 + sp。如果ss是0200h,並且sp在4000h開始,並且您推送一個字節,則sp將變爲3fffh,並且該字節在地址023fffh處結束。 – Guffa
好吧,圖像越來越清晰非常感謝你,如果SP包含0000h,我們嘗試推送一個字節或SP包含ffffh,我們嘗試彈出一個字節會發生什麼?這是一個堆疊流?我從你那裏學習很多謝謝你的幫助:) –