接入 ARGV 臂组件

Chi*_*ity 1 assembly arm argv

我正在尝试获取 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)

zwo*_*wol 5

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 过程调用标准很有帮助。