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

汇编程序编译报错:_start.print_transformed符号未定义问题

16位引导汇编程序编译错误修复与功能实现

问题概述

编写的16位引导程序目标是读取用户输入,若输入为"test"则输出"spr",否则原样输出输入内容。但编译时出现错误:

boot.asm:50: error: symbol `_start.print_transformed' not defined

错误原因及修复要点

  1. 未定义标签引用:代码中使用jnz .print_transformed跳转,但该标签从未定义,属于无效引用。
  2. 输入读取逻辑错误:
    • 使用stosb但未初始化di寄存器指向输入缓冲区,导致数据写入未知内存区域
    • 读取回车后未添加字符串结束符,后续字符串处理会出现乱码
  3. 字符串比较逻辑错误:check_and_transform中lodsb后直接对比al与[si],实际是将同一个地址的内容与自身对比,无法正确匹配目标字符串
  4. 冗余定义:.bss段重复定义buffer,同时存在未使用的inp_buf、inp_len变量
  5. 字符串结束符不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:43:18