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

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 位值 0x00410x00420x0043。由于 x86 是 little-endian,值的实际字符部分“最先”,因此表示“A”的 0x41 将位于地址 0x7ffe.