我正在尝试在Assembly中使用一个函数,但无法正常工作

时间:2020-05-25 18:48:23

标签: assembly x86-16 bootloader bios osdev

我正在尝试通过汇编制作基本的操作系统。但这是行不通的。我不知道为什么顺便说一下,我是一个初学者。我想做的事情是拥有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

如果有人能帮助我解决这个问题,我将非常高兴。如果您知道任何有关OS开发的网站,请提供URL,以便我也可以检查它们^ _ ^

1 个答案:

答案 0 :(得分:-1)

垃圾表明未从boot_string馈送VIDEO - TELETYPE OUTPUT,即执行lodsb时未正确设置DS:SI。

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