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