- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
汇编语言与C内容-计算机本-1~4
什么是混合编程 多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程 混合编程方法 嵌入式汇编—— 在C/C++语言中直接使用汇编语言语句, 简洁直观、功能较弱 模块连接—— 两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序 使用灵活、功能强,要解决参数传递问题 混合编程的关键问题 建立不同语言之间的接口 在不同格式的两种语言间提供有效的通讯方式, 作出符合两种语言调用约定的某种形式说明, 实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用 Turbo C嵌入汇编方式 格式 asm 操作码 操作数 ;或换行 举例 asm mov ax,ds; asm pop ax; asm pop ds; asm ret; asm push ds 若干注意事项 操作码支持8086/8087指令或若干伪指令:db/dw/dd和extern 操作数:立即数、寄存器名,还可以是C语言程序中的常量、变量和标号等 内嵌的汇编语句可以用分号“;”结束,也可以用换行符结束 使用C的注释,如 / * … * / 例题 从数组中读取字符,不是‘a’~‘z’之间的复制,是‘a’~‘z’的转成大写字母,然后按顺序放入另一个数组中 用汇编语言写转换过程,用C写输出过程,字符串用NULL(0)结尾 / * LT1.C */ #include stdio.h void upper(char *dest,char *src) { asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop1: asm lodsb /* C语言定义的标号 */ asm cmp al,a asm jb copy /* 转移到C的标号 */ asm cmp al,z asm ja copy /* 不是’a’到’z’之间的字符原样复制 */ asm sub al,20h /*小写字母转换成大写*/ copy: asm stosb asm and al,al /* C语言中,字符串用NULL(0)结尾 */ asm jnz loop1 } main() /* 主程序 */ { char str[]=This Started Out As Lowercase!; char chr[100]; upper(chr,str); printf(Origin string:\n%s\n,str); printf(Uppercase String:\n%s\n,chr); } C和汇编模块连接的约定规则 命名约定 汇编语言过程中被C语言调用的标识符前要加下划线“_” 声明约定 C对调用的外部过程、变量等采用EXTERN说明 汇编语言程序的标识符用public操作符定义 寄存器使用约定 存储模式约定 采用相同的存储模式 参数传递约定:堆栈和共享变量 例2 ; 汇编语言子程序:lt2.asm .model small ;采用小型存储模式 .data msg db ’Hello, C and Assembly ! $’ .code PUBLIC _display _display proc ;过程名加有下划线 mov ah,9 ;小型模式不必设置DS mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret _display endp end /* C语言程序:lt2.c */ extern void display(void); /* 说明display是外部函数 */ main() { display(); } Visual C++的嵌入式汇编 格式 _ _asm { 指令 } 举例 int power2(int num,int power) { _ _asm { MOV EAX,NUM MOV ECX,POWER SHL EAX,CL } // 返回 EAX=EAX×(2^CL) } 模块连接的注意事项 必须遵循共同的约定规则 命名约定 声明约定 寄存器使用约定 存储模式约定 参数传递约定 采用一致的调用规范 声明共用函数和变量 正确传递入口参数和返回参数 * * 利用汇编程序编译目标代码文件: ML /c lt2.asm 利用C编译程序编译C程序、连接目标代码文件: TCC -ms -Iinclude -Llib lt2.c lt2.obj
原创力文档


文档评论(0)