2016-12-20 34 views
0

我試圖建立在GCC GNU組件16位內核,而我的引導程序是用純組裝,但我有麻煩打印出的字符串,而單個字符都還好:GCC GNU組件內核

這裏是我的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 

這裏我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"); 
} 

我使用的命令是: nasm -f bin -o bootloader.bin bootloader.asmgcc 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 在我的Linux Mint Cinnamon版本18上。 在「soweit so gut」之後打印出10克,這是它應該打印的5克加上來自「hall0」的字符數,但是我不打印「hall0」。 所以我必須在bootloader.asm中使用gcc gnu彙編程序時發生了錯誤,可能是錯誤地設置了堆棧。 也許有人可以幫我做什麼?

+0

註釋不適用於擴展討論;這個對話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/131026/discussion-on-question-by-albert-gcc-gnu-assembly-kernel-in-real-mode)。 –

回答

-1

您必須將'kernel.asm'編譯爲bin文件,然後執行cat命令