【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯系信箱: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類型,請參考對應的編譯手冊