80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法

上传人:E**** 文档编号:89083295 上传时间:2019-05-17 格式:PPT 页数:35 大小:294.50KB
返回 下载 相关 举报
80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法_第1页
第1页 / 共35页
80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法_第2页
第2页 / 共35页
80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法_第3页
第3页 / 共35页
80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法_第4页
第4页 / 共35页
80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法》由会员分享,可在线阅读,更多相关《80*86汇编语言程序设计第2版课件作者马力妮第10章节C C++与汇编语言的混合编程方法(35页珍藏版)》请在金锄头文库上搜索。

1、第10章 C/C与汇编语言的混合编程方法,10.1 嵌入式汇编 10.2 C/C+程序调用汇编源程序,10.1 嵌入式汇编,10.1.1 嵌入式汇编的格式 10.1.2 几点说明 10.1.3 编译链接的方法,10.1.1 嵌入式汇编的格式,1、格式 格式1: asm 格式2: _ _asm 格式3: _ _asm 汇编指令 例如: _ _asm mov eax, a /将a的内容送 eax寄存器 mov ebx, b /将b的内容送ebx寄存器 add eax, ebx / eax = eax + ebx = eax + (*b) ,执行结果(tc环境) : print character

2、in inline assembly: *,例如: _ _asm mov eax, a _ _asm mov ebx, b _ _asm add eax, ebx 【例10-1】一个简单的应用嵌入式汇编的C程序。 main() printf(“display a character in in-line assembly:n“); asm mov ah, 2 asm mov dl, “*“ asm int 21h ,需要注意的问题 嵌入C语言中的DOS功能调用int 21h在32位应用程序中不能使用。,2操作码 TC20支持8086指令集,支持db,dw,dd,extern等部分伪指令。 VC

3、6.0中,嵌入式汇编可以使用Intel 486处理器以上的指令集,但不支持db、dw等伪指令。 【例10-2】在C程序中使用汇编伪指令。 asm row db 15; /*定义一个字节变量row并赋值 */ asm column db 20; /*定义一个字节变量 column 并赋值*/ asm string db “Assembly Language$“; main() asm mov ah,2; /* 设置光标位置*/ asm mov bh,0; asm mov dl, column; asm mov dh, row; asm int 10h; asm mov ah, 9; /*在光标所

4、在位置输出字符串*/ asm lea dx, string; asm int 21h; ,3操作数,【例10-3】在嵌入的汇编指令中使用C程序块中的变量。 main( ) char *string = “Hello World!n$“; asm mov ah, 09h asm mov dx, string /*使用C中的变量*/ asm int 21h ,除汇编语言中合法的操作数之外,如立即数和寄存器,嵌入式汇编还可以访问CC+中的常量(符号常量和枚举型成员)、符号(标号、变量、函数参数等)。可以访问C+成员变量和用extern “C“说明的函数,不能访问C+的成员函数和重载函数。,【例10-

5、4】在嵌入的汇编指令中使用C程序块中的函数参数。 #include using namespace std; int summary(int,int); void main() int x, y; coutxy; cout“The result is“ summary(x, y)endl; int summary(int a,int b) int result; _asm mov eax, a /* ax = a*/ mov ebx, b /* bx = b*/ add eax, ebx /* ax = ax + bx*/ mov result,eax return(result); ,10.

6、1.2 几点说明,_ _asm mov al, 2 mov dx, 0xd007 /*也可以表示为0d007h*/ out al, dx ,1立即数表示法 在嵌入的汇编指令中,可以使用C/C+的数据表示方式,也可以使用汇编语言的数据表示方式。,2操作符 在嵌入式汇编指令中不能使用诸如一类的CC+专有操作符,对于一些MASM与C/C+中都在使用的操作符,比如:*和 操作符,在嵌入式汇编中被优先解释为汇编操作符。,【例10-5】 输出一维数组中的数据。 #include using namespace std; void main() static int array10; int i; _asm

7、 mov array8,1 array6=2; for(i=0;i=9;i+) coutarrayi; coutendl; ,执行结果 : 0 0 0 0 1 0 2 0 0 0,执行结果: Hello World! Hello World! Hello World!,可以在C/C+程序块中使用goto语句跳转到汇编程序块中的标号处,也可以从嵌入的汇编指令跳转到汇编程序块外部或内部的标号处。汇编程序块中的标号不区分大小写。,main() char *string = “Hello World! $“; _CX=3; _AX=0x0900; _DX=(unsigned short)string;

8、 again: asm int 0x21 /*21H中断*/ asm loop again ,3跳转,【例10-6】从汇编程序块跳转到C程序块。,10.1.3 编译链接的方法,对于Turbo C,用TCC命令行方式实现编译链接,命令如下: tcc -B -Llib -Iinclude 文件名 -B 在C程序中加上#program inline语句 -L 指定库函数所在的目录 -I 指定头文件所在的目录 文件名 内嵌汇编指令的C程序名 汇编时tcc要用到TASM.EXE程序,如果没有此程序,可以把MASM.EXE(3.0版本以上,5.0版本以下)复制到TC20子目录下,然后改名为TASM.EXE

