您的位置:首页 > 编程语言

汇编与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"

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: