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