NASM - 获取堆栈中的项目数

NASM - Get number of items in stack

我想弄清楚如何通过用 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.

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

与大多数人对堆栈的心理印象相比,您在汇编中使用的堆栈是 "upside down"。栈的"bottom"内存地址最高,"top"内存地址最低。当您将 2 个字节压入堆栈时,2 个字节将从堆栈指针中减去 ,而不是添加到堆栈指针中。 (如果从内存分区的角度考虑,其实这样更安全)

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