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