对堆栈中值的地址感到困惑

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 位值0x00410x00420x0043。由于 x86 是小端字节序,因此值的实际字符部分位于“第一个”,因此0x41代表“A”的位置将位于地址 处0x7ffe