我想在Assembly中使用一个函数,但它不工作。

问题描述 投票:0回答:1

我想用汇编做一个基本的操作系统。但这并不奏效。我不知道为什么。对了,我是个初学者。我想做的事情是有print_string,用函数打印出boot_string.Code。

    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

如果有人能帮我解决这个问题,我会非常高兴。如果你知道有什么关于操作系统开发的网站,请给我网址,这样我也可以查一下^_^。

assembly x86-16 bootloader bios osdev
1个回答
-1
投票

垃圾信息显示 视频 - 电话输出 不是从 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
© www.soinside.com 2019 - 2024. All rights reserved.