问题描述
.global main
main:
ldr r0,=message_format
b printf
message_format:
.asciz "argv: %s\n"
如果执行它,我会得到:
# ./a.out 7
argv: ^?~^?~
如何才能“传递”到argv?
解决方法
argv
是指向长度为argc + 1
的参数字符串指针列表的指针,其中最后一个元素是NULL
指针。
ldr r1,[r1,#4]
将argv
(argv[1]
)的第二个元素加载到r1
中。这是指向程序名称后的第一个参数字符串的指针。 (通常)
您要将这个字符串指针作为整数传递给printf
,这是不正确的,并且会导致它打印似乎是任意值的
所有argv
元素都是字符串,因此不需要其他转换。您只需要将printf
更改为"%i"
,就可以告诉"%s"
期望使用字符串而不是整数。
请注意,这仅在您确定还有第二个元素时才有效。在访问argv[0]
之前,应始终检查NULL
是否非argc
或argv[1]
大于0。然后,在访问argv[1]
指向的字符串之前,还应该检查NULL
是否非argc
或argv[1]
大于1。