用汇编的眼光看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类型,请参考对应的编译手册

原文地址:https://www.cnblogs.com/sier/p/5676492.html