X86 实模式下的gcc gnu汇编内核

X86 实模式下的gcc gnu汇编内核,x86,stack,kernel,inline-assembly,bootloader,X86,Stack,Kernel,Inline Assembly,Bootloader,我正试图在gcc gnu汇编中构建一个16位内核,而我的引导加载程序是用纯汇编编写的,但我在打印字符串时遇到了问题,因为单个字符都可以: 这是我的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

我正试图在gcc gnu汇编中构建一个16位内核,而我的引导加载程序是用纯汇编编写的,但我在打印字符串时遇到了问题,因为单个字符都可以:

这是我的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
这里是我的内核。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.asm和 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肉桂版本18上。 它在soweit之后打印出10G,所以这些是它应该打印的5G加上hall0中的字符数,但我不打印hall0。 因此,我一定是在bootloader.asm中做了一些错误的事情,为了使用gcc gnu汇编程序,可能设置了错误的堆栈或其他什么。
也许有人能帮我做些什么?

你必须将“kernel.asm”编译成bin文件,然后执行cat命令

注释不用于扩展讨论;这段对话已经结束。这似乎没有解决问题,需要解释出什么地方出了问题,以及这个修复程序将如何工作。