02.汇编实现启动扇区

前言

软盘的启动扇区头512字的内容是需要使用汇编实现,内核加载器需要把操作系统加载进内存,实现加载完成后就可使用C语言编写操作系统。

目标

1.使用汇编实现hello,world 的输出

文件名:boot.s

;能用于操作内存的寄存器只能是bx、bp、si、di
;0x7c00--0x7dff 这512字节用于启动区
;对内存的访问都必须指定段寄存器,没有显示指定时将使用ds作为段寄存器

org 0x7c00;

mov ax,0
mov ss,ax
mov ds,ax
mov es,ax
mov si,msg

putloop:
mov al,[si]
add si,1
cmp al,0
je fin
mov ah,0x0e     ;中断调用参数
mov bx,15       ;字符颜色
int 0x10        ;中断调用号
jmp putloop

fin:
hlt
jmp fin


msg:
db 0x0a,0x0a
db "hello world"
db  0x0a
db 0

nasm 汇编器(如果没有nasm汇编器,可参看https://blog.csdn.net/Zllvincent/article/details/83269154)编译boot.s 文件,终端运行 nasm boot.s -o boot.bat

2.使用gcc 编译os.c文件

#include
#include
#include


void makeFloppy(char *fname){
    char img[512];
    FILE *fp = fopen(fname,"r");
    if(fp==NULL){
        printf("fopen error\n");
        exit(1);
    }
    fread(img,512,1,fp);
    img[510] = 0x55;
    img[511] = 0xaa;
    
    FILE *out = fopen("system.img","w");
    if(out==NULL){
        printf("fopen error\n");
        exit(1);
    }
    for(int i=0;i<2*80*18;i++){
        fwrite(img,512,1,out);
        memset(img,0,512);
    }
    fclose(fp);
    fclose(out);
    printf("---------success\n");
    
}


int main(int argc,char **argv){
    makeFloppy("boot.bat");
    return 1;
}

终端运行: gcc os.c

3.终端运行:./a.out ,生成system.img文件如下图:
02.汇编实现启动扇区_第1张图片

使用虚拟机加载system.img文件
02.汇编实现启动扇区_第2张图片

至此,我们的汇编编写的头512字节输出hello world 成功完成,是不是很简单?

总结

软盘还是文件,保存的都是2进制数据,2者可以完全等效。我们使用C语言实现的功能就是把汇编编译生成的机器码使用C语言写入文件,制作成虚拟软盘。

你可能感兴趣的:(自制操作系统)