利用bios中断在屏幕上显示字符和读磁盘
程序员文章站
2024-03-24 08:37:16
...
汇编器:nasm
模拟器:bochs
写两个汇编文件,来模拟引导程序和内核程序。引导扇区负责把内核程序读到内存中(通过bios 0x13中断),读入内存后,通过判断是否读成功,在屏幕上显示不同的提示字符(通过bios 0x10中断)。
bootsect.s是512个字节,放入虚拟软盘的第一个磁道,第一个扇区,在虚拟机启动时会加载到内存0x7c00处,然后从这开始执行,它会负责把init.s加载到内存0x10000处。
bootsect.s
BOOTSEG equ 0x7c0
section .text vstart=0
jmp BOOTSEG:start
start:
mov ax, cs
mov ds, ax
mov ss, ax
mov ax, 0x0203
mov cx, 0x0002
mov dx, 0x0000
mov bx, 0x1000
mov es, bx
xor bx, bx
int 0x13 ;bios 0x13号中断,读磁盘
jnc ok_load
mov bp, failMsg
call dispstr
jmp $
ok_load:
mov bp, okMsg
call dispstr
jmp $
dispstr:
mov ax, 0
mov es, ax
mov ax, 0x1301
mov bx, 0x004f
mov cx, 3
mov dx, 0x0101
int 0x10 ;bios 0x10号中断,显示字符
ret
okMsg: db "ok", 0
failMsg: db "fa", 0
times 510-($-$$) db 0
dw 0xaa55
init.s
org 0x90000
times 512*3 db 0xaa
文件夹下的文件:
汇编命令,写虚拟磁盘命令都放在了Makefile中,直接执行make,然后执行bochs,开启虚拟机:
直接回车:
然后输入命令
b 0x0
回车,就在0x0处设断点,执行到这会停止,如果调试可以输入s
单步执行或n
也是单步,但遇到函数不会进去,可以直接c
continue,直接执行,遇到断点才停。
执行结果:
用命令xp /16bx 0x10000
,可以看到确实将第二个扇区的内容读到了内存0x10000处:
推荐阅读