2016-12-20 8 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」の後に10gを印刷します。これは5gと「hall0」の文字数を加えたものですが、「hall0」は表示されません。 私はgcc gnuアセンブラの使用のためにbootloader.asmで何か間違ったことをしているに違いありません。おそらくスタックを間違って設定しているかもしれません。 誰かが私に何をするのを手伝ってくれるのでしょうか?

+0

コメントは議論の対象外です。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/131026/discussion-on-question-by-albert-gcc-gnu-assembly-kernel-in-real-mode)。 –

答えて

-1

'kernel.asm'をbinファイルにコンパイルしてからcatコマンドを実行する必要があります。

関連する問題