打印

ARM参数传递,第一个参数是数组,还放寄存器里吗?

[复制链接]
4096|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quarticarm|  楼主 | 2012-3-20 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ARM参数传递,第一个参数是数组,还放寄存器里吗?如果:
int fun(int a[100],int ,int ,char)怎么放 ?第一个参数就100个数组了

还有请问,如果A函数调用B函数,B函数返回了 返回到A函数的哪里?是下一条语句吗?如果从汇编的角度怎么看,谢谢

相关帖子

沙发
senioryzc| | 2012-3-20 16:06 | 只看该作者
自己动手,丰衣足食
C代码
int fun(int a[100],int a1,int a2,char a3)
{
        return 0xaa;
}

int a[100] = {0xbb};

int main(int argc, char *argv[])
{
        return (fun(a, 1, 2, 3) > 0);
}
对应的汇编嘛

    fun
    $a
    .text
        0x00000000:    e3a000aa    ....    MOV      r0,#0xaa
        0x00000004:    e1a0f00e    ....    MOV      pc,r14
    main
        0x00000008:    e52de004    ..-.    STR      r14,[r13,#-4]!
        0x0000000c:    e3a03000    .0..    MOV      r3,#3
        0x00000010:    e3a02000    . ..    MOV      r2,#2
        0x00000014:    e3a01000    ....    MOV      r1,#1
        0x00000018:    e59f0018    ....    LDR      r0,0x38
        0x0000001c:    ebfffffe    ....    BL       fun  ; 0x0
        0x00000020:    e3500000    ..P.    CMP      r0,#0
        0x00000024:    da000001    ....    BLE      {pc} + 0xc  ; 0x30
        0x00000028:    e3a00001    ....    MOV      r0,#1
        0x0000002c:    e49df004    ....    LDR      pc,[r13],#4
        0x00000030:    e3a00000    ....    MOV      r0,#0
        0x00000034:    eafffffc    ....    B        {pc} - 0x8  ; 0x2c
    $d
        0x00000038:    00000000    ....    DCD    0

使用特权

评论回复
板凳
airwill| | 2012-3-21 13:55 | 只看该作者
二楼的方法可以推荐, 但是代码过于简单, fun 被优化掉了. 可以看到, 数组的指针送给了 R0.

使用特权

评论回复
地板
quarticarm|  楼主 | 2012-3-23 22:06 | 只看该作者
二楼的方法可以推荐, 但是代码过于简单, fun 被优化掉了. 可以看到, 数组的指针送给了 R0.
airwill 发表于 2012-3-21 13:55

问题是,ro不是放返回值的吗??一开始用掉了,最后再放返回值?

使用特权

评论回复
5
airwill| | 2012-3-23 22:21 | 只看该作者
等返回的时候, R0 里的数据本来就没有用了. 编译器会处理好这个问题的, 楼主不用操心这个问题, 倒是多花点心思这算法和实现上吧.

使用特权

评论回复
6
Larry_Liu| | 2012-4-6 00:17 | 只看该作者
参数按先后顺序传到 r0 ~ r3
如果不够4个,先传r0,以此类推
如果多于4个,入栈

返回值放在 r0中

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

32

帖子

1

粉丝