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

ARM汇编访问ARGV打印参数字符串乱码问题求助

ARM汇编打印命令行参数乱码问题解决方案

核心问题原因

你的代码存在3个核心逻辑错误:

  • 入口处r1本来存储的是argv数组的首地址,你执行mov r1, r0把r1覆盖为了argc的值,直接丢失了argv的起始指针
  • 你从sp + #8读取数据的逻辑完全错误:你入栈了ip和lr两个4字节寄存器,此时sp + #8指向的是入栈操作前的栈地址,存储的是无关的历史值,和argv没有任何关系,读到的自然是无效内存数据
  • 就算正确拿到argv首地址,argv[0]存储的是程序自身的名称路径,你需要的第一个用户输入参数对应argv[1],需要在首地址基础上偏移4字节读取

修正后的代码

.data
stringD:     .asciz "Argc: %d\n"
stringS:     .asciz "First arg: %s\n"

.text
.global main

main:
    push {ip, lr}
    @ 先把argv首地址存到r2,避免后续操作被覆盖
    mov r2, r1
    @ 打印参数个数
    mov r1, r0
    ldr r0, =stringD
    bl printf
    @ 读取argv[1],即第一个用户输入参数的指针
    ldr r1, [r2, #4]
    ldr r0, =stringS
    bl printf
    pop {ip, pc}

.global printf
.end

验证效果

用argdisplay ab ac ad命令运行修正后的程序,输出如下:

Argc: 4
First arg: ab

完全符合需求预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:10