bits 32
main:
mov ah, 09h
mov bh, 0
mov cx, 80
mov bl, 01110000b
mov al, ' '
int 10h
jmp $
times 512-($-$$) db 0
2 回答
事实上,bits 32
正是这一点阻止了它的工作。您可以使用 ndisasm 查看正在发生的事情。按原样组装它,然后用 ndisasm 拆卸它。ndisasm 的默认值为 16 位,但-b16
为了清楚起见,您可以指定。如果 CPU 处于 16 位模式,这就是 CPU 将“看到”的内容……确实如此。切换到 32 位模式需要更多代码 - 您很快就会做到,但 CPU 以 16 位模式启动(甚至是 64 位 CPU)。要查看 CPU 在 32 位模式下会“看到”什么,请再次使用-b32
. 看到不同?你mov bl, 01110000b
已经消失了,被“吞噬”了mov cx, 80
!然后在没有bits 32
. 你可以说bits 16
,但无论如何这是 Nasm 的默认设置。
bits 32
告诉汇编程序和实际让 CPU 处于 32 位模式之间存在细微差别。通常,这不会造成太大的麻烦(其他人 - 操作系统 - 已确定 CPU 模式),但在引导扇区中它会!
当您真正将 CPU 切换到 32 位保护模式时,您会想要告诉 Nasm bits 32
。
在http://www.osdev.org上有很多关于此的信息- 我推荐它!我也有一个例子发布到新闻组 - 很久以前 - 由 Alexey (实际上是“Alexei” - 那是你不是吗?)。
快乐开机,
坦率
您尚未处于 32 位模式,因此请使用bits 16
.
此外,在保护模式下,BIOS 功能不可用。只是为了让您知道并且不要在处于保护模式时尝试调用它们。