如何在NASM中创建第二个堆栈

时间:2013-04-30 18:29:25

标签: assembly x86 stack nasm

我正在尝试在程序集中进行两次堆栈排序。我理解你使用系统堆栈的第一个堆栈;但是不知道如何实现第二个堆栈。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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

Mov eax,[point1-4](堆叠顶部)

mov ebx,[point2-4](点数下限1)

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

如果你通过将esp存储到DW [stackstore]

来开始关闭堆栈

mov dword [stak],esp

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

mov esp,[stak]

保留

堆叠可能会有点滑稽,除非你的脚牢牢地踩在喉咙上,否则就会崩溃。