汇编代码中的堆栈指针问题

2021-07-02 12:30发布


有人能告诉我堆栈指针在下面的代码中是如何工作的吗?因为我是这个领域的新手:


CSEG AT 0H
MOV 0x40, #5MOV 0X41, #6PUSH 0X41
PUSH 0X40
POP 0X41
POP 0X40
END


4条回答
sangyue
1楼 · 2021-07-02 13:30.采纳回答

你想要知道什么。

内存位置0x40存放的数字5
内存位置0x41存放的数字6

将0x41位置的数据PUSH堆栈。
将0x40位置的数据PUSH堆栈

将栈顶的数据弹出到0x41位置
将栈顶的数据弹出到从0x40位置

位置0x40存放的数字6
位置0x41存放的数字5


基本上是交换这两个位置的数据的值的作用。


不知不觉
2楼-- · 2021-07-02 13:34

因为堆栈的位置随着数据不断变化。如果你PUSH三个值,比如12,13和14,那么14就会排在最上面。POP一个值后13人将位于栈顶。

王兵兵
3楼-- · 2021-07-02 14:30

堆栈通常向下递进,因此如果堆栈为空,并从地址0x1000开始。堆栈指针将指向0x1000。因此,使用题主的示例,您可以从0x41位置(包含值6)获得想要保存在堆栈上的值。

从位置0x41将数据6的值PUSH到堆栈上。

所以位置0x1000现在存放数字6(堆栈指针被减少,所以现在指向位置0xFFF)

现在将数字5的值从0x40位置PUSH到堆栈上。

因此,位置0xFFF现在存放数字5(堆栈指针被减少,所以现在指向位置0xFFE)


现在你POP堆栈,堆栈指针将递增,以指向堆栈上最后使用的位置,从而指向0xFFF。

这包含值5,所以将数字5放在0x41位置。

现在你又弹出了堆栈,堆栈指针将递增,以指向堆栈上最后使用的位置,从而指向0x1000。

这包含值6,所以您将数字6放在0x40位置。

需要注意的是最先一个被PUSH堆栈上的最后从堆栈中弹出。


李春明
4楼-- · 2021-07-02 15:01

它之所以被称为堆栈,因为它就像一堆纸或盒子。在处理器中,它通常以高地址递减开始,但是只要把它想象成一堆纸,你就可以在纸上写一个数字,然后把它叠起来。当你打开它的时候,你只会得到最上面的一张纸。这对你的理解有帮助吗?

一周热门 更多>