【问题标题】:How to print argv arguments?如何打印 argv 参数?
【发布时间】:2020-08-11 23:21:06
【问题描述】:
.global main

main:
    ldr r0, =message_format
    b   printf

message_format:
    .asciz "argv: %s\n"

如果我执行它,我会得到这个:

# ./a.out 7
argv: ^?~^?~

我怎样才能“传递”到 printf 我的 argv ?

【问题讨论】:

    标签: assembly arm arguments printf argv


    【解决方案1】:

    argv 是一个指向长度为argc + 1 的列表的指针,该列表包含指向参数字符串的指针,其中最后一个元素是NULL 指针。

    ldr r1, [r1,#4] 会将argv (argv[1]) 的第二个元素加载到r1。这是指向程序名称之后的第一个参数字符串的指针。 (一般)

    您将此字符串指针作为整数传递给printf,这是不正确的,并且会导致它打印看似任意值的内容。

    所有argv 元素都是字符串,因此不需要额外的转换。您只需将"%i" 更改为"%s",告诉printf 期待字符串而不是整数。


    请注意,这仅在您确定存在第二个元素时才有效。在访问argv[1] 之前,您应该始终检查argv[0] 是否非NULLargc 是否大于0。在访问argv[1] 指向的字符串之前,您还应该检查argv[1] 是否非NULLargc 是否大于1。

    【讨论】:

    • 谢谢,我编辑了代码,但还是不行。我删除了ldr r1, [r1,#4],但删除了 %s。查看线程以查看输出
    • 不,保留ldr。你需要它来获取字符串。确保您已熟悉此 ISA 中说明的含义、调用约定以及您要执行的操作。
    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多