汇编与C混合编程(6.19)
来源:互联网 发布:js div height 编辑:程序博客网 时间:2024/05/20 23:06
一 异常放回
<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
修改列表
练习:实现以下函数
<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 -> 1enable_irq(); //cpsr I:7bit -> 0return 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);
0 0
- 汇编与C混合编程(6.19)
- C与汇编混合编程(1)
- C与汇编混合编程
- C与汇编混合编程
- C与汇编混合编程
- c与汇编混合编程
- c与汇编混合编程
- C与汇编混合编程
- c与汇编的确混合编程
- keil中的C与汇编混合编程
- C/C++ 与汇编混合编程 总结
- C/C++与汇编混合编程简介
- C语言与汇编混合编程
- C/C++与汇编混合编程简介
- C语言与汇编混合编程
- C/C++与汇编混合编程简介
- ARM汇编与C混合编程
- C/C++与汇编混合编程简介
- 算术移位和逻辑移位
- LeetCode_Linked List_Remove Duplicates from Sorted List II
- Java基础
- LeetCode | Minimum Window Substring
- 黑马程序员——OC基础学习(三)---从传统setter方法和getter方法到@property增强型使用(体验代码的优化过程)
- 汇编与C混合编程(6.19)
- [leetcode] 101.Symmetric Tree
- 一致性hash
- Python:面向对象的“开闭原则”和“鸭子类型”
- Codeforces #309 Div 1 简要题解
- unity 加载c++ dll文件提示DllNotFoundException的解决办法
- POJ 2114 Boatherds (树上点分治)
- 抓包工具———wireshark学习篇:1
- ARM 浮点运算