我正在尝试在程序集中进行两次堆栈排序。我理解你使用系统堆栈的第一个堆栈;但是不知道如何实现第二个堆栈。
答案 0 :(得分:4)
要解决此问题,您需要回答三个问题:我需要哪些操作,每个操作执行什么操作以及如何执行此操作?
堆栈有两个操作:Push和pop。
让我们在系统堆栈之后模拟我们的实现。那么这个问题就变成了“push
和pop
指令的作用是什么?”。 push
指令递减堆栈指针并将其参数存储在它现在指向的位置。 pop
指令读取堆栈指针指向的值,递增堆栈指针,并返回读取值。
推送是两个步骤:减少堆栈指针并存储值。已有针对此目的的说明。 push
指令使用esp
作为堆栈指针,但由于我们正在编写自己的指针,因此我们可以使用我们想要的任何内容。我们将使用edx
,并假设要存储的值在eax
中(我们存储4个字节)。
sub edx, 4 ; Decrement the stack pointer one position (4 bytes)
mov dword [edx], eax ; Store the value at the new location
弹出是三个步骤:获取值,递增堆栈,然后返回值。我们只需将其保留在eax
。
mov eax, dword [edx] ; Load the value off of the stack
add edx, 4 ; Increment the stack pointer one position (4 bytes)
; Leave the result in eax to return it
现在我们已经实现了两种操作,我们可以按照我们喜欢的方式使用它们。也许我们想通过添加代码来将它们包装在一个函数中,以便在之前将参数读入寄存器(如果需要),然后返回。或者,也许我们只想将它们直接插入到我们需要的地方,更改寄存器以满足我们的需求。
答案 1 :(得分:0)
将所有内容加载到堆栈中并使用指针?
Mov eax,[point1-4](堆叠顶部)
mov ebx,[point2-4](点数下限1)
您通常会减少4,因为项目存储为dwords
如果你通过将esp存储到DW [stackstore]
来开始关闭堆栈mov dword [stak],esp
并在例行程序结束时将存储的值返回给esp
mov esp,[stak]
保留
堆叠可能会有点滑稽,除非你的脚牢牢地踩在喉咙上,否则就会崩溃。