汇编语言-与C++混合编程

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++源程序一起编译、连接

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DbillionBUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值