这个问题有点儿像是 最古老的 现有鸡和先有蛋一样。但是这个问题是有答案的
1、最开始编写代码都是 一串 二进制代码 01 。先用机器代码写很简单的操作系统
2、在简单的操作系统上面 写简单的编译器
3、在操作系统上面写代码 ,通过编译软件编译成 机器码。
4、操作系统与编译器循环迭代。
5、编译器与操作系统相互优化。
所以 ,
是先有 操作系统的,后有编译器,用编译器编译后续操作系统 代码
附:操作系统启动过程 (30天自制操作系统)
1、 计算机通电 ,bois 自检 bois 代码加载到内存地址,一般内存的某段地址是bois 代码独用的。操作系统与应用程序不能访问
2、 bois 程序执行 磁盘第一个扇区 (512 字节)的代码。第一个扇区里面的启动代码应该包含加载操作系统代码到内存
3、 启动扇区调用“bois 函数” 讲程序执行位置移动到操作系统所在的内存的地址。
4、操作系统这样就开始运行了。
第一扇区 汇编代码 示例:
; hello-os
; TAB=4
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; 启动扇区名称(8字节)
DW 512 ; 每个扇区(sector)大小(必须512字节)
DB 1 ; 簇(cluster)大小(必须为1个扇区)
DW 1 ; FAT起始位置(一般为第一个扇区)
DB 2 ; FAT个数(必须为2)
DW 224 ; 根目录大小(一般为224项)
DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)
DB 0xf0 ; 磁盘类型(必须为0xf0)
DW 9 ; FAT的长度(必??9扇区)
DW 18 ; 一个磁道(track)有几个扇区(必须为18)
DW 2 ; 磁头数(必??2)
DD 0 ; 不使用分区,必须是0
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明(固定)
DD 0xffffffff ; (可能是)卷标号码
DB "HELLO-OS " ; 磁盘的名称(必须为11字?,不足填空格)
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)
RESB 18 ; 先空出18字节
; 程序主体
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 信息显示部分
DB 0x0a, 0x0a ; 换行两次
DB "hello, world"
DB 0x0a ; 换行
DB 0
RESB 0x1fe-$ ; 填写0x00直到0x001fe
DB 0x55, 0xaa
; 启动扇区以外部分输出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432