【发布时间】:2021-02-25 08:43:28
【问题描述】:
我编写了一个简单的程序,将扇区(第 2 扇区)加载到 RAM 中
但什么也不打印。
首先,我为 bootsector 尝试了这段代码:
org 0x7c00
mov ax, 0x1000 ; ES:BX = 1000:0000
mov es, ax
mov bx, 0x00
LoadSectortoMemory:
mov al, 0x01 ; Load 1 sectors
mov ah, 0x02 ; Load disk data to ES:BX
mov cl, 0x02 ; Sector = 2
mov ch, 0x00 ; Cylinder = 0
mov dl, 0x00 ; Drive = 0
mov dh, 0x00 ; Head = 0
int 13h ; Read
jc LoadSectortoMemory ; ERROR => Try again
jmp 0x1000:0x0000
times 510-($-$$) db 0
dw 0xaa55
内核从用户那里获取用户名和密码然后终止程序:
mov si,Username
call Write
call Read
call Next_Line
call Pass
call Read
call Next_Line
call Kernel_Exit
Write:
mov al,[si]
mov ah,0x0e
mov bl,0x07
mov bh,0x00
int 0x10
inc si
mov dl,[si]
cmp dl,0x00
jne Write
ret
Read:
mov ah,0x00
int 0x16
mov ah,0x0e
mov bl,0x07
mov bh,0x00
int 0x10
cmp al,0x0d
jne Read
ret
Pass:
mov si,Password
call Write
ret
Next_Line:
mov al,0x0a
mov ah,0x0e
mov bl,0x07
mov bh,0x00
int 0x10
ret
Kernel_Exit:
mov si,Done
call Write
mov ah,0x4c
int 0x21
Username db 'Username: ',0
Password db 'Password: ',0
Done db 'Done',0
times 510-($-$$) db 0
没有用
搜索后我尝试了这段代码(只是在末尾添加了寄存器:/):
bits 16
org 0x7c00
mov ax, 0x1000 ; ES:BX = 1000:0000
mov es, ax
mov bx, 0x00
LoadSectortoMemory:
mov al, 0x01 ; Load 1 sectors
mov ah, 0x02 ; Load disk data to ES:BX
mov cl, 0x02 ; Sector = 2
mov ch, 0x00 ; Cylinder = 0
mov dl, 0x00 ; Drive = 0
mov dh, 0x00 ; Head = 0
int 0x13 ; Read!
jc LoadSectortoMemory ; ERROR => Try again
mov ax, 0x1000
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp 0x1000:0x0
times 510-($-$$) db 0
dw 0xaa55
还是不行
我使用的命令行:
nasm -fbin BootSector.asm -o Bootsector.bin
nasm -fbin Kernel.asm -o Kernel.bin
cat BootSector.bin Kernel.bin > Code.bin
qemu-system-x86_64 Code.bin
是qemu的问题吗?
谁能帮我解决我的问题?
提前致谢
【问题讨论】:
-
如果你指定
qemu-system-i386 -fda code.bin对我有用,不知道为什么。 -
哦,当然。您正在设置
mov dl, 0,这会强制驱动器归零。删除该行以使用加载程序初始化的 ROM-BIOS 单元,它可以在没有-fda的情况下工作。 -
@ecm 非常感谢你,伙计。帮了我很多。只是一个问题:没有将 ax 添加到 fs 和 gs 以及其他寄存器(我尝试过的第二个引导扇区)它会打印一些不寻常的东西。为什么会这样?
-
参考我回答的第二点。不需要设置
fs、gs和es。需要设置ds。
标签: assembly qemu bootloader sector