Как мне считать данные с сектора?
Создаю ОС на 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)
Как мне вывести записанный текст на экран?