Я пытаюсь использовать функцию в сборке, но она не работает - PullRequest
0 голосов
/ 25 мая 2020

Пытаюсь сделать базовую c ОС со сборкой. Но это не работает. Не знаю почему. Кстати, я новичок. Я хочу иметь print_string, использовать функцию для вывода boot_string. Код:

    BITS 16
start:
    mov ax, 07C0h
    mov ax, 288
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h
    mov ds, ax
    mov si, text_string
    call print_string
    jmp $         ; INFINITE LOOP



print_string:
    mov ax, boot_string
.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat
.done:
    ret



    times 510-($-$$) db 0
    dw 0xAA55
boot_string    db 'Starting Operating System...', 0

Но когда я компилирую это, он выдает эту ошибку;

nasm -f bin -o os.bin os.asm
os.asm:13: error: symbol `text_string' undefined
os.asm:19: error: label `print_string' changed during code generation [- 
w+error=label-redef-late]
os.asm:21: error: label `print_string.repeat' changed during code generation [- 
w+error=label-redef-late]
os.asm:28: error: label `print_string.done' changed during code generation [- 
w+error=label-redef-late]
make: *** [Makefile:2: nasm] Error 1

Я был бы очень рад, если бы кто-нибудь помог мне решить эту проблему. И если вы знаете какие-либо сайты о разработке ОС, укажите URL-адрес, чтобы я тоже мог их проверить ^ _ ^

1 Ответ

0 голосов
/ 27 мая 2020

Мусор указывает, что VIDEO - TELETYPE OUTPUT не передается из boot_string, т.е. DS: SI не установлен должным образом при выполнении lodsb.

CS: IP - единственные два регистра с определенным содержимым в начале. Используйте CS для инициализации регистра сегмента данных. В качестве альтернативы вы также можете использовать cs:lodsb вместо lodsb и оставить DS неопределенным в загрузочном коде.

       BITS 16
start:
    MOV AX,CS
    MOV DS,AX     ; Let the memory model be TINY.
    mov si, boot_string
    call print_string
    jmp $         ; INFINITE LOOP

print_string:
    MOV AH,0Eh    ; BIOS Teletype output
    XOR BX,BX     ; at videopage 0.
.repeat:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .repeat
.done:
    ret

boot_string    db 'Starting Operating System...', 0

    times 510-($-$$) db 0
    dw 0xAA55
...