在Visual C++中使用内联汇编
2010-01-10 09:37:22 来源:WEB开发网下面是更多的ASM代码
美元符号$用于指定当前位置,如下所用,常用于条件跳转:
JNE $Content$5 ; 下面这条指令的长度是5个字节
JMP farlabel;
$Content$5,跳到了这里
。
。
。
farlabel:
七、调用函数
内联汇编调用C/C++函数必须自己清除堆栈,下面是一个调用C/C++函数例子:
#include <stdio.h>
char szformat[] = "%s %sn";
char szHello[] = "Hello";
char szWorld[] = " world";
void main()
{
__asm
{
MOV EAX, OFFSET szWorld
PUSHEAX
MOV EAX, OFFSET szHello
PUSHEAX
MOV EAX, OFFSET szformat
PUSHEAX
CALLprintf
//内联汇编调用C函数必须自己清除堆栈
//用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
POP EBX
POP EBX
POP EBX
}
}
注意:函数参数是从右向左压栈。
不能够访问C++中的类成员函数,但是可以访问extern "C"函数。
如果调用Windows API函数,则不需要自己清除堆栈,因为API的返回指令是RET n,会自动清除堆栈比如下面的例子:
#include <windows.h>
char szAppName[] = "API Test";
void main()
{
char szHello[] = "Hello, world!";
__asm
{
PUSHMB_OKorMB_ICONINformATION
PUSHOFFSET szAppName; 全局变量用OFFSEt
LEA EAX, szHello; 局部变量用LEA
PUSHEAX
PUSH0
CALLDWORD PTR [MessageBoxA] ; 注意这里,我费了好大周折才发现不是CALL MessageBoxA
}
}
一般来说,在Visual C++中使用内联汇编是为了提高速度,因此这些函数调用尽可能用C/C++写。
- ››使用linux中的quota教程
- ››使用jxl生成带动态折线图的excel
- ››使用mysql mysqldump进行数据库迁移
- ››Visual Basic 2008 数学函数
- ››使用jquery是新tab形式
- ››使用QUnit进行Javascript单元测试
- ››使用UITextFieldDelegate来隐藏键盘
- ››使用公式提取Excel中的日期后发现格式不对
- ››Visual Studio2005中Smart Device的问题
- ››使用SQL Azure 的BI 解决方案
- ››使用PLSQL Developer工具导出sql文件
- ››使用双缓冲技术实现Android画板应用
更多精彩
赞助商链接