这是虚拟机显示的:
bochs:
> %include "equ.inc"
org 0x7c00
[bits 16]
cyls equ 80
;
jmp short start
nop
;
header:
bs_oemname db 'fente-os'
bpb_bytespersec dw 512
bpb_secperclus db 1
bpb_rsvdseccnt dw 1
bpb_numfats db 2
bpb_rootentcnt dw 224
bpb_totsec16 dw 2880
bpb_media db 0xf0
bpb_fatsz16 dw 9
bpb_secpertrk dw 18
bpb_numheads dw 2
bpb_hiddsec dd 0
bpb_totsec32 dd 0
bs_drvnum db 0
bs_reserved1 db 0
bs_bootsig db 0x29
bs_volid dd 0
bs_vollab db 'fenteosboot'
bs_filesystype db 'fat12 '
;
start:
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0x7c00
;
call clean_screen
call welcome
call read1
call enternext
call showcs
boot_read:
mov ax,0x0820
mov es,ax
mov ch,0 ;磁道号
mov dh,0 ;磁头号(对于软盘来说就是面号,因为一个面用一个磁头来读写)
mov cl,2 ;(起始)扇区号
call read_disk
;
read_disk:
mov si,0
mov ax,0
mov es,ax
mov bx,0 ;es:bx指向接收/读写扇区的内存区起始地址
mov al,1 ;读取/写入的扇区数目
mov dl,0 ;驱动器号: 软驱从 0 开始: 0,软驱 a ; 1,软驱 b。硬盘从 80h 开始: 80h,硬盘 c ; 81h,硬盘 d 。
mov ah,2 ;int 13h 的功能号(常用的:2 表示读扇区;3 表示写扇区)
int 13h
jnc next ;read ok
add si,1
cmp si,5
jae error1
mov ah,0
mov dl,0
int 13h
jmp read_disk
;
next:
mov ax,es
add ax,0x0020
mov es,ax
add cl,1
cmp cl,18
jbe read_disk
mov cl,1
add dh,1
cmp dh,2
jb read_disk
mov dh,0
add ch,1
cmp ch,cyls
jb read_disk
jmp 0000:8000h
;
;
;
;
welcome:
mov si,msg_start
jmp print
;
read1:
call enternext
mov si,msg_boot
jmp print
;
error1:
call clean_screen
mov si,msg_e1
jmp print
jmp error1
;
a:
call enternext
mov si,msg_a
jmp print
;
;
print: ;显示指定的字符串, 以'$'为结束标记
mov al,[si]
cmp al,'$'
je hu
mov ah,0x0e
int 10h
inc si
jmp print
;
;
;
;
clean_screen:
mov ax,0x02
int 0x10
ret
;
hu:
ret
;
;
;
enternext: ;显示回车换行
mov ah,0eh
mov al,0dh
int 10h
mov al,0ah
int 10h
ret
;
showcs: ;展示CS的值
mov ax,cs
mov dl,ah
call HL4BIT
mov dl, BH
call ASCII
mov [message4+3],dl
;
mov dl, Bl
call ASCII
mov [message4+4],dl
;
mov dl,al
call HL4BIT
mov dl, BH
call ASCII
mov [message4+5],dl
;
mov dl, Bl
call ASCII
mov [message4+6],dl
;
mov si, message4
call print
;
ret
;
;-----------------将16进制数字(1位)转换成ASCII码,输入DL,输出DL------
ASCII: CMP DL,9
JG LETTER ;DL>OAH
ADD DL,30H ;如果是数字,加30H即转换成ASCII码
RET
LETTER: ADD DL,37H ;如果是A~F,加37H即转换成ASCII码
RET
;
;-----------------取出1个字节Byte的高4位和低4位,输入DL,输出BH和BL----------
;
HL4BIT: MOV DH,dl
MOV BL,dl
SHR DH,1
SHR DH,1
SHR DH,1
SHR DH,1
MOV BH,DH ;取高4位
AND BL,0FH ;取低4位
RET
;
fin:
hlt ;cpu停止,等待指令
jmp fin ;无限循环
;
msg_start: db 'starting...','$'
msg_boot: db 'boot','$'
msg_e1: db 'error 00x0000001','$'
message4: db 'CS:????','$'
msg_a: db 'A','$'
;
;
times 510 - ($ - $$) db 0
db 0x55,0xaa
org 8000h
clean_screen:
mov ax,0x02
int 0x10
fin:
hlt
jmp fin
TOOL = ../tools/
BTOOL = ../tools/Bochs-2.6.11/
;
MAKE =$(TOOL)make.exe -r
NASM =$(TOOL)nasm.exe
DD =$(TOOL)dd.exe
EDIMG = $(TOOLPATH)edimg.exe
BOCHS = $(BTOOL)bochs.exe
TBOCH = $(BTOOL)bochsrc.txt
DEL =del
COPY =copy
;
sector1.bin:boot.asm Makefile
$(NASM) boot.asm -o sector1.bin
sector2.bin:loader.asm Makefile
$(NASM) loader.asm -o loader.sys
$(NASM) loader.asm -o sector2.bin
;
;
fenteos.img:sector1.bin loader.sys Makefile
$(EDIMG) imgin:../tools/fdimg0at.tek
wbinimg src:sector1.bin len:512 from:0 to:0
copy from:loader.sys to:@:
imgout:fenteos.img
;
img:
$(MAKE) fenteos.img
bochs:
$(BOCHS) -q -f $(TBOCH)
clean:
$(DEL) /q "*.img"
makeimg:
fsutil file createnew fenteos.img 1474560
cimg:
$(MAKE) clean
$(MAKE) makeimg
run:
$(MAKE) sector1.bin
$(MAKE) sector2.bin
$(MAKE) img
$(MAKE) bochs
提供参考实例笔记,供你参考【操作系统学习笔记——FAT12文件系统与Loader的加载】,链接:https://www.cnblogs.com/littleboy90/p/15200125.html
【推荐理由:可参考性强,讲解详细】
在这段代码中,有许多行没有分号,这可能导致编译错误。
有一些标签没有以冒号结尾,这也可能导致编译错误。
《一个64位操作系统的设计与实现》学习实践3-boot加载loader
借鉴下
https://blog.csdn.net/zztishan/article/details/88898799/
这个问题可能有多个原因。首先,请检查您的启动扇区代码是否有语法错误。如果没有,则可能是 Bochs 模拟器的配置问题。请确保 Bochs 的硬盘配置是正确的,并检查操作系统的 bootloader 是否在正确的磁盘分区中。如果仍然无法解决问题,可以尝试使用其他模拟器或真实计算机进行测试。