回答
据:http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf
第一四个寄存器R0-R3(A1〜A4) 用于传递参数值写入 一个子程序并返回一个函数的结果 值。它们也可以用 来保存程序中的中间值 (但是,通常仅在子程序调用之间的 )。
在ARM上,没有其他调用约定,但默认情况下,我知道。这是为什么:
- 你为什么要?你的函数不能以其他函数的编译形式调用,从而产生兼容性混乱。
- 对符合ABI的系统函数的调用不起作用,除非编译器能够区分调用约定。现在,我知道在过去有x86-32有不同的调用约定,但注意x64是如何更简单的(AMD64与微软做的任何)。为什么在设计ARM calling convention时,你会允许这么多不同的调用约定?它创建了兼容性混乱。
是的你是对的。这很奇怪,尤其是因为你提到的原因。这个想法是,定义的函数是线程的主体 - 在自定义环境(OS)中。自定义操作系统会推动堆栈中线程的参数。为了尊重ABI,有两种解决方法:将参数放入r0或声明* thread_func(uint32_t r0,uint32_t r1,uint32_t r2,uint32_t r3,void * param)*。谢谢! – cojocar 2011-01-09 18:03:03
您可以尝试在结构中包装参数;另外
struct my_x_y {
int x, y;
my_x_y(): x(0), y(0) {} // a non-trivial constructor to make the type non-POD
};
int calc_my_sum(my_x_y x_and_y) {
// passing non-POD object by value forces to use the stack
return x_and_y.x + x_and_y.y;
}
,你可以添加4个空参数使用了寄存器,因此其他参数将使用堆栈:例如,如果你的函数是int calc_my_sum(int x, int y) {return x+y;}
您可以按如下改变它(丑陋的)
struct force_stack_usage {
int dummy0, dummy1, dummy2, dummy3;
}
int calc_my_sum(force_stack_usage, int x, int y) {
return x + y;
}
存储本地变量的位置取决于您将如何使用它。如果您需要获取本地变量的地址,则局部变量只能存储在堆栈中。所以当你传递你的子程序一个指针时,这个参数将通过堆栈传递。
- 1. 在堆栈上传递参数
- 2. 在NASM堆栈上传递参数的问题
- 3. 在堆上传递数组并在堆栈上运行
- 4. 参数在变量参数函数中如何传递到堆栈上?
- 5. 将函数的参数传递给堆栈还是寄存器?
- 6. 数组的使用堆栈(参数传递/返回)
- 7. GCC堆栈优化
- 8. c/C++通过参考堆栈帧布局的指针/参数传递参数
- 9. x86程序集:通过堆栈将参数传递给函数
- 10. python - 通过堆栈装饰器传递函数参数
- 11. 不能在passport.js传递的参数 - MEAN堆栈
- 12. 将参数通过堆栈传递给MASM中的过程
- 13. 绕过核心数据堆栈传递
- 14. 通过堆栈传递数据
- 15. 堆栈上的递归函数
- 16. 在Windows上增加堆栈大小(GCC)
- 17. 在gcc中传递参数的问题
- 18. MEAN堆栈传递参数在路由器内
- 19. 为什么在IA32堆栈过程中向后传递参数?
- 20. 参考 - 参数 - 堆栈或堆
- 21. 将库参数传递给gcc
- 22. 参数在Visual Studio和GCC中传递
- 23. 函数修改堆栈时如何将堆栈传递给函数?
- 24. 如何获取传递给栈上函数的参数的值?
- 25. C++(GCC):未定义的引用`堆栈<int> ::堆栈(INT)”
- 26. 强制评估作为参数传递给函数的对象
- 27. 类型双引号(GCC) - 在堆栈上增加一个指针参数
- 28. 堆栈溢出(参数:0x00000001,0x00442FF8)
- 29. 将堆栈传递给方法
- 30. 如何传递堆栈ghci RTS选项?
为什么在寄存器中传递参数是一件坏事? – 2011-01-09 16:38:34
这不是一件坏事。我只是希望以这种方式传递参数,因为//仿真//线程创建(和堆栈分配)例程。 – cojocar 2011-01-09 16:45:09
什么架构/ ABI? – ephemient 2011-01-09 17:11:44