发布网友 发布时间:2022-04-24 09:18
共1个回答
热心网友 时间:2022-07-09 07:59
当需要C/C++与汇编混合编程时,可以有以下两种处理策略:
若汇编代码较短,则可在C/C++源文件中直接内嵌汇编语言实现混合编程。
若汇编代码较长,可以单独写成汇编文件,最后以汇编文件的形式加入项目中,通过ATPCS规定与C程序相互调用及访问。
后缀.S文件中的汇编指令是用armasm汇编器进行汇编的,而C语言程序中的内嵌汇编指令则是用内嵌汇编器进行汇编的。这两种汇编器存在一定的差异,所以在内嵌汇编时要注意以下几点。
2.3.1 小心使用物理寄存器
必须小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V标志位。因为计算汇编代码中的C表达式时,可能使用这些物理寄存器,并会修改N、Z、C、V标志位。
如计算:
y=x+x/y;
[cpp] view plain copy
1. __asm
2. {
3. MOV R0, x //把x的值给R0
4. ADD y, R0, x/y //计算x/y时R0的值会被修改
5. }
2.3.2 内嵌汇编程序中允许使用C变量
在计算x/y时R0会被修改,从而影响R0+x/y的结果。内嵌汇编程序中允许使用C变量,用C变量来代替寄存器R0可以解决上述问题。这时内嵌汇编器将会为变量var分配合适的存储单元,从而避免冲突的发生。如果内嵌汇编器不能分配合适的存储单元,它将会报告错误。
[cpp] view plain copy
1. int var;
2. __asm
3. {
4. MOV var, x //把x的值给R0
5. ADD y, var, x/y //计算x/y时R0的值会被修改
6. }
2.3.3 不需要保存和恢复用到的寄存器
对于在内嵌汇编语言程序中用到的寄存器,编译器在编译时会自动保存和恢复这些寄存器,用户不用保存和恢复这些寄存器。除了CPSR和SPSR寄存器外,其他物理寄存器在读之前必须先赋值,否则编译器会报错。
[cpp] view plain copy
1. int fun (int x)
2. {
3. __asm
4. {
5. STMFD SP!, {R0} //保存R0,先读后写,汇编出错
6. ADD R0, x, #1
7. EOR x, R0, x
8. LDMFD SP!, {R0} //多余的
9. }
10. return x;
11. }