[英]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
, pushf
和popf
指令默认为 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.