Сборка 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
Другие вопросы по тегам