test.c檔案如下:
short add(short first, short second);
/* * 如果用完全用c語言寫16位**,則入口函式必須寫成第乙個函式。
* * 雖然使用了freestanding environment,但gcc仍然對main函式額外做了特殊的處理。
* 具體是新增了下面三條指令:
* leal 4(%esp), %ecx
* and 0xfffffff0, %esp
* pushl (%ecx-4)
* 其在main函式最開始初始化了棧頂的位置,故在此需要使用另外的入口函式。
* 在鏈結過程中,需要在在ld命令中需要使用的-e引數設定該函式為入口函式。
*/void mymain(void)
short add(short first, short second)
makefile檔案:
test.img:test
dd if=/dev/zero of=test.img bs=1440k count=1
dd if=test of=test.img bs=512 count=1 conv=notrunc
test:test.o
ld test.o --oformat binary -m elf_i386 -e mymain -o test
test.o:test.s
as test.s --32 -c -o test.o
test.s:test.c
gcc test.c -m16 -ffreestanding -std=c11 -s -o test.s
bochsrc檔案:
memory:guest=64, host=64
ata0:enabled=1, ioaddr1=0x1f0, ioaddr2=3f0, irq=14
ata0-master:type=disk, path=test.img
boot:disk
需要注意的是:
在用bochs執行之前,必須手動將test.img檔案中第0x1fe位元組和0x1ff兩個位元組分別改為0x55和0xaa,否則無法成功引導。
gcc編譯C 程式
單個原始檔生成可執行程式 下面是乙個儲存在檔案 helloworld.cpp 中乙個簡單的 c 程式的 helloworld.cpp include int main int argc,char argv 程式使用定義在標頭檔案 iostream 中的 cout,向標準輸出寫入乙個簡單的字串。該 可...
gcc編譯C 程式
單個原始檔生成可執行程式 下面是乙個儲存在檔案 helloworld.cpp 中乙個簡單的 c 程式的 helloworld.cpp include int main int argc,char argv 程式使用定義在標頭檔案 iostream 中的 cout,向標準輸出寫入乙個簡單的字串。該 可...
GCC編譯程式
gcc gnu compiler collection 是linux下最主要的一種編譯工具。gcc編譯格式 gcc 選項 源檔名 選項 目標檔名 採用預設得方式編譯原始檔,系統會生成a.out可執行檔案 採用顯式編譯成目標檔案,在編譯成可執行檔案 gcc c hello.c 生成hello.o gc...