Как исправить переполнение памяти?
я недавно написал простенькое ядро на NASM.
boot.asm (загрузчик)
[BITS 16]
[ORG 7c00h]
start:
cli
xor ax, ax
mov ds, ax
mov es, ax
call set_video_mode
mov bl, 0x01
mov cx, 2000
mov di, 0xB800
rep stosw
mov ah, 0x02
mov al, 1
mov ch, 0
mov dh, 0
mov cl, 2
mov bx, 500h
int 0x13
jc disk_error
jmp 500h
disk_error:
mov si, error_message
mov di, 0xB800
call print_string
jmp $
set_video_mode:
mov ax, 0x03
int 0x10
ret
print_string:
mov ah, 0x0E
.print_char:
lodsb
or al, al
jz .done
int 0x10
jmp .print_char
.done:
ret
error_message db "Disk read error. Please restart your PC.", 13, 10, 0
times 510 - ($ - $$) db 0
dw 0xAA55
kernel.asm (код загружаемый загрузчиком)
[BITS 16]
[ORG 500h]
start:
cli
call set_video_mode
call print_interface
call print_newline
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
call print_newline
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 ; Изменено с 150 на 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_banner
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
call unknown_command
ret
do_banner:
call print_interface
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, 1
mov ch, 0
mov dh, 0
mov cl, 3
mov bx, 0x7C00
int 0x13
jmp 0x7C00
header db '============================= x16 PRos v0.1 ====================================', 0
menu db 'Commands:', 10, 13, 10, 13
db 'help', 10, 13
db 'cls', 10, 13
db 'shut', 10, 13
db 'pong', 10, 13, 0
unknown_msg db 'Unknown command.', 0
prompt db '[PRos] > ', 0
command_buffer db 256 dup(0)
проблема в том, что при добавлении новых функций часть текста начинает пропадать с экрана
Начинает пропадать часть текста
Как я понял размер сектора слишком мал. В таком случае как увеличить его размер?