【发布时间】:2021-06-30 15:44:54
【问题描述】:
我正在尝试在实模式下绘制到屏幕,因此我正在尝试使用分段访问 0xB8000
我的汇编代码是这样的
[BITS 16]
org 0x7c00
begin:
mov ah, 0x01 ; disable cursor
mov ch, 0x3f
int 0x10
mov ch, 0x0000
mov cs, 0xb800
mov ah, 0x0000
mov [cs:ah], ch ; invalid effective address
end:
jmp end
times 510 - ($-$$) db 0
dw 0xaa55
如何正确使用分段解决 0xB8000?
【问题讨论】:
-
查看a16 addressing 和a32 addressing。对于 a16(您必须在真正的 8086、186 或 286 上使用),您必须使用
disp16、disp8、bp或bx,以及si或di。对于 a32(您可以在 386+ 上使用),任何 32 位通用寄存器都可以用作基础。 (在 Real 86 模式下,您需要使用评估为 FFFFh 或更低的地址,但在此约束下允许使用 a32。) -
mov cs是无效的。cs:可以用作段前缀,但它指的是您正在执行的任何 代码段。如果您想处理一些其他数据,您应该使用数据段ds或额外段es。[cs:ah]是无效地址,因为没有以ah作为寄存器的地址编码。 -
请注意,对引导扇区中的段寄存器进行任何事情是不明智的。甚至没有 cs:BIOS 将在线性地址
0x07c00加载您的代码,但一些 BIOS 将使用cs=0和ip=0x7c00跳转到您的代码,而另一些则使用cs=0x07c0和ip=0。
标签: assembly nasm x86-16 osdev real-mode