我正在尝试在汇编中进行两个堆栈排序。我了解您使用系统堆栈的第一个堆栈;但是不知道如何实现第二个堆栈。
2 回答
要解决这个问题,你需要回答三个问题:我需要什么操作,每个操作是做什么的,我该怎么做?
我需要什么操作?
堆栈有两个操作: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
现在我们已经实现了这两个操作,我们可以按照我们喜欢的方式使用它们。也许我们想通过添加代码来将它们包装在一个函数中,以便在之前将参数读入寄存器(如果需要),然后在之后返回。或者,也许我们只想将它们直接插入到我们需要的地方,改变寄存器以满足我们的需要。
将所有内容加载到堆栈中并使用指针?
mov eax,[point1-4](栈顶向下)
mov ebx,[point2-4] (点 1 向下的限制)
您通常会减少 4,因为项目存储为 dwords
如果你弄乱了堆栈,首先将 esp 存储到 DW[stackstore]
mov dword [stak],esp
并在例程结束时将存储的值返回给 esp
mov esp,[stak]
ret
堆栈可能有点有趣并且会导致例行程序崩溃,除非您将脚牢牢地放在它的喉咙上