ARM裸机程序开发(十):C语言环境初始化

Part1  栈初始化

一、满  /  空栈

1.1 满栈: 当堆栈指针SP总是指向最后压入堆栈的数据(ARM采用)

1.2 空栈: 当堆栈指针SP总是指向下一个将要放入数据的空位置

 

二、升 /  降 栈

根据入栈时,SP指针的移动方向分:若从低——》高 为升栈,从高到低为降栈(ARM使用)

 

三、栈帧

定义:一个函数所使用的那一部分栈,称为栈帧

栈帧的两个边界 :fp(r11) 、 sp(r13)

 

三、栈作用

3.1  保存局部变量

3.2 传递参数 :当传递的参数大于4个时,使用栈来传递,否则,用通用寄存器来传递

3.3 传递寄存器的值

 

Part2  BSS段1初始化

Part3  从汇编跳转到C

跳转方式:绝对跳转

 

Part4  c与汇编混合编程

一、何处使用汇编:1、效率要求高的地方;2、需要直接操作硬件(如协处理器的操作)

 

二、汇编中调用C:直接把C的入口指针直接赋值个PC

(C代码在单独的C文件中)

三、C中调用汇编:在汇编文件中将标号声明为.global,然后在C中直接作为函数调用即可。

      (汇编代码在单独的文件中)

四、C中内嵌汇编

4.1 、格式

__asm__(

汇编语句部分

:输出部分

:输入部分

:破坏描述部分

);

//例1

void write_p15_c1(unsigned long value)

{

    __asm__(

“mcr p15, 0, %0, c1, c0, 0\n”    @%0为一个占位参数

:

:”r”(value)      @r指明为通用寄存器

);

}

 

//例2

usigned long read_p15_c1 (void)

{

  usigned long value

__asm__(

  “mrc p15, 0, %0, c1, c0, 0\n”    @c1中读出值送入Value中

    :”=r”(value)  @’=’表示只写操作数,用于输出部

    :

    :”memory”

);

return value;

}

 

4.2 、优化

在编程中,使用volatile来告诉编译器,不要对接下来的这部分代码进行优化(特别是在对硬件进行操作时)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值