Как исправить переполнение памяти?

я недавно написал простенькое ядро на 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)

проблема в том, что при добавлении новых функций часть текста начинает пропадать с экрана

НЕ добавил новые функции

Добавил подробное описание команд

Начинает пропадать часть текста

Как я понял размер сектора слишком мал. В таком случае как увеличить его размер?


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