Я пишу простой загрузчик x86.Почему этот загрузчик только печатает 'S'
это с программой, что им возникли проблемы с: 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);
}
}
Вот команды я использовал для компиляции программы С и связать его
$ 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 относительно использования 16-битного кода GCC. Openwatcom - лучший выбор для _C_ компилятора, нацеленного на 16-битный код IMHO. Однако, если вы знаете, что делаете, понимаете нюансы о сгенерированном коде GCC (и его ограничения), вы можете посмотреть на что-то вроде этого [пример кода] (http://www.capp-sysware.com/misc/ ircasm/gccboot /). Это в значительной степени предназначено для печати с использованием прерываний BIOS от загрузчика. –
Довольно точный дубликат [Помощь в создании 16-битных ОС] (http://stackoverflow.com/questions/2713340/help-in-building-an-16-bit-os) –