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

Turbo Assembler(TASM)外部过程调用出现Undefined symbol错误求助

Turbo Assembler 跨文件调用过程时链接错误的解决办法

问题分析

你遇到的MyProcedure未定义符号错误,核心原因有两个:

  1. 被调用的过程未声明为公开符号:file1.asm中的MyProcedure没有标记为PUBLIC,链接器无法识别它是允许外部文件调用的符号。
  2. 链接命令存在笔误:你写的tlink file1.obj+tlink2.obj里的tlink2.obj是错误的,应该是file2.obj。
    另外还有一个潜在问题:file1.asm里的字符串Msg被放在了CODE段之后,不符合段定义规范,会导致运行时错误。

修正步骤

1. 修改file1.asm,声明PUBLIC并调整数据位置

将Msg移到.DATA段,同时为MyProcedure添加PUBLIC声明:

.MODEL SMALL
.DATA
    Msg DB "Hello, World!$"  ; 把数据移到DATA段

.CODE
    PUBLIC MyProcedure  ; 声明该过程可被外部文件调用

    ; Define the procedure
    MyProcedure PROC
        ; Procedure code goes here
        MOV AH, 9     ; DOS interrupt to print string
        LEA DX, Msg   ; Load the address of the message
        INT 21h       ; Call DOS interrupt
        RET           ; Return from the procedure
    MyProcedure ENDP

END

2. 修正链接命令

将错误的链接命令改为:

tasm file1.asm  
tasm file2.asm  
tlink file1.obj+file2.obj

3. 验证file1.inc和file2.asm

file1.inc的EXTRN MyProcedure:NEAR声明是正确的,因为我们在file1.asm里的MyProcedure默认是NEAR类型(和.MODEL SMALL匹配)。file2.asm的代码无需修改,确保INCLUDE file1.inc的路径正确(如果inc文件和asm不在同一目录,需要指定完整路径)。

原理说明

  • PUBLIC关键字用于标记当前模块中的符号(过程、变量等)允许被其他模块访问。
  • EXTRN关键字用于在当前模块中声明需要从其他模块引用的符号,必须和被引用符号的类型(NEAR/FAR)一致。
  • Turbo Linker需要同时包含所有相关的目标文件,才能正确解析跨模块的符号引用。

内容的提问来源于stack exchange,提问作者Larry White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:54:51