繁体   English   中英

如何告诉 GCC 为实模式生成 16 位代码

[英]How to tell GCC to generate 16-bit code for real mode

我正在编写实模式函数,它应该是带有堆栈帧等的普通函数,但它应该使用 %sp 而不是 %esp。 有什么方法可以做到吗?

GCC 5.2.0(以及可能的早期版本)支持使用-m16标志生成 16 位代码。 但是,代码几乎肯定会依赖于 32 位处理器功能(例如 32 位宽寄存器),因此您应该仔细检查生成的程序集。

man页:

-m16 选项与 -m32 相同,不同之处在于它在汇编输出的开头输出“.code16gcc”汇编指令,以便二进制文件可以在 16 位模式下运行。

首先gcc可以编译16位代码,因为linux内核是经过实模式到保护模式的,所以它甚至可以编译16位c代码。

然后,GCC >= 4.9 和 clang >= 3.5 支持 -m16 选项

gcc 会忽略 asm(".code16"),你可以通过 -S 看到它输出 #APP #NO_APP 包围的汇编代码

linux内核使用code16gcc.h(只有.code16gcc)直接传递给gcc编译参数来编译16位c。 请参阅尽可能使用 -m16 构建 16 位代码,另请参阅 linux 内核构建Makefile

如果你直接把 asm(".code16gcc"),参见编写 16 位代码,它不是真正的 16 位代码, call , ret , enter , leave , push , pop , pusha , popa , pushfpopf指令默认为 32 -位大小

GCC 不产生 8086 代码。 GNU AS 指令.code16gcc可用于汇编 GCC 的输出以在 16 位模式下运行,将asm(".code16gcc")放在您的 C 源代码的开头,您的程序将被限制为 64 KB。

在现代 GCC 版本中,您可以将-m16参数传递给gcc ,这将生成以 16 位模式运行的代码。 它仍然需要 386 或更高版本。

据我所知,GCC 不支持为 16 位 x86 生成代码。 对于传统引导加载程序和类似目的,您应该用汇编语言编写一个小存根,将 cpu 置于 32 位模式并将执行传递给 32 位代码。 出于其他目的,您真的不应该编写 16 位代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM