汇编与C混合编程(6.19)
2015-06-29 20:44
211 查看
一 异常放回
<1>IRQ/FIRQ
pc <- lr - 4
<2>软中断异常
pc <- lr
<3>预取指令终止异常
指令1
指令2 <-没有取到指令
指令3
指令4 <-pc
lr : 保存的是指令3的地址
pc <- lr - 4 [没有取到指令,需要再次去取]
<4>取数据终止异常
指令1
指令2 <-没有取到数据 (在指令2执行结束的时候,产生异常)
指令3
指令4
指令5 <- pc
lr : 保存的是指令4的地址
pc <- lr - 8 [没有取到数据,需要再次去取]
<5>未定义异常
指令1
指令2 <-无法识别,产生未定义异常
指令3
指令4 <-pc
lr : 保存的是指令3的地址
pc <- lr
二、汇编与C混合编程
1.ATPCS标准
[1]参数的传递
函数参数传递的时候,前4个参数通过r0-r3来传递,超过4个的参数通过堆栈来传递
[2]函数返回值
通过r0带回
注意:调用C语言之前,必须先设置sp
2.内联汇编(在C语言中内嵌一段汇编代码)
asm(
"指令1\n"
"指令2\n"
...
:输出列表
:输入列表
:修改列表
);
[1]输出列表: 将寄存器值输出到c变量
int c;
int d;
输出列表
:"=r"(c),"=r"(d)
[2]输入列表 : 将c变量输入到寄存器
int a = 10;
int b = 20;
输入列表
:"r"(a),"r"(b)
[3]修改列表:在内联汇编的时候,发生修改的寄存器
例如:在指令中使用了r0,r1,r2
修改列表
:"r0","r1","r2"
练习:实现以下函数
三、volatile 含义
volatile 修饰一个变量,防止编译器优化,告诉编译器每次在使用这个变量的时候,必须从变量所在的内存中重新读值。
面试问题:在有中断处理函数代码中使用全局变量,有什么需要注意的地方?
定义全局变量的时候,需要加volatile修饰
四、思考:如何判断数据指定为是否为0?
<1>IRQ/FIRQ
pc <- lr - 4
<2>软中断异常
pc <- lr
<3>预取指令终止异常
指令1
指令2 <-没有取到指令
指令3
指令4 <-pc
lr : 保存的是指令3的地址
pc <- lr - 4 [没有取到指令,需要再次去取]
<4>取数据终止异常
指令1
指令2 <-没有取到数据 (在指令2执行结束的时候,产生异常)
指令3
指令4
指令5 <- pc
lr : 保存的是指令4的地址
pc <- lr - 8 [没有取到数据,需要再次去取]
<5>未定义异常
指令1
指令2 <-无法识别,产生未定义异常
指令3
指令4 <-pc
lr : 保存的是指令3的地址
pc <- lr
二、汇编与C混合编程
1.ATPCS标准
[1]参数的传递
函数参数传递的时候,前4个参数通过r0-r3来传递,超过4个的参数通过堆栈来传递
[2]函数返回值
通过r0带回
注意:调用C语言之前,必须先设置sp
2.内联汇编(在C语言中内嵌一段汇编代码)
asm(
"指令1\n"
"指令2\n"
...
:输出列表
:输入列表
:修改列表
);
[1]输出列表: 将寄存器值输出到c变量
int c;
int d;
输出列表
:"=r"(c),"=r"(d)
[2]输入列表 : 将c变量输入到寄存器
int a = 10;
int b = 20;
输入列表
:"r"(a),"r"(b)
[3]修改列表:在内联汇编的时候,发生修改的寄存器
例如:在指令中使用了r0,r1,r2
修改列表
:"r0","r1","r2"
int add(int a,int b) { int c; asm( "add r0,%1,%2\n" "mov %0,r0\n" :"=r"(c) :"r"(a),"r"(b) :"r0" ); }注意:C变量的引用,从输入列表、输出列表开始编号:第一个C变量 %0,第二个c变量%1,...
练习:实现以下函数
int disable_irq(void) { int statu; return statu; } int enable_irq(void) { int statu; return statu; } int main() { disable_irq();//cpsr I:7bit -> 1 enable_irq(); //cpsr I:7bit -> 0 return 0; }
三、volatile 含义
volatile 修饰一个变量,防止编译器优化,告诉编译器每次在使用这个变量的时候,必须从变量所在的内存中重新读值。
面试问题:在有中断处理函数代码中使用全局变量,有什么需要注意的地方?
定义全局变量的时候,需要加volatile修饰
四、思考:如何判断数据指定为是否为0?
int flag = 0; flag = data & (1 << 1); data的第1位为0 flag = 0 data的第1位为1 flag = 2 1 0000010 循环判断第1位是否为0 do{ flag = data & (1 << 1); }while(!flag);
相关文章推荐
- c++ 循环左移
- c++ 循环左移
- c++ 字母排序
- c++ 字母排序
- C语言—— 将N个数按输入时顺序的逆序排列,用函数实现
- 2.用户程序代码分析
- Stanford Named Entity Recognizer (NER)简单应用实例
- 牛客网(搜狗2015 C++工程师笔试题)
- java学习02--变量
- 网易新闻评论爬虫(python+selenium+PhantomJS)
- java线程与锁
- Java学习笔记2、环境变量配置与初学者常见错误
- 学习笔记_Java_day12_Cookie
- 版本控制系统github基本操作
- 用bat批处理文件去编译及运行小的java代码
- Java学习笔记1、常用dos命令
- Python 浅拷贝和深拷贝
- java中日期类型和mysql中日期类型进行整合
- 线性表——顺序存储(C语言版,附带源代码)
- C#趣味程序---真分数序列