【问题标题】:assembly stack pointer汇编堆栈指针
【发布时间】:2013-03-18 20:18:09
【问题描述】:

堆栈:

0xDDDD
0xCCCC
0xBBBB
0xAAAA

pop ax 意思是:

  • 0xAAAA 将被放置在 ax 中
  • SS:SP 现在将指向 0xBBBB。

现在,我明白了。

0xDDDD
0xCCCC
0xBBBB

我想保存 ax 的值。

push ax.

0xDDDD
0xCCCC
0xBBBB
0xAAAA

我又来了。

mov ax, [ss:sp+2]

0xBBBB 将被加载到 ax 中。

我的函数完成后,我想从堆栈中删除 0xAAAA 和 0xBBBB。 首先,我会恢复斧头。

pop ax. (Now loaded with 0xAAAA)

如何从堆栈中删除 0xBBBB? 我是简单地“弹出”而不带参数(这存在吗?)还是添加 sp, 2 ?

谢谢。

【问题讨论】:

  • 从 Intel 或 AMD 下载 CPU 手册。他们会告诉您是否存在无操作数 popadd sp, 2 会做什么以及问题的说明中是否还有其他错误。
  • mov ax, [ss:sp+2] 不存在且不会组装。 pop 不带参数也不存在于 x86 程序集中并且不会组合,为此使用 add sp,2pop 本身不会清除从堆栈中弹出的值,但通常它们会很快被下一个中断覆盖。

标签: assembly x86


【解决方案1】:

只需将堆栈指针调整为指向堆栈中较早的位置,就像add sp, $2 一样。语法可能因您使用的汇编程序而异。 $2 的意思是“立即数 2”。

您可以下载Intel 64 and IA-32 Architectures Software Developer’s Manuals

(请注意,使用 16 位寄存器相当陈旧。根据您编写的平台,可能需要将堆栈对齐保持为 4 个字节或更多字节的倍数,特别是在调用或从例程返回时。)

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2014-12-10
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2014-08-04
    • 2011-07-08
    相关资源
    最近更新 更多