- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入汇编语言的示例 ???? 用_ _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)??? {??????? cout2的6次方乘5等于:\t;??????? coutPOWER2(5,6)ENDL;??? }??? 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选项)。
嵌入汇编语言的注意事项 ???? 当然在嵌入汇编语言中也有很多的规矩,很多的 注意事项:
???? 1.??在_?_asm中使用汇编语言的注意事项
???? 嵌入式汇编代码支持80486的全部指令系统。Visual C++ 5.0∕6.0还支持MMX指令集。对于还不能支持的指令,Visual C++提供了_emit伪指令进行扩展。
???? _emit伪指令类似MASM中的DB伪指令,可以用来定义一个字节的内容,并且只能用于程序代码段;例如:
???? #define cpu-id __asm _emit 0x0F __asm _emit 0xA2?? //定义汇编指令代码的宏
???? ?__asm{ cpu-id }?? //使用C++的宏
????? 嵌入式汇编代码虽然可以使用C++的数据类型和数据对象,但却不可以使用MASM的伪指令和操作符定义数据。程序员不能使用DB∕DW∕DD∕DQ∕DT∕DF伪指令和DUP∕THIS操作符;也不能使用MASM的结构和记录(不接受伪指令STRUCT、RECORD、WIDTH、MASK)。
????? Visual C++不支持MASM的宏伪指令(如MACRO、ENDM、REPEAT∕FOR∕FORC等)和宏操作符(如 !、、%等)。
???? ?虽然嵌入式汇编不支持大部分MASM伪指令,但它支持EVEN和ALIGN。这些指令将NOP指令放在汇编代码中以便对齐边界。对有些处理器来说,这样可以更加有效地读取指令。
????? 嵌入式汇编代码可以使用LENGTH、SIZE、TYPE操作符来获取C++变量和类型的大小。LENGTH用来返回数组元素的个数,对非数组变量返回值为1;TYPE返回C++类型或变量的大小,如果变量是一个数组,它返回数组单个元素的大小。SIZE返回C++变量的大小,即LENGTH和TYPE的乘积。
???? 例如,对于数据int iarray[8](int类型是32位,4个字节),则:
????? LENGTH iarray返回8(等同于C++的sizeof(iarray)/sizeof(iarray[0]));
????? TYPE iarray返回4(等同于C++的sizeof(iarray[0]));
???? ?SIZE iarray返回32(等同于C++的sizeof(ia
原创力文档


文档评论(0)