是否可以在实模式下使用 32 位寄存器/指令?

发布于 2024-11-27 08:12:54 字数 326 浏览 1 评论 0原文

在研究一些简单的操作系统源代码时,我对一个简单的汇编问题感到困惑。

在这个网站中:http://wiki.osdev.org/Babystep7下面的代码是从真实切换模式到保护模式

mov  eax, cr0
or al,1
mov  cr0, eax

我知道如何从实模式切换到保护模式。
但我的问题是,由于程序仍处于实模式,它如何使用32位寄存器或指令?

是否可以在实模式下使用 32 位寄存器/指令?

I'm confused about a simple assembly problem when studying some simple os source code.

In this website: http://wiki.osdev.org/Babystep7 the following code is to switch from real mode to protected mode

mov  eax, cr0
or al,1
mov  cr0, eax

I know how to switch from real mode to protected mode.
But my question is since the program is still in the real mode, how can it use the 32 bit registers or instructions?

Is it possible to use 32 bits registers/instructions in real mode?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

独留℉清风醉 2024-12-04 08:12:54

当处理器在实模式下运行时(启动后立即运行),它默认为 16 位代码。但是,这并不意味着您无法使用 32 位指令。

有一个“操作数大小覆盖”前缀 (66h),可以更改单个指令的默认模式。当此前缀与以 16 位实模式执行的指令一起使用时,它将将该指令切换为 32 位。相反,当该前缀与在 32 位保护模式下执行的指令一起使用时,它将将该指令切换为 16 位。 (类似的前缀 67h 可覆盖地址大小。)

使用此前缀允许您在 16 位实模式下使用 32 位寄存器。当您尝试在汇编 16 位代码时将 32 位操作数与指令一起使用时,您的汇编器几乎肯定会自动发出此前缀。

不幸的是,64 位指令没有这样的覆盖前缀,因此它们不能在实模式下使用。您需要切换到“长模式”才能允许这些。

When the processor operates in real mode (as it is immediately after booting), it defaults to 16-bit code. However, this does not mean that you are unable to use 32-bit instructions.

There is an "operand size override" prefix (66h) that changes the default mode for a single instruction. When this prefix is used with an instruction executed in 16-bit real mode, it will switch the instruction to 32-bit. Conversely, when this prefix is used with an instruction executed in 32-bit protected mode, it will switch the instruction to 16 bit. (A similar prefix, 67h, works to override address sizes.)

Using this prefix, then, allows you to use 32-bit registers in 16-bit real mode. Your assembler will almost certainly emit this prefix automatically when you try and use 32-bit operands with an instruction when assembling 16-bit code.

Unfortunately, there is no such override prefix for 64-bit instructions, so these cannot be used in real mode. You need to switch into "long mode" to allow these.

半﹌身腐败 2024-12-04 08:12:54

据我了解,实模式不会影响您可以在CPU上运行的命令,但它会影响CPU内存引用命令的解释方式。

所以,是的,您可以使用eax,但您将无法获取[eax]内存单元。

请参阅英特尔手册中的相关部分。

As far as I understand, real mode does not affect the commands you can run on the CPU, but it affects how the CPU memory reference commands are interpreted.

So, yes, you can use eax, but you won't be able to get the [eax] memory cell.

See relevant part in Intel's Manual.

还不是爱你 2024-12-04 08:12:54

对于简单寻址,操作数和指令大小前缀非常有效。我曾经为 Windows(3.1 及更高版本到 9x)编写的一个 16 位保护(最初是实数)模式应用程序可以使用 Windows 内存 API 分配大于 64K 的内存区域,问题是如何使用它。无论如何,使用(远)指针转换和提到的前缀,我的应用程序充分利用了 40MB 区域,即使它在 16 位模式下运行。

如果您尝试类似的操作,请记住指令大小前缀启用与 16 位不兼容的 32 位指令集。 16 位通常不关心您是处于实模式还是保护模式,除非您正在进行段算术。所以你需要使用emit来手动编写32位操作的代码(至少我是这样做的),因为你的编译器可能不会在不喊血腥谋杀的情况下生成它们。

For simple addressing the the operand and instruction size prefixes worked very well. A 16-bit protected (initally real) mode application I once wrote for Windows (3.1 and later to 9x) could allocate >64K memory areas using the Windows memory API and the question was how to make use of it. In any case using (far) pointer thunking and the prefixes mentioned my app made good use of 40MB areas even though it ran in 16-bit mode.

If you try something similar remember that the instruction size prefix enables the 32-bit instruction set which is incompatible with the 16-bit. 16-bit normally doesn't care if you're in real or protected mode unless you're doing segment arithmetic. So you need to hand code (at least I did) the 32-bit operations using emit because your compiler probably won't generate them without yelling bloody murder.

花海 2024-12-04 08:12:54

据我所知,在实模式下,不能使用32位寄存器。
在 32 位控制寄存器 CR0 中,实模式和保护模式是通过查看 CR0 的第一位 (PE) 来确定的。在此代码中,您更改最后一行中的 PE (mov cr0,eax)。
我想,在这行之后,你不能再使用 32 位寄存器引用了。

As far as I know,in real mode,you cannot use 32 bit registers.
In the 32-bit control register CR0, real mode and protected mode is determined by looking to first bit of CR0 (PE).In this code,you change the PE in the last line (mov cr0,eax).
I guess, after this line,you cannot use 32 bit register references anymore.

琉璃繁缕 2024-12-04 08:12:54

您也许可以使用 LoadAll 操作码 0F07h,它为您提供 16 位实模式下的 32 位访问。

You can perhaps use the LoadAll opcode 0F07h which gives you 32 bit access in 16 bit real mode.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文