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

我正在编写实模式函数,它应该是具有堆栈帧的正常函数,但是它应该使用%sp而不是%esp。 有办法吗?

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

man页:

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

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

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