Bil*_*med 0 x86 assembly x86-16
下面是一些工作 - 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
Run Code Online (Sandbox Code Playgroud)
我将 3 个值压入堆栈,然后打印前 2 个值。我试图通过间接寻址打印第三个值,因此 mov al, [0x7ffe] - 但问题是,因为堆栈的基数为 0x8000 并且只能弹出 16 位值,要打印的最后一个字符的地址不是,-“a”是 0x8000 - 0x1 = 0x7FFF 而不是 0x8000 - 0x2,即上面代码中寻址的 0x7FFe,作为 1 个 16 位字节是0x10吗?
小智 5
在 x86 实模式下,您无法推送 8 位值。因此,您的三个push指令实际上是在推送 16 位值0x0041、0x0042和0x0043。由于 x86 是小端字节序,因此值的实际字符部分位于“第一个”,因此0x41代表“A”的位置将位于地址 处0x7ffe。