org 0x7C00 ;主引导记录的内存地址
jmp entry
;入口
entry:
;清空四个寄存器的值
mov ax, 0 ;ax 通用寄存器 eax的低16位
mov ds, ax ;data segment 数据段寄存器
mov ss, ax ;stack segment 堆栈段寄存器
mov es, ax ;extra segment 附加段寄存器
;将msg地址赋给si
mov si, msg ;源变址寄存器
;循环遍历字符串msg的值,遇到0x00后直接跳到fin代码块,结束执行
foreachMsg:
mov al, [si] ;等同 mov al, byte [si] 将si地址开始的一个字节的值放入al中
inc si ;si = si+1
cmp al, 0x00 ;al与0比较
je fin ;如上面比较相等 则跳转到fin 不相等则不跳转,执行后面命令
mov ah, 0x0e
int 0x10 ;BIOS中断,10:在当前光标处显示字符
jmp foreachMsg
fin:
HLT ;HLT指令用于使CPU进入HALT状态
jmp fin
msg:
DB 0x0a,0x0a
DB "This is a MBR program, not an OS!"
times 510-($-$$) db 0;填充510字节的0,$$表示编译后的起始地址
dw 0xaa55 ;MBR结束标记0x55aa小端显示 加上前面的510字节正好512字节满足条件
程序测试
将汇编源码生成bin文件,然后将bin文件烧写到磁盘镜像文件中
nasm mbr.s -o mbr.bin && dd if=mbr.bin of=mbr.img bs=512 count=1
bochs配置
memory: guest=30, host=30
romimage:file=$BXSHARE/BIOS-bochs-latest
vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
floppya:1_44=mbr.img,status=inserted
boot:floppy
log:bochsout-mbr.log
mouse:enabled=0
相关文档
汇编指令表 https://wenku.baidu.com/view/dc8148dc195f312b3169a5ad.html
寄存器表 https://blog.csdn.net/qq_25827741/article/details/71429979
INT10中断表 https://blog.csdn.net/qq_40818798/article/details/83933827
MBR格式 https://blog.csdn.net/welldoneyb/article/details/5971225
网友评论