微型计算机原理与汇编语言程序设计 曲凤娟 第11章

上传人:E**** 文档编号:89416986 上传时间:2019-05-24 格式:PPT 页数:38 大小:387.50KB
返回 下载 相关 举报
微型计算机原理与汇编语言程序设计 曲凤娟 第11章_第1页
第1页 / 共38页
微型计算机原理与汇编语言程序设计 曲凤娟 第11章_第2页
第2页 / 共38页
微型计算机原理与汇编语言程序设计 曲凤娟 第11章_第3页
第3页 / 共38页
微型计算机原理与汇编语言程序设计 曲凤娟 第11章_第4页
第4页 / 共38页
微型计算机原理与汇编语言程序设计 曲凤娟 第11章_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《微型计算机原理与汇编语言程序设计 曲凤娟 第11章》由会员分享,可在线阅读,更多相关《微型计算机原理与汇编语言程序设计 曲凤娟 第11章(38页珍藏版)》请在金锄头文库上搜索。

1、教学重点,第11章介绍实际应用当中,常见的混合编程问题,重点是参数传递方法 混合编程的两种方式 模块连接的约定规则 模块连接的参数传递方法,模块化程序设计,将程序分段、采用子程序或宏结构都是进行模块化程序设计 本节介绍开发大型程序时采用的方法: 源程序文件的包含 目标模块连接 把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体 INCLUDE 文件名,源文件包含的操作步骤: 分别编辑生成各个文件 汇编、连接主程序文件,把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ 主程序也经过独立汇编之后形成目标文件 连接程序将所有目标文件连接起来,最终产生

2、可执行文件 需要遵循的原则: 声明共用的变量、过程等 实现正确的段组合 处理好参数传递问题,目标代码文件的连接,声明共用的变量、过程,各个模块间共用的变量、过程等要说明 PUBLIC 标识符 ,标识符. ;定义标识符的模块使用 EXTERN 标识符:类型 ,标识符:类型. ;调用标识符的模块使用 标识符是变量名、过程名等 类型是byte / word / dword(变量)或near / far(过程) 在一个源程序中,public/extern语句可以有多条 各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致,实现正确的段组合,子程序文件必须定义在代码段中,也可以具

3、有局部的数据变量 采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用 完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型) 定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址,处理好参数传递问题,少量参数可用寄存器或堆栈直接传送数据本身 大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址 还可利用变量传递参数,但是要采用public/extern声

4、明为公共(全局)变量 这些也是子程序间的参数传递方法,什么是混合编程,多种程序设计语言间,通过相互调用、参数传递、共享数据结构和数据信息而形成程序的过程就是混合编程 程序的大部分采用高级语言编写,以提高程序的开发效率;在某些部分,利用汇编语言编写,以提高程序的运行效率,混合编程方法,嵌入式汇编 在C/C+语言中直接使用汇编语言语句, 简洁直观、功能较弱 模块连接 两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序 使用灵活、功能强,要解决参数传递问题,混合编程的关键问题,建立不同语言之间的接口 在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言

5、调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用,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的注释,如 / * * / 正确运用通用寄存器、标号等,/ * LT60

6、2.C */ #include void upper(char *dest,char *src) asm mov si,src /* dest和src是地址指针 */ asm mov di,dest asm cld loop: asm lodsb /* C语言定义的标号 */ asm cmp al,a asm jb copy /* 转移到C的标号 */ asm cmp al,z asm ja copy /* 不是a到z之间的字符原样复制 */,例11.21/2,asm sub al,20h /*小写字母转换成大写*/ copy: asm stosb asm and al,al /* C语言中,

7、字符串用NULL(0)结尾 */ asm jnz loop main() /* 主程序 */ char str=“This Started Out As Lowercase!“; char chr100; upper(chr,str); printf(“Origin string:n%sn“,str); printf(“Uppercase String:n%sn“,chr); ,例11.22/2,Turbo C模块连接的约定规则,命名约定 汇编语言过程中被C语言调用的标识符前要加上下划线“_” 声明约定 C对调用的外部过程、变量等采用EXTERN说明 汇编语言程序的标识符用public操作符定

8、义 寄存器使用约定 存储模式约定 采用相同的存储模式 参数传递约定:堆栈和共享变量,; 汇编语言子程序:lt903s.asm data segment msg db Hello, C and Assembly ! $ data ends code segment PUBLIC _display _display proc ;过程名加有下划线 mov ah,9 mov dx,offset msg ;寄存器AX和DX无须保护 int 21h ret _display endp Code ends end,例11.31/2,/* C语言程序:lt903.c */ extern void displa

