4

我正在尝试在汇编中进行两个堆栈排序。我了解您使用系统堆栈的第一个堆栈;但是不知道如何实现第二个堆栈。

4

2 回答 2

4

要解决这个问题,你需要回答三个问题:我需要什么操作,每个操作是做什么的,我该怎么做?

我需要什么操作?

堆栈有两个操作:Push 和 pop。

每个操作的作用是什么?

让我们在系统堆栈之后为我们的实现建模。那么这个问题就变成了“pushpop指令是做什么的?”。该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

现在我们已经实现了这两个操作,我们可以按照我们喜欢的方式使用它们。也许我们想通过添加代码来将它们包装在一个函数中,以便在之前将参数读入寄存器(如果需要),然后在之后返回。或者,也许我们只想将它们直接插入到我们需要的地方,改变寄存器以满足我们的需要。

于 2013-04-30T20:08:29.107 回答
0

将所有内容加载到堆栈中并使用指针?

mov eax,[point1-4](栈顶向下)

mov ebx,[point2-4] (点 1 向下的限制)

您通常会减少 4,因为项目存储为 dwords

如果你弄乱了堆栈,首先将 esp 存储到 DW[stackstore]

mov dword [stak],esp

并在例程结束时将存储的值返回给 esp

mov esp,[stak]

ret

堆栈可能有点有趣并且会导致例行程序崩溃,除非您将脚牢牢地放在它的喉咙上

于 2013-04-30T23:12:24.323 回答