假设它的增长下来,典型的基于微处理器的堆栈,然后把东西到堆栈中:
- 递减堆栈指针
- 移动值到什么堆栈指针指向
并取下堆栈中的东西:
- 检索堆栈指针指向
- 递增堆栈指针
当你总结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 –