【问题标题】:Assembly's function parameter程序集的函数参数
【发布时间】:2021-07-27 07:44:04
【问题描述】:

我实际上是汇编初学者 (Nios II),我知道函数参数存储在寄存器中 (r4 -> r7) 但我想知道这些寄存器是否包含参数的实际值或它的地址?

例如 C 函数:

 int add (int x, int y) {}

r4 是否包含 'x' 或 '&x' ?

【问题讨论】:

  • 怎么知道参数存放在R4 -> R7?高度依赖处理器。 ARM 处理器至少有 16 个寄存器可供使用。编译器选择寄存器。您的目标是哪个平台(处理器)?
  • 顺便说一句,你是在混合 C 和 C++ 语言吗? C++ 语言允许您重载函数和运算符,而 C 不允许。混合使用这两种语言会使您的程序更加复杂,并且会出现更多缺陷。我建议选择一种语言并更新您的标签。
  • 我的目标是(Nios II),我读到参数存储在 R4,5,6,7 中。如果还有更多参数,则将它们存储在堆栈指针中。
  • 将简单代码添加到您的add 函数中,然后告诉编译器打印汇编语言。 :-) 这就是您正确获取接口并知道可以使用哪些寄存器的方法。

标签: c assembly calling-convention nios


【解决方案1】:

这是 Nios II 的 ABI: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/nios2/n2cpu_nii51016.pdf 从表中我们可以看出,参数确实是在寄存器r4-r7中传递的,每个参数都是32位。从同一个文档中,我们了解到 int 是 4 个字节。这意味着x 将在r4 中传递。 &x 未在此处传递,因为这是按值调用。如果你想访问x的地址,好的编译器会先尝试看看是否需要它,只有在放弃之后,才会在栈帧上分配内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2017-02-26
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多