Сборка INT 0x13: ошибка при попытке чтения с диска
Всякий раз, когда я запускаю это в 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
Кроме того, если я поставлю "вызов 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 $"
Я собираю файл.asm, используя NASM, и запускаю его с QEMU. "QEMU-FDA..." не работает. Я получаю "Программу qemu можно найти в следующих пакетах", но ни один из пакетов после установки не помог. Я просто запускаю "qemu-system-x86_64 ./Asm/bootsector.bin", чтобы открыть QEMU.
Заранее спасибо.
1 ответ
Ваш указатель стека изначально находится в 0x0000:0x8000.
Когда вы выполняете команду "call" или "int", адрес возврата помещается в стек (который находится в диапазоне памяти 0x7F00-0x8000).
Когда вы перезаписываете эту память, система падает.
Решение:
Измените 0x8000 на 0x7BFC в этой строке:
mov bp, 0x8000
mov sp, bp