我正在尝试获取 argv 的内容并显示它们。
该程序将被称为像./main 5 6 7
.
r0 = argc
r1 = argv[0]
r2 = argv[1]
该程序可以正确获取命令行参数的数量,但使用 r1 并打印字符串时效果不同。它打印根据参数数量变化的随机字符。
.text
.global main
.extern printf
main:
push {ip, lr}
mov r1, r0
ldr r0, =string
bl printf
pop {ip, pc}
.data
string: .asciz "Argc: %d\n"
Run Code Online (Sandbox Code Playgroud)
参数:
.text
.global main
.extern printf
main:
push {ip, lr}
mov r1, r2
ldr r0, =string
bl printf
pop {ip, pc}
.data
string: .asciz "Argv: %s\n"
Run Code Online (Sandbox Code Playgroud)
argv
是一个数组,作为单个参数传递main
,而不是参数序列。 argv[0]
因此,C 中的[r1]
ARM 汇编语言中的 转换argv[1]
为 to [r1,4]
、argv[2]
to[r1,8]
等。每个数组元素的偏移量增加 4 个字节,因为argv
它是一个指针数组,并且这是普通 ARM(不是 AArch64),因此指针是 32 位宽,即 4 个字节。
如果你改变
mov r1, r2
Run Code Online (Sandbox Code Playgroud)
到
ldr r1, [r1, 4]
Run Code Online (Sandbox Code Playgroud)
你的程序应该可以正常工作。
请注意,您还应该r0
在调用后清除printf
,以便main
返回零,而不是垃圾。
您可能会发现ARM 过程调用标准很有帮助。
归档时间: |
|
查看次数: |
3401 次 |
最近记录: |