【问题标题】:How to return a value of a register from ARM assembly to a C function?如何将寄存器的值从 ARM 程序集返回到 C 函数?
【发布时间】:2017-12-07 12:19:51
【问题描述】:

例如

extern int addfunction(int,int);
main() {
  int a = 5, b = 6, z;
  z = addfunction(a, b);
  printf("%d", c);
}

addfunction() 在另一个 .s 文件中的定义,例如

.global addfunction
addfunction:
    @ value a will be in R0 & R1 respectively
    add r2, r0, r1    @ r2=r0+r1

现在如何返回存储的值r2,以便C程序中的变量z得到正确的值?我可以使用来自 C 的指针并更新 asm 中的地址。我不想这样。帮助!

【问题讨论】:

  • afaik 返回值在 r0 中,因此使用 add r0,r0,r1 代替将完成这项工作(当然,您需要返回给调用者)
  • @Tommylee2k .. 这也是参考中提到的。我试过了,但没有用。
  • 它的工作.. 我原来的程序有逻辑错误。无论如何,这个问题也会对其他人有所帮助
  • 您需要咨询calling convention

标签: c function assembly arm return


【解决方案1】:

here

标准的 32 位 ARM 调用约定将 16 个 ARM 寄存器分配为:

r0 到 r3:用于保存传递给子程序的参数值,也保存从子程序返回的结果。

所以设置r0为返回值

.global addfunction
addfunction:
    @ value a will be in R0 & R1 respectively
    add r0, r0, r1    @ r0=r0+r1

【讨论】:

  • 另外不要忘记bx lr 实际返回,使用调用者传递的返回地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多