我一遍又一遍地阅读定义,我仍然不明白ARM中的SP和LR是什么? 我了解PC(它显示下一个指令的地址),SP和LR可能是相似的,但我只是不明白它是什么。 你可以帮我吗? 编辑:如果你可以用例子来解释,那将是非常棒的。 编辑:终于搞清楚什么是LR,仍然没有得到什么SP的。
从我上次编码的arm汇编程序起,我已经有一段时间了,细节上我有点生疏。 如果我从arm调用C函数,我只需要担心保存r0-r3和lr,对吧? 如果C函数使用其他寄存器,是否负责将这些寄存器保存在堆栈中并恢复它们? 换句话说,编译器会为C函数生成代码。 例如,如果我在汇编函数中使用r10,我不必将其值推入堆栈或内存,并在C调用后popup/恢复它,是吗? 这是为arm-eabi-gcc 4.3.0。 我意识到我可以阅读整个EABI,但是那么缩写RTFM就是为了什么,对吧? 🙂
我想了解如何链接寄存器和帧指针在ARM中工作。 我去过几个地方,我想确认我的理解。 假设我有以下代码: int foo(void) { // .. bar(); // (A) // .. } int bar(void) { // (B) int b1; // .. // (C) baz(); // (D) } int baz(void) { // (E) int a; int b; // (F) } 我叫foo()。 链接寄存器是否包含点(A)的代码地址,而帧指针是否包含点(B)的代码地址? 在所有的locals被声明之后,栈指针可能会在bar()里面的任何地方。 增加另一个函数调用baz()