AMD64架构AT&T汇编数据记录指针引用链接错误求助
解决64位AT&T汇编中字符串指针引用的链接错误
错误原因
在AT&T汇编语法里,$前缀是用来标记立即数常量的,直接写符号名(比如gkcname)才是引用该符号的内存地址(也就是你需要的字符串指针)。你在.quad指令前给符号加了$,会让汇编器把$gkcname当成一个未定义的数值常量,而非字符串的地址,所以链接器会报出"undefined reference"的错误。
修正后的代码
数据记录部分
people: .quad gkcname, 200, 8, 12, 75, 34 .quad jbname, 200, 8, 12, 75, 34 .quad taname, 200, 8, 12, 75, 34 .quad inname, 200, 8, 12, 75, 34 .quad gmname, 200, 8, 12, 75, 34 endpeople:
字符串定义部分(保持原有写法即可)
gkcname: .ascii "Gilbert Keith Clevester\0" jbname: .ascii "对应JB的名字内容\0" taname: .ascii "对应TA的名字内容\0" inname: .ascii "对应IN的名字内容\0" gmname: .ascii "对应GM的名字内容\0"
补充AT&T语法的核心区分要点
- 存储符号地址到数据段:直接写符号名,比如
.quad gkcname,汇编器会自动把该符号的64位内存地址存入对应内存位置。 - 加载符号地址到寄存器:需要加
$前缀,比如movq $gkcname, %rax,表示把gkcname的地址值存入rax寄存器。 - 加载符号指向的内存内容到寄存器:不加
$前缀,比如movq gkcname, %rax,表示把gkcname地址处的8字节内容存入rax。
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

