利用bios中断在屏幕上显示字符和读磁盘

汇编器: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

github上的源码

文件夹下的文件:
这里写图片描述

汇编命令,写虚拟磁盘命令都放在了Makefile中,直接执行make,然后执行bochs,开启虚拟机:
这里写图片描述

直接回车:
这里写图片描述

然后输入命令

b 0x0

回车,就在0x0处设断点,执行到这会停止,如果调试可以输入s单步执行或n也是单步,但遇到函数不会进去,可以直接ccontinue,直接执行,遇到断点才停。

执行结果:
这里写图片描述

用命令xp /16bx 0x10000,可以看到确实将第二个扇区的内容读到了内存0x10000处:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/familyshizhouna/article/details/81118004