对堆栈中值的地址感到困惑
confused about address of value in stack
下面是一些工作 - 16 位 x86 汇编
global _start
section .text
_start: mov ah, 0x0e
mov bp, 0x8000
mov sp, bp
push "A"
push "B"
push "C"
pop bx
mov al, bl
int 0x10
pop bx
mov al, bl
int 0x10
mov al, [0x7ffe]
int 0x10
jmp $
times 510 -( $ - $$ ) db 0
dw 0 xaa55
我将 3 个值压入堆栈,然后打印前 2 个。我试图通过间接寻址打印第三个值,因此 mov al,[0x7ffe] - 但问题是,因为堆栈有一个基0x8000 并且只能弹出 16 位值,不会打印最后一个字符的地址,-“a”是 0x8000-0x1 = 0x7FFF 而不是 0x8000-0x2,即上面代码中的 0x7FFe,如1 16位字节是0x10?
在 x86 实模式下,您无法推送 8 位值。因此,您的三个 push
指令实际上是在推送 16 位值 0x0041
、0x0042
和 0x0043
。由于 x86 是 little-endian,值的实际字符部分“最先”,因此表示“A”的 0x41
将位于地址 0x7ffe
.
下面是一些工作 - 16 位 x86 汇编
global _start
section .text
_start: mov ah, 0x0e
mov bp, 0x8000
mov sp, bp
push "A"
push "B"
push "C"
pop bx
mov al, bl
int 0x10
pop bx
mov al, bl
int 0x10
mov al, [0x7ffe]
int 0x10
jmp $
times 510 -( $ - $$ ) db 0
dw 0 xaa55
我将 3 个值压入堆栈,然后打印前 2 个。我试图通过间接寻址打印第三个值,因此 mov al,[0x7ffe] - 但问题是,因为堆栈有一个基0x8000 并且只能弹出 16 位值,不会打印最后一个字符的地址,-“a”是 0x8000-0x1 = 0x7FFF 而不是 0x8000-0x2,即上面代码中的 0x7FFe,如1 16位字节是0x10?
在 x86 实模式下,您无法推送 8 位值。因此,您的三个 push
指令实际上是在推送 16 位值 0x0041
、0x0042
和 0x0043
。由于 x86 是 little-endian,值的实际字符部分“最先”,因此表示“A”的 0x41
将位于地址 0x7ffe
.