x86 实模式下的基本指针偏移量

Base poiner offset in x86 real mode

有如下代码:

.code16

_entry:
    xorw %ax, %ax   
    movw %ax, %ds
    movw %ax, %ss
    movw %ax, %es
    movw [=10=]x7c00, %ax
    movw %ax, %sp
    movw %ax, %bp

    pushw 
    callw printh
    addw , %sp
lp:
    jmp %cs:lp

printh:
    pushw %bp
    movw %sp, %bp

    movb [=10=]x0e, %ah
    movb 6(%bp), %al
    int [=10=]x10   

    movw %bp, %sp
    popw %bp
    ret

.= _entry + 510
.word 0xaa55 /* little endian will reverse */

by 问题是 bp 偏移量。

0(%bp) 存储旧基指针(pushw %bp 之后)2 字节

2(%bp)通过调用指令

存储16位return地址

所以 49 的值(ascii 字符“1”)必须在偏移量 4(%bp) 处,但实际上它在 6(%bp) 偏移量处。为什么?

唯一合乎逻辑的结果是调用指令将 4 个字节压入堆栈 ???

在评论中回答。

该值实际上存储在 4(%bp),但在这种情况下,6(%bp) 恰好相同,但通常情况下,6(%bp) 将是未定义的(一些旧堆栈帧数据)。