MASM中EXTERN伪指令的使用方法及DOSBox下编译报错问题咨询
解决MASM编译错误及DOSBox下的正确编译链接流程
首先,你遇到的"Expected: instruction or directive"错误,核心原因是老版本DOS MASM(比如常用的MASM 5.10)不支持EXTERN伪指令,它使用的是EXTRN,而且语法要求明确声明外部符号的类型。
1. 修正代码中的错误
打开main.asm,把原来的EXTERN atoi替换成:
EXTRN atoi:PROC
这告诉MASM,atoi是一个外部过程(PROC),符合老版本MASM的语法要求。
另外,atoi.asm中的end不需要指定入口点,保持end即可(因为它是一个被调用的模块,主入口在main.asm的end main)。
2. DOSBox下完整的编译链接步骤
假设你的MASM.EXE、LINK.EXE和两个源文件都在同一个目录下,按照以下步骤操作:
步骤1:编译atoi.asm生成目标文件
在DOSBox命令行输入:
MASM atoi.asm, atoi.obj, , ;
- 逗号分隔的参数依次是:源文件、输出目标文件、列表文件(留空)、交叉引用文件(留空)
- 末尾的分号是为了跳过MASM的交互提示,直接完成编译
步骤2:编译修正后的main.asm生成目标文件
输入:
MASM main.asm, main.obj, , ;
这时候应该不会再出现之前的语法错误了。
步骤3:链接两个目标文件生成可执行文件
输入:
LINK main.obj atoi.obj, main.exe, , ;
- 第一个参数是要链接的所有目标文件(用空格分隔)
- 第二个参数是输出的EXE文件名
- 后面的留空参数对应映射文件和库文件,这里不需要可以省略
步骤4:运行程序
输入:
MAIN.EXE
3. 额外注意事项
- 确保
c:\mylib.lby文件存在且路径正确,如果文件在当前目录,可以改成include mylib.lby避免路径问题 - 检查
atoi.asm中的代码逻辑,比如mov si, 2[bp]是正确的(从栈中获取参数),但要确保调用atoi前栈上的参数是正确的 - 如果使用的是MASM 6.x版本,
EXTERN是支持的,但语法同样需要指定类型(EXTERN atoi:PROC),不过DOS下常用的还是MASM 5.x,所以用EXTRN兼容性更好
内容的提问来源于stack exchange,提问作者Mahek Shamsukha
相关产品推荐
相关产品推荐

