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

如何在Arm汇编中遍历访问命令行后续参数

ARM汇编访问后续命令行参数解决方案

核心原理

32位ARM架构的C标准调用约定中,main函数的入参遵循以下规则:

  • r0 存储 argc:命令行参数总个数,包含程序自身名称
  • r1 存储 argv:字符串指针数组的首地址,每个数组元素占4字节,分别对应argv[0](程序名)、argv[1](第一个用户参数)、argv[2](第二个用户参数)...argv[argc-1]

现有代码问题

你当前代码直接将argv[1]的字符串地址存入了r4,后续偏移操作是在字符串地址上计算,自然无法拿到后续参数的指针。后续参数的指针需要在argv数组首地址(初始的r1值)上做偏移计算。

修正后可运行代码

main:
        push {r4, r5, ip, lr}
        mov r5, r1          @ 先把argv数组首地址存在r5里,避免后续被覆盖
        @ 打印第一个用户参数argv[1]
        ldr r4, [r5, #4]    @ argv[1] = 数组首地址偏移4字节
        mov r1, r4
        ldr r0, =stringS
        bl printf

        @ 打印第二个用户参数argv[2]
        ldr r4, [r5, #8]    @ argv[2] = 数组首地址偏移8字节
        mov r1, r4
        ldr r0, =stringS
        bl printf

        mov r0, #0          @ 返回值0
        pop {r4, r5, ip, pc}

扩展遍历写法

如果需要遍历所有参数,可以配合argc(r0初始值)做循环判断:

  • 每次偏移4字节读取下一个argv元素
  • 直到偏移量超过(argc-1)*4就停止遍历

内容的提问来源于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 10:36:08