如何修复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
关键修正点
- 将
jmp .mpmp替换为jmp .loop,让子程序循环处理字符串的每个字符; - 在
int 0x10前添加mov ah, 0x0E,明确指定BIOS中断的打印功能,确保字符能正常输出。
内容的提问来源于stack exchange,提问作者LoganSMLISBACK the gamer
相关产品推荐
相关产品推荐

