概述
C++语言是C语言的超集,它是在C语言的基础上扩展形成的面向对象程序设计语言。微软Visual C++ 5.0∕6.0则是Windows 9.x平台上广泛应用的开发系统。本节以Visual C++ 5.0∕6.0为例,说明32位Windows 9.x环境下汇编语言与C++的混合编程。它也分为嵌入汇编和模块调用两种方式。
Visual C++直接支持嵌入汇编方式,不需要独立的汇编系统和另外的连接步骤。所以,嵌入式汇编比模块连接方式更简单方便。Visual C++的嵌入汇编方式与其他C∕C++编译系统的基本原理是一样的,当然有些细节的差别。嵌入汇编指令采用_ _asm关键字( 注意,_ _asm前是两个下划线;但Visual C++ 5.0∕6.0也支持一个下划线的格式_asm,目的是与以前版本保持兼容)。
__asm
{
mov eax,01h //支持汇编语言的注释格式
mov dx,0xD007 ;0xD007=D007h,支持C/C++的数据表达形式
out dx,eax
}
__asm mov dx,0D007h
__asm out dx,eax
2.嵌入汇编语言的注意事项
当然在嵌入汇编语言中也有很多的规矩,很多的 注意事项:
汇编语言的编写必须把修饰符写全,不能简写。比如
__asm{ mov [edi],0x065B42E9 } 一般看来肯定是mov的dword 其实不然,反汇编看到这条指令是 mov byte ptr [edi],0xE9 默认为byte了 所以必须写全修饰符
正确的应该是 __asm{ mov dword ptr [edi],0x065B42E9 } 还有就是注意十六进制数前必须加 0x 比如 mov dword ptr [edi+0xC],0xF9A4AEE9
{
char *carray;
int same_name;
};
struct second_type
{
int ivar;
long same_name;
};
struct first_type ftype;
struct second_type stype;
__asm
{
mov ebx,OFFSET ftype
mov ecx,[ebx]ftype.same_name //必须使用ftype
mov esi,[ebx].carray //可以不使用ftype(也可以使用)
}
/* Port output */
{
__asm mov eax,01h
__asm mov dx,0xD007
__asm out dx,eax
}
在VS2012中赋值操作中需要注意 不能直接赋值 这样得不到对应的值比如:
int nStatus;
__asm
{
mov nStatus,dword ptr [0x49419C]
}
这种写法 编译出来的结果是 mov dword ptr [ebp-0xC], 0x49419C 和预想结果不符合 写法上需要转换一下
正确的需要这样写:
int nStatus;
__asm
{
push eax
mov eax,dword ptr [0x49419C]
mov nStatus,eax
pop eax
}
3.嵌入汇编语言的示例
用_ _asm程序段编写函数
嵌入式汇编不仅可以编写C∕C++函数,还可以调用C函数(包括C库函数)和非重载的全局C++函数,也可以调用任何用extern “C”说明的函数,但不能调用C++的成员函数。因为所有的标准头文件都采用extern “C”说明库函数,所以C++程序中的嵌入式汇编可以调用C库函数。
例7.13:嵌入式汇编编写函数
// C++程序:LT713.CPP
#include
int power2(int,int);
void main(void)
{
cout<<"2的6次方乘5等于:t";
cout< }
int power2(int num,int power)
{
__asm
{
mov eax,num ;取第一个参数
mov ecx,power ;取第二个参数
shl eax,cl ;计算EAX=EAX×(2^CL )
} //返回值存于EAX
}
汇编语句通过参数名就可以引用参数,采用return返回出口参数。本例中虽没有使用return语句,但仍然返回值,只是编译时可能产生警告(在设置警告级别为2或更高时)。返回值的约定是:对于小于等于32位的数据扩展为32位,存放在EAX寄存器中返回;4~8字节的返回值存放在EDX.EAX寄存器对中返回;更大字节数据则将它们的地址指针存放在EAX中返回。
在Developer Studio开发系统中,建立一个WIN32控制台程序的项目,创建上述源程序后加入该项目。然后,进行编译连接就产生一个可执行文件。该程序运行后显示如下:
2的6次方乘5等于: 320
在Developer Studio开发系统中,可以通过Projects菜单Settings命令的Link标签设置加入调试信息(即∕Zi选项),嵌入式汇编就可以在源程序级进行调试;还可以在C∕C++标签中的Listing Files选择输出具有汇编语言程序输出列表(即∕FA、∕FAc、∕FAs、∕FAcs选项)。
4.调用规范
C∕C++与汇编语言混合编程的参数传递通常利用堆栈,调用规范决定利用堆栈的方法和命名约定,两者要一致,例如Visual C++的_cdecl调用规范与MASM的C语言类型。
转载于:https://blog.51cto.com/whatday/1382539
最后
以上就是单身冥王星为你收集整理的VS嵌入汇编ASM的全部内容,希望文章能够帮你解决VS嵌入汇编ASM所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复