汇编程序编译报错:_start.print_transformed符号未定义问题
16位引导汇编程序编译错误修复与功能实现
问题概述
编写的16位引导程序目标是读取用户输入,若输入为"test"则输出"spr",否则原样输出输入内容。但编译时出现错误:
boot.asm:50: error: symbol `_start.print_transformed' not defined
错误原因及修复要点
- 未定义标签引用:代码中使用
jnz .print_transformed跳转,但该标签从未定义,属于无效引用。 - 输入读取逻辑错误:
- 使用
stosb但未初始化di寄存器指向输入缓冲区,导致数据写入未知内存区域 - 读取回车后未添加字符串结束符,后续字符串处理会出现乱码
- 使用
- 字符串比较逻辑错误:
check_and_transform中lodsb后直接对比al与[si],实际是将同一个地址的内容与自身对比,无法正确匹配目标字符串 - 冗余定义:
.bss段重复定义buffer,同时存在未使用的inp_buf、inp_len变量 - 字符串结束符不匹配:
prompt使用$结尾,但print_string函数是按0字节判断字符串结束,导致提示语无法正确打印
修复后的完整代码
bits 16 org 0x7C00 section .bss buffer resb 256 ; 合并输入缓冲区,移除冗余定义 section .data prompt db 'Enter text: ', 0 ; 改为0结尾,适配print_string逻辑 compare_string db 'test', 0 transform_string db 'spr', 0 section .text global _start _start: ; 初始化文本视频模式 mov ah, 0x00 mov al, 0x03 int 0x10 ; 打印提示语 mov ah, 0x0E mov bh, 0x00 mov bl, 0x07 mov si, prompt call print_string ; 读取用户输入 mov di, buffer ; 初始化di指向缓冲区,用于stosb mov cx, 255 ; 输入最大长度限制 .read_loop: mov ah, 0x00 int 0x16 ; 从键盘读取字符 cmp al, 0x0D ; 判断是否为回车 je .done_input mov ah, 0x0E int 0x10 ; 回显输入字符 stosb ; 将字符存入缓冲区 loop .read_loop ; 未到长度限制则继续读取 .done_input: mov byte [di], 0 ; 添加字符串结束符 ; 检查输入是否为"test" mov si, buffer call check_match jz .print_spr ; 匹配成功则跳转到打印spr ; 未匹配则打印原输入 mov ah, 0x0E mov si, buffer call print_string jmp .end_loop .print_spr: ; 打印转换后的字符串 mov ah, 0x0E mov si, transform_string call print_string .end_loop: ; 无限循环 jmp $ ; 按0字节结束的字符串打印函数 print_string: .print_loop: lodsb cmp al, 0 je .print_done int 0x10 jmp .print_loop .print_done: ret ; 检查输入字符串是否与compare_string匹配 ; 输入:si指向输入字符串 ; 输出:ZF=1表示匹配,ZF=0表示不匹配 check_match: pusha mov di, si ; di指向输入字符串 mov si, compare_string mov cx, 4 ; "test"长度为4 .match_loop: mov al, [di] cmp al, [si] jne .match_fail ; 字符不匹配则退出 inc di inc si loop .match_loop ; 检查输入字符串是否刚好结束(避免输入"testxxx"也匹配) cmp byte [di], 0 jne .match_fail .match_success: popa stc ; 设置ZF=1表示匹配成功 ret .match_fail: popa clc ; 设置ZF=0表示匹配失败 ret ; 引导扇区结束标记 times 510-($-$$) db 0 dw 0xAA55
编译与运行命令
nasm -f bin boot.asm -o boot.bin qemu-system-i386 boot.bin
内容的提问来源于stack exchange,提问作者RaphaelGrubbauer
相关产品推荐
相关产品推荐

