汇编项目编译报错‘undefined symbol: stringread’的含义与原因咨询
汇编代码编译错误:
undefined symbol: stringread 问题解析 问题重现
在大学汇编课程的项目中,最初在.data段声明字符串/数组时使用了错误语法:
stringread BYTE DUP(STRSIZE)
主函数中调用ReadFileLine的代码如下:
push OFFSET stringread push esi call ReadFileLine pop esi pop OFFSET stringread
编译时触发错误:
undefined symbol: stringread
将声明修改为stringread BYTE STRSIZE DUP(?)后,编译通过,问题解决。
错误含义
undefined symbol: stringread 表示汇编器在代码中找不到名为stringread的有效符号定义——你的stringread声明不符合汇编语法规范,导致汇编器未将其识别为合法符号,后续代码引用时就会判定该符号未定义。
出错原因
主流x86汇编器(如MASM、NASM)中,使用DUP批量定义数据的语法规则为:类型 重复次数 DUP(重复内容)。
你最初的写法完全颠倒了顺序:
- 正确逻辑:先指定重复次数(
STRSIZE),再写DUP关键字,最后在括号内定义重复的内容(这里用?表示未初始化的字节) - 错误写法把
DUP放在了次数前面,汇编器无法解析该声明,自然不会生成stringread这个符号,后续代码引用OFFSET stringread时就会触发符号未定义错误。
对比教授的示例array DWORD 1,2,3,4,5,这是直接枚举数据的写法;而用DUP批量定义时,必须遵循[类型] [次数] DUP([内容])的语法,stringread BYTE STRSIZE DUP(?)就是正确写法:告诉汇编器定义一个名为stringread的字节数组,长度为STRSIZE,每个字节初始化为未定义状态。
内容的提问来源于stack exchange,提问作者outerspec
相关产品推荐
相关产品推荐

