Chinaunix首页 | 论坛 | 博客
  • 博客访问: 224772
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 584
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-18 20:24
个人简介

学习总结,分享快乐。 望指正错误, 共同提高!!!

文章分类

全部博文(39)

分类: 嵌入式

2015-05-01 10:35:02

1> 源码test.c

点击(此处)折叠或打开

  1. #include <stdio.h>

  2.        int fool(int a,int b, int c, int d, int e, int f)
  3.       {
  4.               printf("%d->%d->%d->%d->%d->%d\n", a,b,c,d,e,f);

  5.               return a+b+c+d+e+f;                             //自动将返回值存入 r0 寄存器。
  6.       }
  7.       
  8.       int main(void)
  9.       {
  10.               int ret;
  11.       
  12.               __asm__ __volatile__(
  13.       
  14.                       "mov a1, #100\n\t"
  15.                       "mov a2, #200\n\t"
  16.                       "mov a3, #300\n\t"
  17.                       "mov a4, #400\n\t"
  18.       
  19.                       "mov r5, #600\n\t"
  20.                       "str r5, [sp,#-4]!\n\t"         //sp寄存器里存放的是栈顶地址,4字节对齐
  21.                       "mov r5,#500\n\t"
  22.                       "str r5,[sp,#-4]!\n\t"         //栈是满递减,先进后出,注意传参顺序。
  23.       
  24.                       "bl fool\n\t"                                       
  25.                       "add sp, #8\n\t"                 //恢复栈指针值,各子函数恢复各自栈.
  26.                       "mov %[ret], r0\n\t"             //取出返回值
  27.       
  28.                       :[ret]"=&r"(ret)
  29.                       :
  30.                       :"r0","r1","r2","r3","r5"
  31.               );
  32.       
  33.               printf("ret: %d,Come back to %s.\n", ret, __func__);
  34.       
  35.               return 0;
  36.       }
编译:arm-linux-gcc test.c
运行:

                 [root@FriendlyARM /mnt]# ./a.out

              100->200->300->400->500->600

               ret: 2100,Come back to main.



xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2> 指令注解:
             1》"str r5, [sp,#-4]!\n\t"
                数据存储指令:将r5中的数据存储到【sp,#-4】地址的内存中;
                                            【sp, #-4】:地址前索引:指令执行前,把偏移量【-4 + sp】作为寻址的地址。
                                            !:指令执行完后将【sp-4】地址写回sp。
             2》"bl fool\n\t"
            带返回的跳转指令: 在跳之前,将pc的当前内容(也就是下下一条指令地址)保存到lr中。
                                                所以,fool函数执行完后,将lr中的值重新赋给pc,就返回到27行,开始继续执行。
                                        




阅读(2011) | 评论(0) | 转发(0) |
0

上一篇:变量属性

下一篇:APCS 3》现场保护与恢复

给主人留下些什么吧!~~