Turbo Assembler(TASM)外部过程调用出现Undefined symbol错误求助
Turbo Assembler 跨文件调用过程时链接错误的解决办法
问题分析
你遇到的MyProcedure未定义符号错误,核心原因有两个:
- 被调用的过程未声明为公开符号:
file1.asm中的MyProcedure没有标记为PUBLIC,链接器无法识别它是允许外部文件调用的符号。 - 链接命令存在笔误:你写的
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
相关产品推荐
相关产品推荐

