如何告诉GCC生成16位代码以实现真实模式

问题描述 投票:0回答:3
。有什么办法可以做吗?

GCC5.2.0(以及可能的较早版本)用
-m16
标志支持16位代码生成。但是,该代码几乎可以肯定会依靠32位处理器功能(例如32位宽寄存器),因此您应该仔细检查生成的组件。

从页面上:
c gcc assembly x86-16 inline-assembly
3个回答
9
投票

-M16选项与-m32相同,除了输出 “ .code16gcc”汇编指令在组装输出的开头 这样二进制可以以16位模式运行。

    

首先,GCC可以构建16位代码,因为Linux内核可以通过Realmode进行protectMode,因此它甚至可以构建16位C代码。

然后,-M16选项由GCC> = 4.9支持,clang> =3.5

GCC将忽略ASM(“。代码16”),您可以通过-s输出#App#no_app

包围的汇编代码来看到它 Linux内核可以用Code16GCC.H(仅具有.code16gcc)将16位C的措施传递到GCC直接编译参数。 请参阅

-build 16位代码,并在可能的情况下使用-m16,也请参见Linux内核build
-makefile

7
投票

如果将ASM放置(“。code16gcc”),请参见
写作16位代码
,这不是真正的16bit代码,
man

call
retenter
leave
pushpop

pusha
popa
pushf
popf
.code16gcc
指令默认为32位大小

GCC不会产生8086代码。 GNU作为指令
asm(".code16gcc")
可用于组装GCC的输出以在16位模式下运行,在C源开始时,您的程序将仅限于64kibytes.
在现代海湾合作委员会版本中,您可以将
-m16

参数传递给to,它将产生以16位模式运行的代码。它仍然需要386或更高版本。

6
投票
据我所知,GCC不支持16位X86的代码生成。对于旧式引导加载程序和类似目的,您应该编写一个小型的汇编语言,以使CPU处于32位模式,并将执行传递到32位代码。出于其他目的,您真的不应该编写16位代码。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.