NASM - 获取堆栈中的项目数

Eri*_*k W 5 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
Run Code Online (Sandbox Code Playgroud)

这是输出:

CB.

1.6*_*618 5

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

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

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