首个ARM汇编程序求助:armasm64中标签使用出现未定义符号错误
ARM汇编标签使用问题解决与核心规则
问题根源:标签定义缺少冒号
你遇到的undefined symbol: null_string错误,核心原因是标签定义时没有加冒号,armasm64汇编器要求标签必须以冒号:结尾才能被识别为有效标签,否则会被当作未定义符号处理。
修正后的代码示例
第一种代码修正版
AREA |.text|, CODE, READONLY EXPORT strlen strlen: ; 标签必须加冒号 cbz x1, null_string ; do nothing for a NULL string ; ldrsb x8,[x1] ; load first character into x8 ; mov x9,x1 ; save x1 into x9 ; cbz x8,zero_length_string ; handle if string is "\0" ; ldrsb x8,[x9,#1]! ; load next character into x8 ; cbnz x8,non_zero_character ; compare and branch if x8 is > 0x00 ; sub x8,x9,x1 ; this will give the count of characters in x8 ; mov x1,x8 ; x1 is returned to the caller null_string: ret ; mission complete! END
第二种代码修正版
AREA |.text|, CODE, READONLY EXPORT strlen strlen: ; 标签必须加冒号 cmp x1, #0 beq null_string null_string: ret END
ARM汇编标签使用核心规则
- 必须以冒号结尾:这是汇编器识别标签的关键,比如
strlen:是有效标签,strlen会被当作未定义符号。 - 命名规范:标签名可包含字母、数字、下划线,不能以数字开头,且大小写敏感(
Null_String和null_string是两个不同标签),避免使用ARM指令名、寄存器名作为标签。 - 作用域与导出:
- 标签默认仅在当前
AREA(代码/数据段)内可见,若要让外部模块调用,需用EXPORT 标签名声明。 - 引用其他模块的标签时,要提前用
IMPORT 标签名声明。
- 标签默认仅在当前
- 跳转有效性:跳转指令(如
cbz、beq)中的标签必须在当前文件已定义,或通过IMPORT引入,否则会触发“未定义符号”错误。
内容的提问来源于stack exchange,提问作者digispin
相关产品推荐
相关产品推荐

