Ich versuche, einen 16-Bit-Kernel in gcc gnu Montage zu bauen, während mein Bootloader in reinen Assembler geschrieben ist, aber ich habe Probleme Strings Druck aus, während einzelne Zeichen in Ordnung sind:gcc gnu Montage Kernel im Real-Modus
Hier ist mein bootloader.asm:
org 0x7c00
bits 16
section .text
mov ax,0x1000
mov ss,ax
mov sp,0x000
mov esp,0xfffe
xor ax,ax
mov es,ax
mov ds,ax
mov [bootdrive],dl
mov bh,0
mov bp,zeichen
mov ah,13h
mov bl,06h
mov al,1
mov cx,6
mov dh,010h
mov dl,01h
int 10h
load:
mov dl,[bootdrive]
xor ah,ah
int 13h
jc load
load2:
mov ax,0x1000
mov es,ax
xor bx,bx
mov ah,2
mov al,1
mov cx,2
xor dh,dh
mov dl,[bootdrive]
int 13h
jc load2
mov ax,0
mov es,ax
mov bh,0
mov bp,zeichen3
mov ah,13h
mov bl,06h
mov al,1
mov cx,13
mov dh,010h
mov dl,01h
int 10h
mov ax,0x1000
mov es,ax
mov ds,ax
jmp 0x1000:0x000
zeichen db 'hello2'
zeichen3 db 'soweit so gut'
bootdrive db 0
times 510 - ($-$$) hlt
dw 0xaa55
und hier meine kernel.c:
asm("jmp main");
void print()
{
for(int i=0;i<5;i++)
{
asm("mov $0x0e,%ah");
asm("mov $0x00,%bh");
asm("mov %0,%%al":: "" ('g'));
asm("int $0x10");
}
}
void main()
{
asm("mov $0x1000,%eax;"
"mov %eax,%es;"
"mov %eax,%ds");
const char string[]="hall0";
print();
for(int i=0;i<5;i++)
{
asm("mov $0x0e,%ah");
asm("mov $0x00,%bh");
asm("mov %0,%%al":: "" (string[i]));
asm("int $0x10");
}
asm(".rept 512;"
" hlt ;"
".endr");
}
die Befehle i verwenden sind: nasm -f bin -o bootloader.bin bootloader.asm
und 012.351.gcc kernel.c -c -o kernel.o -m16 -nostdlib -ffreestanding&&ld -melf_i386 kernel.o -o kernel.elf&&objcopy -O binary kernel.elf kernel.o&&cat bootloader.bin kernel.elf>myOS.bin&&qemu-system-i386 myOS.bin
auf meiner Linux Mint Cinnamon Version 18. Es druckt 10 g nach "so so gut" das sind die 5 g es sollte plus die Anzahl der Zeichen aus "hall0" drucken, aber ich drucke nicht "hall0". Also ich muss etwas falsch gemacht haben in der bootloader.asm für die Verwendung des gcc gnu assembler, vielleicht den Stack falsch oder etwas einrichten. Vielleicht kann mir jemand helfen, was zu tun ist?
Kommentare sind nicht für längere Diskussion; Diese Konversation wurde [in den Chat verschoben] (http://chat.stackoverflow.com/rooms/131026/discussion-on-question-by-albert-gcc-gnu-assembly-kernel-in-real-mode). –