我寫一個簡單的x86引導程序。爲什麼這個引導程序將只打印「S」
這是即時通訊時遇到問題的C程序:test4.c
__asm__(".code16\n");
__asm__("jmpl $0x0, $main\n");
void prints (char* str)
{
char* pStr = str;
while(*pStr)
{
__asm__ __volatile (
"int $0x10"
:
: "a"(0x0e00 | *pStr), "b"(7)
);
pStr++;
}
}
void main ()
{
char* str = "\n\rHello World\n\r";
char* pStr = str;
while(*pStr)
{
__asm__ __volatile (
"int $0x10"
:
: "a"(0x0e00 | *pStr)
);
pStr++;
}
prints (str);
}
當我嘗試打印的主要功能中的字符串,它的工作原理。但是當我將字符串傳遞給另一個執行相同指令的函數時,仍然只能將S
打印到屏幕上。所以最終的輸出看起來是這樣的:
Hello World
S
這裏是我使用的連接文件:test.ld
ENTRY(main);
SECTIONS
{
. = 0x7C00;
.text : AT(0x7C00)
{
*(.text);
}
.sig : AT(0x7DFE)
{
SHORT(0xaa55);
}
}
下面是我用來編譯C程序,將其鏈接
的命令$ gcc -c -g -Os -m32 -march=i686 -ffreestanding -Wall -Werror test4.c -o test4.o
$ ld -melf_i386 -static -Ttest.ld -nostdlib --nmagic -o test4.elf test4.o
$ objcopy -O binary test4.elf test4.bin
我用bochs
仿真器來測試這個引導程序
一個獨立的程序必須設置堆棧和段寄存器。 – stark
查看duskwuffs評論不使用GCC的16位代碼。 OpenWatcom是針對16位代碼恕我直言的_C_編譯器的最佳選擇。但是,如果你知道自己在做什麼,請了解GCC生成的代碼的細微差別(及其侷限性),你可以看看這樣的代碼[代碼示例](http://www.capp-sysware.com/misc/ ircasm/gccboot /)。這非常適合使用引導加載程序的BIOS中斷進行打印。 –
差不多[幫助建設一個16位操作系統]完全相同的副本(http://stackoverflow.com/questions/2713340/help-in-building-an-16-bit-os) –