用汇编的眼光看C++(之嵌入汇编)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】


     嵌入式汇编是对纯汇编文件的一种有益补充。通常会有下面几种情况使用到汇编:(1)提高代码的工作效率 ,使用到cpu的一些特殊指令,比如说mmx指令;(2)对硬件进行某种特殊的操作,比如说关中断等,这在内核级的代码中是比较常见的。但是我们讲究嵌入式汇编的一些基本点和大家一起讨论一下,建议大家和我一起做实验,用事实证明一切。

      (1)使用嵌入汇编的时候,注意寄存器的保护
  1. int process()  
  2. {  
  3.     __asm  
  4.     {  
  5.         push ax  
  6.         push bx  
  7.         push cx  
  8.         pop cx  
  9.         pop bx   
  10.         pop ax  
  11.     }  
  12.     return 1;  
  13. }  
     (2)调用函数的时候,直接使用call即可,返回值用eax传递,同时注意堆栈平衡
  1. int add(int a, int b)  
  2. {  
  3.     return a + b;  
  4. }  
  5.   
  6. int process()  
  7. {  
  8.     int value = 0;  
  9.     __asm  
  10.     {  
  11.         push eax  
  12.         push 2  
  13.         push 3  
  14.         call add  
  15.         add esp, 8  
  16.         mov value, eax  
  17.         pop eax  
  18.     }  
  19.     return 1;  
  20. }  
     (3)计算的时候注意指针和数值的差别
  1. void process()  
  2. {  
  3.     int value = 0;  
  4.     int* address = &value;  
  5.     __asm  
  6.     {  
  7.         push ebx  
  8.         mov value, 1  
  9.         mov ebx, address  
  10.         mov [ebx], 2  
  11.         pop ebx  
  12.     }  
  13.       
  14.     assert(value == 2);  
  15.     return ;  
  16. }  
     (4)全局数据的访问
  1. static int global = 10;  
  2.   
  3. void process()  
  4. {  
  5.     __asm  
  6.     {  
  7.         push eax  
  8.         mov eax, global  
  9.         add eax, 1  
  10.         mov global, eax  
  11.         pop eax  
  12.     }  
  13.       
  14.     assert(global == 11);  
  15.     return ;  
  16. }  
     (5)循环的跳转
  1. void process()  
  2. {  
  3.     int value = 0;  
  4.     __asm  
  5.     {  
  6.         push eax  
  7. start:  
  8.         mov eax, value  
  9.         add eax, 1  
  10.         mov value, eax  
  11.         cmp value, 10  
  12.         jne start  
  13.         pop eax  
  14.     }  
  15.       
  16.     assert(value == 10);  
  17.     return ;  
  18. }  
     (6) 关中断的指令在VC中并不能被执行,会产生异常
  1. void process()  
  2. {  
  3.     __asm{  
  4.         cli  
  5.     }  
  6.       
  7.     return ;  
  8. }  
     (7) VC6.0支持MMX指令集,但是VS2005支持MMX和SSE指令集
    (8)如果工程中存在*.asm汇编文件,那么需要按照下面的步骤进行操作
        a) 选择【project】-> 【setting】
        b) 单击左边的工程,选择某一个*.asm文件,右边的tab会出现两个选项,分别是General和Custom Build  
        c) 在Commands中输入对应的编译指令,至于是MASM还是NASM类型,请参考对应的编译手册


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值