NASM - 获取堆栈中的项目数

时间:2015-05-09 18:48:47

标签: assembly nasm

我试图通过用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 个答案:

答案 0 :(得分:5)

关于堆栈的一个令人困惑的事情是它会逐渐减少。

与大多数人的堆栈心理形象相比,你在装配中使用的堆栈是#34;倒置"。 "底部"堆栈的内存地址最高,而#34; top"最低的。当您将2个字节压入堆栈时,2个字节将从堆栈指针中减去,而不会添加到堆栈指针中。 (如果你在内存分区方面考虑它,这实际上更安全)

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