【问题标题】:NASM - Get number of items in stackNASM - 获取堆栈中的项目数
【发布时间】:2015-05-09 18:48:47
【问题描述】:

我试图弄清楚如何通过用 bp 减去 sp 寄存器来获得堆栈中的项目数。我究竟做错了什么?我得到完全错误的结果

MOV bp, 0x7E00
MOV sp, bp

PUSH 'A'
PUSH 'B'
PUSH 'C'

POP bx
MOV al, bl
CALL _printchar

POP bx
MOV al, bl
CALL _printchar

MOV bx, sp
SUB bx, bp
ADD bx, 48 ;To get ascii number
MOV al, bl
CALL _printchar

这是输出:

CB。

【问题讨论】:

  • 你能发布输出吗?
  • @1.618 我添加了输出
  • 建议:SP中不要放具体的数字。你在要求灾难。如果这对你有用;伟大的。还有一百万种其他(更安全的)方法可以找出堆栈的实际位置。同样,如果这对您有用;呃;好的。我看到很多担忧。
  • @User.1 好吧,我正在尝试创建一个自己的操作系统,所以我需要将它放在一个特定的位置,这样它就不会覆盖我的代码
  • @ErikW:我鼓励你,在这种情况下,如果没有其他人的话,相信链接器。他非常擅长这一点;他真的是。

标签: assembly nasm


【解决方案1】:

堆栈的一个真正令人困惑的事情是它会向下增长。

与大多数人对堆栈的印象相比,您在汇编中使用的堆栈是“颠倒的”。堆栈的“底部”具有最高的内存地址,而“顶部”具有最低的内存地址。当您将 2 个字节压入堆栈时,2 个字节会从堆栈指针中减去,而不是添加到其中。 (如果从内存分区的角度考虑,这其实更安全)

所以您的 SUB 的结果是 -2,即 '.'在ASCII。你不能只是切换操作数,因为结果需要进入第一个操作数,所以它应该是一个通用寄存器。而是在 SUB 之前更改 MOV 操作。

【讨论】:

  • 只是好奇:为什么结果是-2?共有 3 个 PUSH 和 2 个 POP。我预计-1。
  • 因为你每次推送/弹出 2 个字节。无论您推送什么值,推送的大小始终相同。
  • 当栈帧 > 9 字节时方法也会失败。
  • “成长”是什么意思?
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2011-06-17
  • 2013-08-13
相关资源
最近更新 更多