程序集 INT 0x13:尝试从磁盘读取时未收到错误
Assembly INT 0x13: Not getting an error when trying to read from disk
每当我 运行 在 QEMU 中执行此操作时,我似乎都没有收到错误消息,但消息并未打印在屏幕上,所以我不确定到底发生了什么我可以'看不见。这是我的代码:
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
mov si, name
call print_string
mov si, version
call print_string
call rd_dsk
mov si, testmsg
call print_string
jmp $
;Print
print_char:
mov ah, 0x0e
int 0x10
ret
print_string:
screen:
lodsb
cmp al, 0
je screen_end
mov ah, 0x0e
int 0x10
jmp screen
screen_end:
ret
print_hex:
mov si, hex_temp
mov bx, dx
shr bx, 12
mov bx, [bx+hex_alph]
mov [hex_temp+2], bl
mov bx, dx
shr bx, 8
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+3], bl
mov bx, dx
shr bx, 4
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+4], bl
mov bx, dx
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+5], bl
call print_string
ret
;Read
rd_dsk:
mov ah, 0x02
mov al, 0x01
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
mov bx, 0x00
mov es, bx
mov bx, 0x7c00 + 512
int 0x13
jc rd_dsk_error
ret
; Error
rd_dsk_error:
mov si, rd_dsk_error_msg
call print_string
jmp $
;Misc Data
name:
db 'PurityOS ',0
version:
db 'v0.0.1.2 ',0
hex_temp:
db '0x????',0
hex_alph:
db '0123456789ABCDEF'
; Error Messages
rd_dsk_error_msg:
db 'Error reading the disk.',0
times 510-($-$$) db 0
dw 0xaa55
;Data beyond BootSector
testmsg:
db 'Reading Second Sector',0
我希望得到这个输出:
PurityOS v0.0.1.2 Reading Second Sector
然而,我只得到这个:
PurityOS v0.0.1.2
此外,如果我将 "call rd_dsk" 放在顶部:
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
call rd_dsk
mov si, name
call print_string
mov si, version
call print_string
mov si, testmsg
call print_string
jmp $
我没有得到任何输出,我只有闪烁的光标,好像我只有 "jmp $"
我 assemble 使用 NASM .asm 文件,我 运行 使用 QEMU。 "qemu -fda ..." 不起作用。安装后,我得到 "The program 'qemu' can be found in the following packages" 其中 none 个软件包有帮助。我只是 运行 "qemu-system-x86_64 ./Asm/bootsector.bin" 打开 QEMU。
提前致谢。
您的堆栈指针最初位于 0x0000:0x8000。
当您执行 "call" 或 "int" 指令时,return 地址被压入堆栈(位于内存范围 0x7F00-0x8000)。
覆盖此内存时系统会崩溃。
解决方案:
在此行中将 0x8000 更改为 0x7BFC:
mov bp, 0x8000
mov sp, bp
每当我 运行 在 QEMU 中执行此操作时,我似乎都没有收到错误消息,但消息并未打印在屏幕上,所以我不确定到底发生了什么我可以'看不见。这是我的代码:
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
mov si, name
call print_string
mov si, version
call print_string
call rd_dsk
mov si, testmsg
call print_string
jmp $
;Print
print_char:
mov ah, 0x0e
int 0x10
ret
print_string:
screen:
lodsb
cmp al, 0
je screen_end
mov ah, 0x0e
int 0x10
jmp screen
screen_end:
ret
print_hex:
mov si, hex_temp
mov bx, dx
shr bx, 12
mov bx, [bx+hex_alph]
mov [hex_temp+2], bl
mov bx, dx
shr bx, 8
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+3], bl
mov bx, dx
shr bx, 4
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+4], bl
mov bx, dx
and bx, 0x000f
mov bx, [bx+hex_alph]
mov [hex_temp+5], bl
call print_string
ret
;Read
rd_dsk:
mov ah, 0x02
mov al, 0x01
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
mov bx, 0x00
mov es, bx
mov bx, 0x7c00 + 512
int 0x13
jc rd_dsk_error
ret
; Error
rd_dsk_error:
mov si, rd_dsk_error_msg
call print_string
jmp $
;Misc Data
name:
db 'PurityOS ',0
version:
db 'v0.0.1.2 ',0
hex_temp:
db '0x????',0
hex_alph:
db '0123456789ABCDEF'
; Error Messages
rd_dsk_error_msg:
db 'Error reading the disk.',0
times 510-($-$$) db 0
dw 0xaa55
;Data beyond BootSector
testmsg:
db 'Reading Second Sector',0
我希望得到这个输出:
PurityOS v0.0.1.2 Reading Second Sector
然而,我只得到这个:
PurityOS v0.0.1.2
此外,如果我将 "call rd_dsk" 放在顶部:
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
call rd_dsk
mov si, name
call print_string
mov si, version
call print_string
mov si, testmsg
call print_string
jmp $
我没有得到任何输出,我只有闪烁的光标,好像我只有 "jmp $"
我 assemble 使用 NASM .asm 文件,我 运行 使用 QEMU。 "qemu -fda ..." 不起作用。安装后,我得到 "The program 'qemu' can be found in the following packages" 其中 none 个软件包有帮助。我只是 运行 "qemu-system-x86_64 ./Asm/bootsector.bin" 打开 QEMU。
提前致谢。
您的堆栈指针最初位于 0x0000:0x8000。
当您执行 "call" 或 "int" 指令时,return 地址被压入堆栈(位于内存范围 0x7F00-0x8000)。
覆盖此内存时系统会崩溃。
解决方案:
在此行中将 0x8000 更改为 0x7BFC:
mov bp, 0x8000
mov sp, bp