如何在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
相关产品推荐
相关产品推荐

