我写一个简单的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) –