【问题标题】:Parameter passing convention for Function call from ARM Assembly to C从 ARM 程序集到 C 的函数调用的参数传递约定
【发布时间】:2016-04-12 18:25:03
【问题描述】:

我有一个调用 ARM 汇编中定义的函数的 C 代码。必须传递两个参数。

如果函数调用如下所示:

functionName(a, b)

寄存器x0x1 按什么顺序保存这些值?是x0 持有ax1 持有b 还是相反?

【问题讨论】:

标签: c assembly arm parameter-passing


【解决方案1】:

问这个问题比试一试要花更长的时间。

extern void bar ( unsigned int, unsigned int );

void foo ( void )
{
    bar(5,7);
}

编译然后反汇编

传统武器

00000000 <foo>:
   0:   e3a00005    mov r0, #5
   4:   e3a01007    mov r1, #7
   8:   eafffffe    b   0 <bar>

aarch64

0000000000000000 <foo>:
   0:   528000e1    mov w1, #0x7                    // #7
   4:   528000a0    mov w0, #0x5                    // #5
   8:   14000000    b   0 <bar>
   c:   d503201f    nop

msp430

00000000 <foo>:
   0:   3e 40 07 00     mov #7, r14 ;#0x0007
   4:   3f 40 05 00     mov #5, r15 ;#0x0005
   8:   b0 12 00 00     call    #0x0000 
   c:   30 41           ret         

pdp-11

00000000 <_foo>:
   0:   1166            mov r5, -(sp)
   2:   1185            mov sp, r5
   4:   15e6 0007       mov $7, -(sp)
   8:   15e6 0005       mov $5, -(sp)
   c:   09f7 fff0       jsr pc, 0 <_foo>
  10:   65c6 0004       add $4, sp
  14:   1585            mov (sp)+, r5
  16:   0087            rts pc

【讨论】:

  • 问题看起来像 arm64?不过你的回答没有错。
  • 不管是什么处理器、arm、aarch64、mips、x86、pdp-11。如果你有一个编译器并且想知道两个简单参数的调用约定。不应该花 40 到 50 秒来找出答案。
  • 对于未来的读者:godbolt.org 拥有 ARM、AArch64、MSP430、MIPS 以及各种其他 gcc 和 clang 版本(包括 x86-64)和 MSVC。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2023-03-28
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多