[英]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.