程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 用匯編的眼光看C++(之嵌入匯編)

用匯編的眼光看C++(之嵌入匯編)

編輯:C++入門知識

 

 

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯系信箱:feixiaoxing @163.com】

    嵌入式匯編是對純匯編文件的一種有益補充。通常會有下面幾種情況使用到匯編:(1)提高代碼的工作效率 ,使用到cpu的一些特殊指令,比如說mmx指令;(2)對硬件進行某種特殊的操作,比如說關中斷等,這在內核級的代碼中是比較常見的。但是我們講究嵌入式匯編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實證明一切。

 

 

     (1)使用嵌入匯編的時候,注意寄存器的保護

copy to clipboardprint?int process() 

    __asm 

    { 

        push ax 

        push bx 

        push cx 

        pop cx 

        pop bx  

        pop ax 

    } 

    return 1; 

int process()

{

       __asm

       {

              push ax

              push bx

              push cx

              pop cx

              pop bx

              pop ax

       }

       return 1;

}    (2)調用函數的時候,直接使用call即可,返回值用eax傳遞,同時注意堆棧平衡

copy to clipboardprint?int add(int a, int b) 

    return a + b; 

 

int process() 

    int value = 0; 

    __asm 

    { 

        push eax 

        push 2 

        push 3 

        call add 

        add esp, 8 

        mov value, eax 

        pop eax 

    } 

    return 1; 

int add(int a, int b)

{

       return a + b;

}

 

int process()

{

       int value = 0;

       __asm

       {

              push eax

              push 2

              push 3

              call add

              add esp, 8

              mov value, eax

              pop eax

       }

       return 1;

}    (3)計算的時候注意指針和數值的差別

copy to clipboardprint?void process() 

    int value = 0; 

    int* address = &value; 

    __asm 

    { 

        push ebx 

        mov value, 1 

        mov ebx, address 

        mov [ebx], 2 

        pop ebx 

    } 

     

    assert(value == 2); 

    return ; 

void process()

{

       int value = 0;

       int* address = &value;

       __asm

       {

              push ebx

              mov value, 1

              mov ebx, address

              mov [ebx], 2

              pop ebx

       }

      

       assert(value == 2);

       return ;

}    (4)全局數據的訪問

copy to clipboardprint?static int global = 10; 

 

void process() 

    __asm 

    { 

        push eax 

        mov eax, global 

        add eax, 1 

        mov global, eax 

        pop eax 

    } 

     

    assert(global == 11); 

    return ; 

static int global = 10;

 

void process()

{

       __asm

       {

              push eax

              mov eax, global

              add eax, 1

              mov global, eax

              pop eax

       }

      

       assert(global == 11);

       return ;

}    (5)循環的跳轉

copy to clipboardprint?void process() 

    int value = 0; 

    __asm 

    { 

        push eax 

start: 

        mov eax, value 

        add eax, 1 

        mov value, eax 

        cmp value, 10 

        jne start 

        pop eax 

    } 

     

    assert(value == 10); 

    return ; 

void process()

{

       int value = 0;

       __asm

       {

              push eax

start:

              mov eax, value

              add eax, 1

              mov value, eax

              cmp value, 10

              jne start

              pop eax

       }

      

       assert(value == 10);

       return ;

}    (6) 關中斷的指令在VC中並不能被執行,會產生異常

copy to clipboardprint?void process() 

    __asm{ 

        cli 

    } 

     

    return ; 

void process()

{

       __asm{

              cli

       }

      

       return ;

}    (7)VC6.0支持MMX指令集,但是VS2005支持MMX和SSE指令集

    (8)如果工程中存在*.asm匯編文件,那麼需要按照下面的步驟進行操作

        a) 選擇【project】-> 【setting】

        b) 單擊左邊的工程,選擇某一個*.asm文件,右邊的tab會出現兩個選項,分別是General和Custom Build 

        c) 在Commands中輸入對應的編譯指令,至於是MASM還是NASM類型,請參考對應的編譯手冊

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved