如何使用Raspberry Pi(ARM)程序集读取命令行参数?

时间:2017-02-27 16:26:55

标签: assembly raspberry-pi arm

我正在使用Raspberry Pi来学习ARM程序集。我还在开始,但我想知道如何阅读argv的值。

我发现argc的值在程序开头的寄存器0(r0)中保存,但我无法确定argv值的存储位置。我认为它在堆栈的某个地方,但我找不到它。

有人可以帮忙吗?

编辑:所以我标记为正确的答案允许我找到argv的值。总而言之,argc的值在程序启动时在寄存器r0中找到。 r1包含地址数组的地址。这些地址指向argv的相关值。

1 个答案:

答案 0 :(得分:3)

根据ARM ABI,函数的第二个原始参数应该存储在R1中。请记住argvchar**,即指向argc指针表的地址。此表中的第一个指针指向一个以NULL结尾的字符串,其中包含可执行文件名,后面的指针指向各个参数,也表示为以NULL结尾的字符串。

如果我弄错了,只需构建一个访问argv的简单程序,然后查看它的来源:

int main (int argc, char *argv[])
{
  return argv[0][0];
}

请注意,当您使用汇编程序时,gcc仍将包含程序中标准库的启动代码,为您定义_start符号并制作C样式main函数入口点,所以上述内容仍适用于您。但是,既然您正在学习汇编程序,那么您可能会对完全摆脱标准库感兴趣,这可以通过gcc -nostdlib完成。请注意,您需要提供自己的_exit()函数代码才能正确终止程序。有关详细的演练,请参阅this tutorial