C/C++与汇编混合编程有什么好处

如题所述

当需要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. }

温馨提示:答案为网友推荐,仅供参考