2017-02-12 79 views
1

我正在学习操作系统开发和当然的初学者。我想在实模式环境下构建我的系统,这是一个使用C语言的16位环境。`asm()`函数在C语言中是如何工作的?

在C中,我使用的功能asm()到代码转换为16位,如下所示:

asm(".code16") 

这在GCC的语言,以生成16个可执行文件(不完全虽然)。

问:

假设我有两个头文件head1.hhead2.hmain.c文件。是main.c文件的内容如下:

asm(".code16"); 
#include<head1.h> 
#include<head2.h> 
int main(){ 
    return 0; 
} 

现在,自从我开始我的命令代码来生成16位可执行文件,然后包括head1.hhead2.h,我需要做的所有头文件相同我要创造? (或)是否足够添加行asm(".code16");一次?

操作系统:Ubuntu的

编译器:GNU CC

+4

我建议你不要使用gcc编译16位代码。你使用的是一个引起一堆问题的混乱。 – fuz

回答

4

要回答你的问题:就足够了asm块出现在翻译单元的开始。
因此,一开始就这样做。

但是你可以做得更好:你可以完全避免它,并使用the -m16 command line option (available from 5.2.0)来代替。

但是你可以做得更好:你完全可以避免它。


-m16.code16的效果是使32位代码可执行在实模式下,这是不以产生实模式的代码。

Look

16。ç

int main() 
{ 
    return 4; 
} 

提取原始的.text

>gcc -c -m16 16.c 
>objcopy -j .text -O binary 16.o 16.bin 
>ndisasm 16.bin 

我们得到

00000000 6655    push ebp 
00000002 6689E5   mov ebp,esp 
00000005 6683E4F0   and esp,byte -0x10 
00000009 66E800000000  call dword 0xf 
0000000F 66B804000000  mov eax,0x4 
00000015 66C9    o32 leave 
00000017 66C3    o32 ret 

这仅仅是充满了操作数大小前缀的32位代码。
On a real pre-386 machine this won't work as the 66h opcode is UD


有旧的16位编译器,像Turbo C ,即妥善解决问题的实模式的应用。

Turbo C code generation options

可替代地,开关在保护模式下尽快或考虑使用UEFI。


这是在网上提供。这个编译器和我一样古老!

+1

[“不要提及战争!”](https://www.youtube.com/watch?v=yfl6Lu3xQW0)。知道Turbo-C(++)的人越少越好! –

0

它并不需要添加asm("code16")既不head1.h也不head2.h

主要原因是C预编译器的工作原理。它取代main.c中的head1.hhead2.h的内容。

请检查How `#include' Works了解更多信息。

希望它有帮助!

最好的问候,

米格尔·安赫尔