You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编代码获取字符串长度异常求助:无法识别字符串结束符

问题分析与解决建议

核心问题点

  • 结束符加载错误:ldrb r5, =newline是错误的指令用法。=newline是伪指令,作用是获取newline标签的内存地址,而你需要的是该地址存储的'\0'值。这条指令实际把地址加载到了r5,而非结束符本身,导致比较逻辑永远不成立,循环会持续执行直到内存越界。
  • 长度计算多1:循环中先读取字符再递增r2,当读取到结束符时,r2已经被加1,最终得到的长度会比实际字符串长度多1(包含了结束符)。
  • 冗余定义:msg用.asciz定义时,会自动在字符串末尾添加'\0',单独定义newline: .byte '\0'完全多余。

修正后的代码

.text
_start: .global _start
        mov r2, #0
        adr r1, msg
        mov r5, #0          @ 直接将'\0'的数值0加载到r5,无需额外内存定义
getlen:
        ldrb r3, [r1,r2]
        cmp r3, r5
        beq print_str       @ 找到结束符直接跳转,避免r2多递增
        add r2, r2, #1
        b getlen
print_str:
        mov r0, #1          @ 标准输出文件描述符
        mov r7, #4          @ sys_write系统调用号
        swi 0               @ 触发系统调用
exit:
        mov r0, #0          @ 退出状态码0
        mov r7, #1          @ sys_exit系统调用号
        swi 0
msg:
        .asciz "Print Me If you can!\n"
.end

额外调试与优化建议

  • 调试时可在getlen循环处设置断点,查看寄存器r3(当前读取的字符值)和r5(结束符值)的数值,确认比较逻辑是否正常触发。
  • 如果是链接libc的场景,也可以直接调用bl strlen函数获取字符串长度,简化代码;裸机汇编场景下,上述修正代码的效率更高。

内容的提问来源于stack exchange,提问作者hilaw00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:55:32