1.嵌入汇编
高级语言和汇编语言
给软件开发通常采用高级语言,以提高开发效率
某些部分利用汇编语言,以提高程序的运行效率
▶汇编语言的优点
开发的程序占用存储空间小、运行速度快
▶汇编语言的缺点
与处理器密切相关、移植性差,编程烦琐、调试困难
混合编程
汇编语言与高级语言、或不同高级语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程,称为“混合编程”
嵌入汇编
嵌入汇编(内嵌汇编、内联汇编、行内汇编)
▶直接在C/C++语言的源程序中插入汇编语言指令
使用“_ _asm”关键字指示嵌入汇编
▶不需要独立的汇编程序
嵌入汇编语句中使用汇编语言的注意事项
支持的指令集
▶例如,VC++ 6.0支持通用整数、浮点以及MMX指令集
支持的数据类型、表达形式等
▶可以使用MASM的表达式和注释风格
▶可以使用C++的数据类型和数据对象
▶不可以使用MASM的绝大多数伪指令和宏汇编
▶......
嵌入汇编语句中使用C++的注意事项
可以使用的C++语言规则
▶标号、常量、变量、结构和联合等>不能使用的C++语言规则
▶与MASM保留字相同的C++符号、C++的专用操作符等
使用C++语言的限制
▶每一个汇编语言语句只包含一个C++符号
▶引用函数前必须在程序中说明其原型
▶......
2.嵌入汇编的程序
嵌入汇编举例
完成计算有符号数平均值功能
▶主程序使用C++语言编写
▶求平均值函数使用嵌入汇编方法
声明与定义
#include<iostream.h>
#define COUNT 10
long mean(long d[],long num);
int main()
{
long array[COUNT]={675,354,-34,198,267,0,9,2371,-67,4257}
cout<<"The mean is\t"<<mean(array,COUNT)<<endl;
return 0;
}
long mean(long d[],long num)
{
long temp; //定义局部变量,用于返回值
__asm{ //嵌入式汇编代码部分
mov ebx,d ;EBX=数组地址
mov ecx,num ;ECX=数据个数
xor eax,eax ;EAX保存和值
xor edx,edx ;EDX指向数组元素
mean1:
add eax,[ebx+edx*4]
add edx,1
cmp edx,1
jb mean1
cdq
idiv ecx
mov temp,eax
}
return (temp);
}
3.模块连接
混合编程
汇编语言与高级语言、或不同高级语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程,称为“混合编程”
模块连接
模块连接
▶各种语言的程序分别编写
▶利用各自的开发环境编译形成OBJ模块文件
▶将它们连接在一起,生成可执行文件
采用一致的调用规范
Visual C++的_cdecl调用规范(C语言调用规范)
▶对应MASM的C语言类型
Visual C++的_stdcall调用规范
▶对应MASM的STDCALL语言类型(Windows的API函数采用)
声明共用函数和变量
C++语言程序的声明形式
▶extern "C"{返回值类型调用规范函数名称(参数类型表);}
▶extern "C"{变量类型变量名}
汇编语言程序的声明形式
▶public标识符[,标识符…]
▶extern标识符:类型[,标识符:类型…]
正确传递入口参数和返回参数
数据类型对应一致
▶C/C++的long(int)对应汇编语言的dword
▶C/C++的char对应汇编语言的byte
Visual C++函数通常从EAX寄存器返回值
高级语言使用堆栈传递参数
▶汇编语言可以使用扩展过程定义PROC伪指令
模块连接举例
完成计算有符号数平均值功能
▶主程序使用C++语言编写
▶求平均值函数使用汇编语言编写一个模块
声明与定义
#include<iostream.h>
#define COUNT 10
extern "C"{long mean(long d[],long num);}
int main()
{
long array[COUNT]={675,354,-34,198,267,0,9,2371,-67,4257}
cout<<"The mean is\t"<<mean(array,COUNT)<<endl;
return 0;
}
.686
.model falt,c
mean proto d:ptr dword,num:dword
.code
mean proc uses ebx ecx edx,d:ptr dword,num:dword
mov ebx,d ;EBX=数组地址
mov ecx,num ;ECX=数据个数
xor eax,eax ;EAX保存和值
xor edx,edx ;EDX指向数组元素
mean1:
add eax,[ebx+edx*4]
add edx,1
cmp edx,ecx
jb mean1
cdq
idiv ecx
ret
mean endp
end
}
创建可执行文件
在MASM开发环境
▶对汇编语言程序进行汇编、生成目标模块文件在Visual C++集成环境
▶加入Visual C++的Win32控制台程序的项目
▶同C++源程序一起编译、连接