在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++写。
- ››使用脚本恢复WinXP系统的用户登录密码
- ››使用phpMyadmin创建数据库及独立数据库帐号
- ››使用Zend Framework框架中的Zend_Mail模块发送邮件...
- ››使用cout标准输出如何控制小数点后位数
- ››使用nofollow标签做SEO的技巧
- ››使用 WebSphere Message Broker 的 WebSphere Tra...
- ››使用SQL Server事件探查器做应用程序的性能分析
- ››使用SQL Server事件探查器分析死锁原因
- ››使用纯文本文件打造WCF服务
- ››Visual Studio自定义调试窗体两个小技巧
- ››使用 Dojo 开发定制 Business Space 小部件,第 4...
- ››使用 ADDRESS 与 INDIRECT函数查询信息
更多精彩
赞助商链接