在C/C 中插入汇编指令
用汇编语言写Windows程序无非有两种形式:在高级语言中插入汇编指令和直接使用纯粹的汇编语言来写。前者要求宿主语言支持插入汇编指令,后者是一种比较极端的形式。为了充分表达汇编语言的特点,本书的大多数程序都采用后—种形式。需要内嵌汇编指令的程序大多数都是一些速度要求较高或需要做底层操作的程序,因此—般都使用C/C 语言来写。这是因为C/C 语言本身也可以做一些底层操作并且编译后的程序速度会很快。
在C/C 中插入汇编指令所需的关键字在不同的操作系统、不同的编译器中可能各不相同。Win32平台上较流行的C/C 编译器Visual C 、Borland C 和C Builder支持用asm 、 _asm或 __asm这几个关键字中的2、3个来插入汇编指令。这几个关键字的作用是一样的。
例如:
asm mov eax,0x12345678
_asm xor ebx,ebx
asm mov esi,edi
也可写成:
asm{
mov eax,0x12345678
xor ebx,ebx
mov esi,edi
}
下面的程序显示一个MessageBox框。
C/C 中插入汇编指令示例
#include
int APIENTRY WinMain(HMODULEhMod,HMODULEprehMod,LPSTRlpCmd,int n)
char *lpCaption="标题";
char *lpText="C/C 中插入汇编指令示例”;
_asm{
push MB_OK
push lpCaption
push lpText
push NULL
call dword ptr MessageBoxA
}
return();
程序中,_asm后面的大括号里的汇编指令相当于使用C语言的一条API调用:
MessageBoxA(NULL,lpText,lpCaption,MB_OK);
四个Push指令把MessageBoxA所需的参数按从右到左的顺序压入栈中。MessageBoxA在返回时自动调整堆栈,丢弃这些入栈的参数。