我正在使用Raspberry Pi来学习ARM程序集。我还在开始,但我想知道如何阅读argv
的值。
我发现argc
的值在程序开头的寄存器0(r0)中保存,但我无法确定argv
值的存储位置。我认为它在堆栈的某个地方,但我找不到它。
有人可以帮忙吗?
编辑:所以我标记为正确的答案允许我找到argv
的值。总而言之,argc
的值在程序启动时在寄存器r0
中找到。 r1
包含地址数组的地址。这些地址指向argv
的相关值。
答案 0 :(得分:3)
根据ARM ABI,函数的第二个原始参数应该存储在R1中。请记住argv
是char**
,即指向argc
指针表的地址。此表中的第一个指针指向一个以NULL结尾的字符串,其中包含可执行文件名,后面的指针指向各个参数,也表示为以NULL结尾的字符串。
如果我弄错了,只需构建一个访问argv
的简单程序,然后查看它的来源:
int main (int argc, char *argv[])
{
return argv[0][0];
}
请注意,当您使用汇编程序时,gcc
仍将包含程序中标准库的启动代码,为您定义_start
符号并制作C样式main
函数入口点,所以上述内容仍适用于您。但是,既然您正在学习汇编程序,那么您可能会对完全摆脱标准库感兴趣,这可以通过gcc -nostdlib
完成。请注意,您需要提供自己的_exit()
函数代码才能正确终止程序。有关详细的演练,请参阅this tutorial。