繁体   English   中英

进入ARGV臂组件

[英]Access ARGV Arm Assembly

我正在尝试获取argv的内容并显示它们。

该程序将被称为./main 5 6 7

r0 = argc

r1 = argv [0]

r2 = argv [1]

该程序可以正确获取命令行参数的数量,但是通过使用r1并打印一个字符串,它无法正常工作。 它打印随args数量而变化的随机字符。

.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"

精氨酸

.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"

argv是一个数组,作为单个参数而不是参数序列传递给main 因此,C中的argv[0]会转换为ARM汇编中的[r1]argv[1][r1,4]argv[2][r1,8] ,依此类推。 因为argv是一个指针数组,所以偏移量每个数组元素增加了四个字节,这是纯ARM(不是AArch64),因此指针为32位宽,即4个字节。

如果你改变

    mov r1, r2

    ldr r1, [r1, 4]

您的程序应该可以正常运行。

请注意,您还应该在调用printf之后清除r0 ,以便main返回零,而不是垃圾。

您可能会发现ARM过程调用标准很有帮助。

这是我目前正在查看的一些反汇编的ARM代码。 我只是想弄清楚getopt的用法。

; int __cdecl main(int argc, const char **argv, const char **envp)
EXPORT main
main

var_140= -0x140
var_13C= -0x13C
var_138= -0x138
var_130= -0x130
var_32= -0x32
var_30= -0x30
var_2C= -0x2C

STMFD           SP!, {R4-R11,LR}
SUB             SP, SP, #0x11C
MOV             R7, R0  ; R0 contains the argc.  See below
MOV             R6, R1  ; R1 contains the pointer to argv[]
MOV             R3, #0x1434B4
MOV             R5, #0

...some code in between...

MOV             R10, R5
MOV             R4, #aVvk ; "Vvk:" ; setting the shortopts below
ADD             R8, SP, #0x140+var_130
MOV             R9, #optarg ; EXPORT location for optarg
MOV             R11, R5
MOV             R5, #0x1434B4
B               loc_1026F4

loc_1026F4              ; getopt loop starts here
MOV             R0, R7  ; argc
MOV             R1, R6  ; argv
MOV             R2, R4  ; shortopts
BL              getopt  ; call getopt, passing R0, R1, and R2
CMN             R0, #1
BNE             loc_102684

...do the option checks and loop until done...

看起来它支持@zwol的答案。
不知道如果我们拥有的参数超出R1的容纳范围会发生什么。 它只是开始使用R2吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM