2016-12-20 11 views
0

는 :GCC는 GNU 조립 커널 내 부트 로더가 순수 어셈블리로 작성하지만, 하나의 문자가 괜찮 동안 문제가 문자열을 인쇄를하는 동안 내가 GCC는 GNU 어셈블리의 16 비트 커널을 구축을 위해 노력하고

여기

은 내 여기

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 : bootloader.asm 내가 사용

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.asm 및 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 내 Linux Mint Cinnamon 버전 18에. 10g의 "soweit so gut"다음에 인쇄해야하는 5g와 "hall0"의 문자 수를 인쇄하지만 "hall0"은 인쇄하지 않습니다. 그래서 내가 gcc gnu 어셈블러의 사용을 위해 bootloader.asm에서 뭔가 잘못했을 것입니다. 아마도 스택을 잘못 설정했을 수도 있습니다. 어쩌면 누군가 나를 도와 줄 수 있습니까?

+0

댓글이 확장 된 논의하지 않은 cat 명령을 수행하십시오; 이 대화는 [채팅으로 이동되었습니다] (http://chat.stackoverflow.com/rooms/131026/discussion-on-question-by-albert-gcc-gnu-assembly-kernel-in-real-mode). –

답변

-1

당신은 bin 파일에 'kernel.asm'를 컴파일해야하고