假設它的增長下來,典型的基於微處理器的堆棧,然後把東西到堆棧中:
- 遞減堆棧指針
- 移動值到什麼堆棧指針指向
並取下堆棧中的東西:
- 檢索堆棧指針指向
- 遞增堆棧指針
當你總結top
到myStack
,你會得到什麼這是遙遠的其他地方的地址,可能是外面的你程序空間。 top
本身是已經是堆棧頂部的地址,而無需添加任何內容。
所以在你的情況下,top
已經是堆棧的頂部。所以,你的初始堆棧指針應top
:
.data
myStack DWORD 30 DUP(?)
top DWORD $
val DWORD 5
.code
mov esi, OFFSET top ; Initialize the stack pointer
mov eax, val ; Load a value into eax
sub esi, 4 ; push eax onto the stack
mov [esi], eax
在上文中,4從「堆棧指針」(這是最初top
)所述第一減法將產生top - 4
也就是最後4個字節的空間,在你myStack
地區。
彈出一個值從堆棧中:
mov eax, [esi]
add esi, 4
或者,你也能設置不同top
,然後你的代碼會工作。但它是稍微複雜:
.data
myStack DWORD 30 DUP(?)
top DWORD $-myStack ; the value here is current location minus myStack
val DWORD 5
.code
mov esi, OFFSET myStack ; Setup the stack pointer
add esi, top
mov eax, val ; get value in eax
sub esi, 4 ; push eax
mov [esi], eax
我認爲如果我這樣做,我的教授就會倒數。那麼它不會是一個傳統的堆棧。儘管如此,我現在一切正常。只需要幾個錯誤來應對。謝謝,@Jim Mischel! – lisabits
我覺得絆倒我的是,我從來沒有訪問過一個數組,但沒有加載它。我的意思是,我知道它正在記憶中的其他地方,但最初無法弄清楚原因。現在一切都說得通了。 – lisabits
@lisabits:不要混淆你的堆棧的*實現*和*接口*。堆棧是可以添加項目的抽象數據類型。當你刪除一個項目,你總是得到最近添加的項目。你如何實現它並不重要。項目的收集是否在你的緩衝區中「向上」或「向下」增長,或者你以某種方式隨機存儲它們是無關緊要的。重要的是,它以正確的順序返回項目。見http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29 –