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) 将是未定义的(一些旧堆栈帧数据)。
有如下代码:
.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) 将是未定义的(一些旧堆栈帧数据)。