Как мне считать данные с сектора?

Создаю ОС на NASM. Реализовав запись на диск (записывается успешно), возникли проблемы с выводом содежимого сектора. Вот так я пытался считать записанный текст:

[BITS 16]
[ORG 500h]

start:
    cli
    call set_video_mode
    call print_interface
    call print_newline
    call write_to_sector
    call shell
    jmp $

set_video_mode:
    mov ax, 0x03
    int 0x10
    ret

print_string:
    mov ah, 0x0E
    mov bh, 0x00
    mov bl, 0x1F
.next_char:
    lodsb
    cmp al, 0
    je .done
    int 0x10
    jmp .next_char
.done:
    ret

print_newline:
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    ret

print_interface:
    mov si, header
    call print_string
    mov si, menu
    call print_string
    call print_newline
    ret

print_help:
    mov si, menu
    call print_string
    call print_newline
    ret

shell:
    mov si, prompt
    call print_string
    call read_command
    call print_newline
    call execute_command
    jmp shell

read_command:
    mov di, command_buffer
    xor cx, cx
.read_loop:
    mov ah, 0x00
    int 0x16
    cmp al, 0x0D
    je .done_read
    cmp al, 0x08
    je .handle_backspace
    cmp cx, 255
    jge .done_read
    stosb
    mov ah, 0x0E
    mov bl, 0x1F
    int 0x10
    inc cx
    jmp .read_loop

.handle_backspace:
    cmp di, command_buffer
    je .read_loop
    dec di
    dec cx
    mov ah, 0x0E
    mov al, 0x08
    int 0x10
    mov al, ' '
    int 0x10
    mov al, 0x08
    int 0x10
    jmp .read_loop

.done_read:
    mov byte [di], 0
    ret

execute_command:
    mov si, command_buffer
    cmp byte [si], 'h'
    cmp byte [si+1], 'e'
    cmp byte [si+2], 'l'
    cmp byte [si+3], 'p'
    je do_help
    cmp byte [si], 'c'
    cmp byte [si+1], 'l'
    cmp byte [si+2], 's'
    je do_cls
    cmp byte [si], 's'
    cmp byte [si+1], 'h'
    cmp byte [si+2], 'u'
    cmp byte [si+3], 't'
    je do_shutdown
    cmp byte [si], 'p'
    cmp byte [si+1], 'o'
    cmp byte [si+2], 'n'
    cmp byte [si+3], 'g'
    je start_pong
    cmp byte [si], '2'
    cmp byte [si+1], '0'
    cmp byte [si+2], '4'
    cmp byte [si+3], '8'
    je start_2048
    cmp byte [si], 'l'
    cmp byte [si+1], 'o'
    cmp byte [si+2], 'a'
    cmp byte [si+3], 'd'
    je load_program
    cmp byte [si], 'c'
    cmp byte [si+1], 'l'
    cmp byte [si+2], 'o'
    cmp byte [si+3], 'c'
    cmp byte [si+4], 'k'
    je start_clock
    cmp byte [si], 's'
    cmp byte [si+1], 'n'
    cmp byte [si+2], 'a'
    cmp byte [si+3], 'k'
    cmp byte [si+4], 'e'
    je start_snake
    call unknown_command
    ret

do_banner:
    call print_interface
    call print_newline
    ret

do_help:
    call print_help
    call print_newline
    ret

do_cls:
    mov cx, 25
.clear_loop:
    call print_newline
    loop .clear_loop
    ret

unknown_command:
    mov si, unknown_msg
    call print_string
    call print_newline
    ret

do_shutdown:
    mov ax, 0x5307
    mov bx, 0x0001
    mov cx, 0x0003
    int 0x15
    ret

start_pong:
    mov ah, 0x02
    mov al, 4
    mov ch, 0
    mov dh, 0
    mov cl, 7
    mov bx, 0x7C00
    int 0x13
    jmp 0x7C00

start_2048:
    mov ah, 0x02
    mov al, 5
    mov ch, 0
    mov dh, 0
    mov cl, 8
    mov bx, 700h
    int 0x13
    jmp 700h

start_snake:
    mov ah, 0x02
    mov al, 7
    mov ch, 0
    mov dh, 0
    mov cl, 9
    mov bx, 700h
    int 0x13
    jmp 700h

start_clock:
    mov ah, 0x02
    mov al, 2
    mov ch, 0
    mov dh, 0
    mov cl, 6
    mov bx, 700h
    int 0x13
    jmp 700h

load_program:
    mov si, command_buffer
    add si, 5
    sub si, command_buffer

    movzx ax, byte [command_buffer + 5]
    sub ax, '0'
    mov bl, al

    call start_program
    ret

start_program:
    mov ah, 0x02
    mov al, 16
    mov ch, 0
    mov dh, 0
    mov cl, bl
    mov bx, 700h
    int 0x13
    jmp 700h

write_to_sector:
    mov si, text_to_write
    mov cx, 512
    mov dx, 0080h
    mov cl, 11
    lea bx, buffer
    mov al, 1
    int 0x13 
    mov si, success_msg 
    call print_string
    jmp read_from_sector
    
read_from_sector:
    mov ah, 02h
    mov al, 1
    mov ch, 0 
    mov cl, 11
    mov dh, 0
    mov bx, buffer
    mov dx, 0080h 
    int 0x13 
   
    lea si, buffer
    call print_buffer
    jmp shell
    
print_buffer:
    mov cx, 512
    mov di, buffer
print_loop:
    lodsb
    cmp al, 0
    je print_done
    call print_char
    loop print_loop

print_done:
    ret

print_char:
    mov ah, 0eh
    int 10h
    ret
    
header db '============================= x16 PRos v0.1 ====================================', 0
menu db '_________________________________________________', 10, 13, 10 ,13
     db 'Commands:', 10, 13, 10, 13
     db ' help - get list of the commands', 10, 13
     db ' cls - clear terminal', 10, 13
     db ' shut - shutdown PC', 10, 13
     db ' load <sector num> - load program from disk sector', 10, 13
     db ' clock - start clock program (disk sector 6)', 10, 13
     db ' pong - play the pong game (disk sector 7)', 10, 13
     db ' 2048 - play the 2048 game (disk sector 8)', 10, 13
     db ' snake - play the snake game (disk sector 9)', 10, 13
     db '_________________________________________________', 0
unknown_msg db 'Unknown command.', 0
prompt db '[PRos] > ', 0
mt db '', 10, 13, 0
success_msg db 'Data written successfully!',10,13 0
buffer db 512 dup(0)  ; Буфер для записи/чтения данных
text_to_write db 'Hello, User!', 0  ; Текст для записи
command_buffer db 256 dup(0)

Как мне вывести записанный текст на экран?


Ответы (0 шт):