Вот kernel.c. В qemu код ничего не выводит, и выводит 'S', если '...' заменить на 'int x'. Отличие в передаче параметров через стек, как видно в ассемблерном коде.
Код:
__asm__(".code16gcc\n");
__asm__ ("jmp _start\n");
int extern __attribute__((noinline)) __attribute__((regparm(3))) sprintf(char * buf, const char *fmt, ...)
{
__asm__ __volatile__ ("int 0x10" : : "a" (0x0E00 | *fmt), "b"(144));
}
void __attribute__((noreturn)) _start()
{
char buf[128];
sprintf(buf, "Sasha%d", 123);
while(1);
}
Нынешняя инициализация регистров:
Код:
mov ax, SETUP_ADDR>>4 ; SETUP_SEG
mov es, ax
mov ds, ax
mov cs, ax
mov ss, ax
mov sp, 0x400
jmp SETUP_ADDR>>4:0
Компиляция и запуск:
Код:
#!/bin/bash
gcc -c -Wall -save-temps -march=i386 -ffreestanding -Wno-main -fno-builtin -masm=intel -O0 -o kernel.o kernel.c
ld -nostdlib -static -Ttext 0 --oformat binary -o kernel.bin kernel.o
mkdir diskc
mount -t msdos -o loop=/dev/loop3,blocksize=1024 dos.img diskc
rm diskc/BOOTOR
cp kernel.bin diskc/BOOTOR
umount diskc
rmdir diskc
nasm boot.asm -o boot.bsr
dd if=boot.bsr of=dos.img bs=512 count=1 conv=notrunc
qemu -fda dos.img -boot a