9、y(void); /* 说明display是外部函数 */ main() display(); ,例11.32/2,; 汇编语言子程序:lt904s.asm .model small .code PUBLIC _min _min proc ;小型模式,为近过程 push bp mov bp,sp mov ax,bp+4 ;取第1个参数 cmp ax,bp+6 ;与第2个参数比较 jle minexit mov ax,bp+6 ;保存返回值 minexit: pop bp ret _min endp end,例11.41/2,图示,/* C语言程序:lt904.c */ extern int m

10、in(int,int); main() printf(“%d”,min(100,200); ,小型模式编译程序和连接: TCC -ms -Iinclude -Llib lt904.c lt904s.obj 大型模式编译程序和连接: TCC -ml -Iinclude -Llib lt904.c lt904l.obj,例11.42/2,例11.4的堆栈区,小型模式,大型模式,Visual C的嵌入式汇编,格式 _ _asm 指令 举例 int power2(int num,int power) _ _asm mov eax,num mov ecx,power shl eax,cl / 返回 EA

11、X=EAX(2CL) ,模块连接的注意事项,必须遵循共同的约定规则 命名约定 声明约定 寄存器使用约定 存储模式约定 参数传递约定 采用一致的调用规范 声明共用函数和变量 正确传递入口参数和返回参数,32位汇编语言过程,用.386p等处理器伪指令说明采用的指令集 32位逻辑段环境 有些指令在32位段与16位段有差别 采用平展模式(flat) 汇编时采用选项/coff,;汇编语言子程序:lt614f.asm .386p .model flat,c PUBLIC power2 .code power2 proc push ebp mov ebp,esp mov eax,ebp+8 ;取第1个参数

12、mov ecx,bp+12 ;取第2个参数 shl eax,cl pop ebp ret ;返回EAX power2 endp end,例11.141/2,图示,/ C+语言程序:lt914.cpp # include extern “c”int power2(int,int); void main(void) cout“2的6次方乘5等于:t”; coutpower2(5,6)endl; ,将汇编语言程序汇编成目标代码文件: ML /c /coff lt614f.asm 在Visual C+6.0编译环境下创建项目, 插入汇编成的目标代码文,然后编译连接,例11.142/2,如何简化利用堆栈

13、的传递参数方法,例11.14的堆栈区,要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐 应该采用过程调用伪指令INVOKE 使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明,带参数过程的定义、声明和调用,过程名 PROC 调用距离 语言类型 作用范围 USES 寄存器列表, 参数:类型 LOCAL 参数表 ;汇编语言语句 过程名 ENDP,过程声明伪指令:用于事先声明过程的结构 过程名 PROTO 调用距离 语言类型, 参数:类型 过程调用伪指令 INVOKE 过程名,参数,.,如何调用,;汇编语言程序:lt915.asm .model small checks

14、umd PROTO c,countp:word,arrayp:word ;声明过程 .stack 256 .data array db 12h,25h,0f0h,0a3h,3 db 68h,71h,0cah,0ffh,90h count equ $-array ;数组的元素个数result db ? ;校验和 .code .startup INVOKE checksumd,count,offset array ;调用过程 mov result,al ;保存校验和 .exit 0,例9.151/2,对比,checksumd PROC c USES bx cx, countp:word,array

15、p:word mov bx,arrayp ;BX数组的偏移地址 mov cx,countp ;CX数组的元素个数 xor al,al sumd: add al,bx ;求和:ALAL+DS:BX inc bx loop sumd ret checksumd endp end,例11.152/2,对比,;lt915.asm的列表文件(lt915.lst) . INVOKE checksumd,count,offset array * mov ax,word ptr OFFSET array * push ax * mov ax,+000Ah * push ax * call checksumd

16、* add sp,04h mov result,al .,例9.151/2,checksumd PROC c USES bx cx, countp:word,arrayp:word * push bp ;起始代码 * mov bp,sp * push bx ;保护bx和cx * push cx mov bx,arrayp ;arrayp=BP+6 mov cx,countp ;cuontp=BP+4 . ret * pop cx ;结尾代码 * pop bx * pop bp * ret 0000h checksumc endp,例11.152/2,;汇编语言子程序:lt916s.asm .model small,c ;采用C语言类型 public min .code min proc ,var1:word,var2:word mov ax,var

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

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

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