You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复boot.asm:21: error: symbol `puts.mpmp'未定义错误?

解决汇编错误:symbol `puts.mpmp' not defined

错误原因

你在puts子程序里写了jmp .mpmp,但整个代码里从未定义过.mpmp这个局部标签,汇编器找不到对应符号,因此抛出错误。

同时你的字符串打印逻辑还有功能性问题,需要一起修正:

  • 调用BIOS 0x10中断打印字符时,未设置功能号ah=0x0E(电传打字输出功能),直接执行int 0x10无法触发打印动作;
  • jmp .mpmp是明显笔误,应该跳回.loop标签,实现字符串的循环打印。

修正后的完整代码

org 0x7C00
bits 16

%define ENDL 0x0D, 0x0A

start:
jmp main

; 字符串打印子程序:DS:SI指向以0结尾的字符串首地址
puts:
push si
push ax

.loop:
lodsb           ; 从DS:SI读取字节到AL,SI自动自增
or al, al       ; 判断是否为字符串结束符(0)
jz .done        ; 是结束符则跳转到收尾逻辑

mov ah, 0x0E    ; 设置BIOS 0x10中断的功能:电传打字输出
mov bh, 0       ; 指定显示页号为0
int 0x10        ; 调用BIOS中断打印当前字符

jmp .loop       ; 跳回循环,处理下一个字符

.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

关键修正点

  1. 将jmp .mpmp替换为jmp .loop,让子程序循环处理字符串的每个字符;
  2. 在int 0x10前添加mov ah, 0x0E,明确指定BIOS中断的打印功能,确保字符能正常输出。

内容的提问来源于stack exchange,提问作者LoganSMLISBACK the gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:15:05