我试图通过用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。
答案 0 :(得分:5)
关于堆栈的一个令人困惑的事情是它会逐渐减少。
与大多数人的堆栈心理形象相比,你在装配中使用的堆栈是#34;倒置"。 "底部"堆栈的内存地址最高,而#34; top"最低的。当您将2个字节压入堆栈时,2个字节将从堆栈指针中减去,而不会添加到堆栈指针中。 (如果你在内存分区方面考虑它,这实际上更安全)
所以你的SUB的结果是-2,这是'。'在ascii。你不能只是切换操作数,因为结果需要进入第一个操作数,所以它应该是一个通用寄存器。而是在SUB之前改变MOV操作。