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

 我来答
huanglenzhi
2018-01-22 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117525 获赞数:517231
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式