2017-02-12 47 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瞭解更多信息。

希望它有幫助!

最好的問候,

米格爾·安赫爾