mik*_*324 9 x86 assembly operating-system real-mode
在研究一些简单的os源代码时,我对一个简单的汇编问题感到困惑.
在这个网站:http://wiki.osdev.org/Babystep7下面的代码是从实模式切换到保护模式
mov eax, cr0
or al,1
mov cr0, eax
Run Code Online (Sandbox Code Playgroud)
我知道如何从实模式切换到保护模式.
但我的问题是,由于程序仍处于实模式,它如何使用32位寄存器或指令?
是否可以在实模式下使用32位寄存器/指令?
nin*_*alj 10
当处理器以实模式运行时(因为它在启动后立即),它默认为16位代码.但是,这并不能意味着你不能使用32位指令.
有一个"操作数大小覆盖"前缀(66h)可以更改单个指令的默认模式.当此前缀与在16位实模式下执行的指令一起使用时,它会将指令切换为32位.相反,当此前缀与在32位保护模式下执行的指令一起使用时,它会将指令切换为16位.(类似的前缀67h用于覆盖地址大小.)
然后,使用此前缀允许您在16位实模式下使用32位寄存器.当您在组装16位代码时尝试使用带有指令的32位操作数时,您的汇编器几乎肯定会自动发出此前缀.
不幸的是,64位指令没有这样的覆盖前缀,因此不能在实模式下使用.您需要切换到"长模式"才能允许这些.