9、,否则编译时会出错。 对于Visual C+,通过Project菜单创建一个工程文件(Win32 Console Application),然后将含嵌入式汇编的程序添加到该工程中去。通过菜单选项直接编译、链接、运行即可。,10.2 C/C+程序调用汇编源程序,10.2.1 一个简单的小例子 10.2.2 编译链接的方法 10.2.3 C/C+程序对汇编源程序的调用规则 10.2.4 MASM6.11环境下参数传递的变化,10.2.1 一个简单的小例子,;demoasm.asm .model small .data string db Hello World!$ .code public _di

10、splay _display proc ;过程定义 mov ah,9 mov dx, offset string int 21h ret _display endp end,/*democ.c C程序*/ extern void display(void); main( ) display( ); ,【例10-7】利用函数调用的形式输出字符串Hello World!。,1 Turbo C集成环境 1)编辑汇编子程序*.asm和C程序*.c 2)进入TC20环境,选择菜单File中的New,新建一个工程文件*.prj; 3)该文件中添加编译链接的C语言程序及其调用的汇编语言源程序: 4)选择菜单

11、File中的Save,保存该工程文件。 5)选择菜单Compile中的Primary C File选项,输入C程序名; 6)选择菜单Project Project Name选项,输入工程文件名*.prj; 7)选择菜单Options中的linker选项,将Case-sensitive link置为Off,关闭大小写敏感开关。使用该方法时,要注意C语言对大小写敏感的问题,所以最好关闭大小写敏感开关。 8)选择菜单Compile中的Make EXE file选项,生成exe文件。,10.2.2 编译链接的方法,2Turbo C命令行方式 1)编辑*.asm和*.c; 2)用宏汇编masm将*.as

12、m汇编为*.obj文件; masm *.asm 3)用tcc命令行方式对C程序democ.c进行编译,生成.obj文件: tcc -c *.c 参数-c表示只编译不链接。 4)用Turbo C的tlink对两个目标文件进行链接,生成.exe文件: tlink libc0s democ demo, democ.exe, libcs 参数libc0s和libcs指定lib目录下小型存储模型的初始化模块c0s.obj和函数库cs.lib。汇编形成的目标文件和编译形成的目标文件,在tlink命令的前后顺序可以任意。目标文件的后缀可以省略。,3VC+集成环境 1)将汇编子程序汇编为obj文件: ml /

13、c /coff demo.asm /c选项表示只编译,不链接,/coff表示产生的obj文件格式是COFF格式。 2)在VC+中新建一个项目(Win32 Console Application),将汇编语言过程的obj文件和cpp文件添加到该项目中进行编译。,1存储模型 C程序调用汇编子程序时,调用程序和被调用的汇编子程序必须使用相同的存储模型。 C语言提供了六种存储模型: Tiny、Small、Compact、Medium、Large、Huge TC命令行方式采用tcc命令中的-mx选项指定存储模型; TC集成环境中利用菜单项Options-Compiler-Model指定存储模型。,10.

14、2.3 C/C+程序对汇编源程序的调用规则,2 函数名和变量名 (1)C编译器的命名规范 汇编子程序与C/C+中共享的标识符要服从C/C+的命名规则。 (2)汇编子程序的过程名以及变量名都说明为public C语言和汇编语言进行混合编程时,汇编子程序中公共的过程名及变量名应该用public进行说明: public _name 在C/C+中应将在本程序中用到的汇编子程序的公共的过程名和变量名说明为外部符号,并且不能在名字前加下划线。 C的说明形式: extern 变量类型 变量名; extern 返回值类型 过程名(参数类型表); C+的说明形式: extern “C“ 变量类型 变量名; ex

15、tern “C“ 返回值类型 过程名(参数类型表);,3 寄存器 TC环境下,在汇编语言子过程中: AX、BX、CX、DX、ES 可以随意使用; BP、SP、SI、DI、CS、DS、SS 使用时先将原始内容保存入栈,在子程序结束前恢复其原始内容。,4 参数传递 (1)C/C+传递参数的方法 C/C+调用汇编子程序时,通过堆栈传递参数, 顺序:从右到左。 (2)返回地址入栈,(IP) (IP) (CS) 入口参数n 入口参数n 入口参数1 入口参数1,以tiny、small、compact模型编译时的堆栈,以medium、large、huge模型编译时的堆栈,(3)汇编子程序的返回值 返回值在16位2进制数表示范围之内时,用AX寄存器来传递; 返回值在32位2进制数表示范围之内时,用DX:AX寄存器传递; 返回值大于32位2进制数表示范围时,返回值存放到静态变量存储区,该数据的首地址存放在AX寄存器(NEAR)中,如果是FAR调用,则该数据的首地址存放在DX:AX寄存器中(DX装段地址,AX装偏移地址)。,(4) 常用的汇编语言子过程框架,.model small ;模型是small .code publ

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号