这是我的代码
org 0x7C00
bits 16
%define ENDL 0x0D, 0x0A
start:
jmp main
puts:
push si
push ax
.loop:
lodsb
or al, al
jz .done
mov bh, 0
int 0x10
jmp .mpmp
.done:
pop ax
pop si
ret
main:
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
mov si, msg_bootstring
call puts
hlt
.halt:
jmp .halt
msg_bootstring: db "MudOS 1.0 Beta Development Preview", ENDL, 0
msg_bootstring1: db "Starting", ENDL, 0
times 510-($-$$) db 0
dw 0AA55h
我尝试再次执行此操作,但它只是显示相同的错误
puts: ... jmp .mpmp main:
由于前缀点,NASM 将 .mpmp 标签视为 local 标签。由于此本地标签位于全局标签 puts 和 main 之间,因此该标签的全名变为 puts.mpmp。然后错误消息表明您忘记在程序中定义这样的标签。事实上,代码应该使用
jmp .loop
才是正确的。
NASM 无法检测到的另一个错误是您忘记插入将 AH 设置为 BIOS.Teletype 服务的功能编号的指令。
org 0x7C00
bits 16
%define ENDL 0x0D, 0x0A
start:
jmp main
puts:
push si
push ax
.loop:
lodsb
or al, al
jz .done
mov bh, 0
mov ah, 0x0E ; BIOS.Teletype
int 0x10
jmp .loop
.done:
pop ax
pop si
ret