(汇编语言)5 80868088汇编语言课件

上传人:我*** 文档编号:144886814 上传时间:2020-09-14 格式:PPT 页数:61 大小:401.50KB
返回 下载 相关 举报
(汇编语言)5 80868088汇编语言课件_第1页
第1页 / 共61页
(汇编语言)5 80868088汇编语言课件_第2页
第2页 / 共61页
(汇编语言)5 80868088汇编语言课件_第3页
第3页 / 共61页
(汇编语言)5 80868088汇编语言课件_第4页
第4页 / 共61页
(汇编语言)5 80868088汇编语言课件_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《(汇编语言)5 80868088汇编语言课件》由会员分享,可在线阅读,更多相关《(汇编语言)5 80868088汇编语言课件(61页珍藏版)》请在金锄头文库上搜索。

1、汇编语言,翟敏焕,主要内容,伪指令 段定义伪指令 源程序开始和结束伪指令 过程定义伪指令 其他伪指令 汇编语言语句格式 常用的DOS系统功能调用,一.伪指令,1、段定义伪指令,完整的段定义伪指令 段定义伪指令SEGMENT/ENDS 段假设伪指令ASSUME 段寄存器的段地址值 堆栈段说明 完整的段定义举例,前言,前面讲过存储空间通常被分为若干不同类型的段,因此完整的汇编语言源程序是由段组成。 一个汇编语言源程序原则上可以由若干个代码段、数据段、附加段和堆栈段构成。 段与段之间的顺序可以随意排列,并非所有的段都需要。 但需要独立运行的程序必须包含一个代码段,并指示程序执行的起始终止点,所有的可

2、执行的语句必须放在代码段内。,(1)完整的段定义伪指令,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS SEGMENT和ENDS是一对段定义语句,一个逻辑段从 SEGMENT语句开始,到ENDS语句结束。,I、段名,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS 段名: 给每个逻辑段指定一个名字,通常根据段体的意义给段命名,如堆栈段可取名为STACK,数据段可取名为DATA,代码段则可命名为CODE。 指出为该段分配的存储区起始位置。 语句序列: 对于数据段、附加段和堆栈段来说,这一部分一般是存储单元的定义和分配等

3、伪指令语句; 对于代码段来说则是指令语句以及伪指令语句。,II、定位类型,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS PARA(节边界),段起始地址最低四位必须是0。 BYTE (字节边界),本段起始地址可以从任一地址处开始存放。 WORD (字边界),段起始地址的最低一位必须是0。 PAGE (页边界),起始地址的最低八位必须是0。,默认值为:PARA,III、组合类型,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS PRIVATE:私有段,不进行组合。 PUBLIC: 不同模块中的同为public属性的同名

4、段连接组合成一个逻辑段。 COMMON: 不同模块中的同为common属性的同名段以覆盖方式组合成一个逻辑段。 AT 表达式 段首地址为表达式计算出来的16位值。但不能用于CS。 MEMORY 把该段定位在存储器中国最高地址处。 STACK 把各模块中的同名段组合成一个堆栈段,其长度给各原有段之和。,默认值为:PRIVATE,例子:,【例】有两个模块,各模块段定义如下 模块1: DATA1SEGMENT PARA PUBLIC DATA1 M1DB 45H DUP(0) DATA1ENDS DATA2SEGMENT PARA COMMON DATA2 N1 DB 102H DUP(0) DAT

5、A2ENDS END,模块2: DATA1SEGMENT PARA PUBLIC DATA1 M2DB 104H DUP(11H) DATA1ENDS DATA2SEGMENT PARA COMMON DATA2 N2DB 105H DUP(0) DATA2ENDS DATA3SEGMENT T1DB 50 DUP(20H) DATA3ENDS END,该段的定位组合方式示意图如图所示。,IV、使用类型,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS 只适用于80386以其后继机型。 USE16 使用16位寻址方式 段长64K (16位段地址,16位偏移

6、地址,默认值。) USE32 使用32位寻址方式 段长4G (16位段地址,32位偏移地址),V、类别,段名 SEGMENT 定位类型 组合类型 使用类型 类别 ; 语句序列 段名 ENDS 在引号中给出连接时组成的段组的类型名。在连接后形成的装入模块中,可使相同类别的段位置靠在一起。 类别名必须用单引号括起来。这样在连接时对不同模块、不同名的程序段只要类别名相同,则放在一个连续的物理空间,但每段之间是独立的,不进行组合。,(2)段假设伪指令ASSUME,使用SEGMENT/ENDS只能定义一个完整的逻辑段,但没有任何信息来说明逻辑段是代码段还是数据段,还是其他段。 所以还必须采用ASSUME

7、伪指令来明确逻辑段与CPU中的段寄存器的关系。从而根据给逻辑段所分配的段寄存器名,确定了逻辑段是属于哪个类型段。,(2)段假设伪指令ASSUME,格式:ASSUME 段寄存器:段名 ,段寄存器:段名 DATA1SEGMENT ADB 1,2,3 DATA1ENDS CODESEGMENT ASSUMEDS:DATA1,CS:CODE 其中段寄存器名必须是CS,DS,ES 和SS。 段名必须是由SEGMENT定义的段中的段名。,(3)段寄存器的段地址值,实际上,使用了ASSUME伪指令明确了段和寄存器的关系,但段寄存器并没有得到段的地址,还需要在代码段中使用下列程序段来完成对应的段地址存入段寄存

8、器的工作。 例如:MOV AX,DATA1;数据段 MOV DS,AX MOV AX,STACK1;堆栈段 MOV SS,AX,(4)堆栈段说明,堆栈段是一个特殊段,程序中可以定义它,也可以不定义它。除了生成.com型可执行程序的源程序外,一个完整的源程序最好要定义堆栈段。 即使不为源程序定义堆栈段,操作系统也会为除.COM类型的其他可执行程序自动指定一个64KB的堆栈段。 没有指定堆栈段时,在生成执行程序时连接程序会产生一个警告信息,用户可以忽略,所生成的执行程序时正常的。,(5)完整的段定义格式举例,data segment ; 定义数据段 data ends ;- extra segme

9、nt ; 定义附加段 extra ends ;- code segment ; 定义代码段 assume cs:code, ds:data, es:extra start: mov ax, data mov ds, ax ; 段地址段寄存器 code ends end start,2、源程序开始和结束伪指令,程序开始伪指令 NAME伪指令 TITLE伪指令 程序结束伪指令 END,(1)程序开始伪指令NAME,NAME伪指令 格式:NAME模块名 含义:表示一个模块的开始,并给出该模块名。,(1)程序开始伪指令TITLE,TITLE伪指令 格式:TITLE TEXT 功能:用来给源程序设置标题

10、,以后每页第一行都列出该标题。 在无NAME命令情况下,TEXT的前6个字符一般用作模块名。 TEXT为标题,即为不加引号的字符串,最长为60个字符。 一个程序模块中只允许一个TITLE命令,否则引起错误。,(2)程序结束伪指令END,END伪指令 格式:END 标号 END用来表示源程序的结束。 其中标号指示汇编程序开始执行的起始地址。如果多个模块连接,则只有主模块(通常为第一个模块)需使用标号,其它子模块只需用END而不必加标号。,模块的一般形式为,NAME 模块名 所有的语句 END 启动标号或过程,3、过程定义伪指令,过程即是 汇编语言子程序。设置过程的目的是为了简化程序的设计,它是模

11、块化程序设计的基础。过程只需要定义一次,可在程序的不同地方多次调用,可减少由源程序产生的目标代码的长度。 8088汇编用CALL指令启动过程,用RET指令结束过程调用。 过程(子程序)用伪指令PROC和ENDP来定义。,3、过程定义伪指令,格式:过程名 PROC 类型 过程体语句 RET 段名 ENDP PROC和ENDP是成对出现的。 类型有近(NEAR)和远(FAR)两种,若过程缺省或NEAR缺省,则属默认值。若为远过程,则FAR不能省略。 过程名具有段地址、段内偏移量和类型三个属性。,例子,DATASEGMENT XDW100 YDW10 DATAENDS CODE SEGMENT MA

12、INPROCFAR BEGIN: CALLSUBP RET MAINENDP,SUBPPROCNEAR MOV AX,X MOV BX,Y MUL BX RET SUBPENDP CODEENDS END BEGIN,4、其他伪指令,地址计数器$ ORG伪指令,(1)地址计数器$,$ 在汇编程序对源程序进行汇编的过程中,会使用地址计数器来保存正在汇编的指令的偏移地址。 地址计数器在开始汇编或在每一段开始时,初始化为0,而后每处理一条指令,就增加一个值。 但地址计数器在处理指令和伪指令时,两者保存的地址值以及增加的值都有所不同。,(1)地址计数器$,在处理指令时,保存的是当前处理指令的第一个字节

13、的处理,增加的值是当前指令所需的字节数。 JNZ $-8 表示当结果不为0时,跳转到另一条指令执行,地址是当前JNZ指令的首地址减去8。 注意:此时的$-8必须是一条指令的起始地址,否则报错。,(1)地址计数器$,在处理伪指令的参数时,如 DW0,$+6 每定义一个用“,”分隔开的数据,地址计数器都要变化,保存的地址是当前数据的最低地址,处理完一个数据,进入下一个数据的处理,增加的值就是这个数所需的字节数。 在伪指令中每处理一个参数数据,地址寄存器就要增加计数。,ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4,(2)ORG伪指令,格式:ORG 含义:以表达式中的值作为汇编位

14、置计数器值,命令汇编程序由这个位置开始生成目标代码,直到遇到另一个ORG命令。 也可以采用如下格式: ORG $+偏移量,(2)ORG伪指令,Buffer_segSEGMENT ORG20 Byte_bufDB100 DUP(?) ORG $+20 Word_bufDW100 DUP(?) Buffer_segENDS,(3)EVEN伪指令,格式:EVEN EVEN伪指令自动设置地址计数器值为最近的偶数值,以确保下一个变量或者指令开始于偶数字节地址。 通常一个字的地址最好从偶数地址开始。,(4)ALIGN伪指令,格式:ALIGN boundary 参数boundary必须为2的次幂,如2、4、

15、8等。 ALIGN伪指令根据boundary的值,自动设置地址计数器值为最接近的一个地址值,该地址值是参数boundary值的倍数。,5、模块通信伪指令,一个复杂的程序可以分成若干个模块,可由不同人员分工完成,每个模块易于编写和调试,便于程序的维护和修改。 模块内数据段定义的变量其作用域为它所在的那个模块,其他模块不能访问。 模块间通信或称模块间交叉访问是指一个模块要引用另一个模块中定义的变量、标号等标识符。,5、模块通信伪指令,PUBLIC公用名伪指令 功能:指明本模块中定义的哪些标识符可为其他模块引用。 格式:PUBLIC 标识符表 EXTRN外部定义伪指令 功能:指出本模块要引用的标识符

16、在其他模块中定义。 格式: EXTRN ,标识符:类型,多模块程序的上机调试过程,各个模块独立调试以确保功能的正确性。这需要按照单模块程序设计组织程序且上机处理,即对各模块分别进行编辑、汇编、连接、运行及调试。在进行上述处理时,每个模块都应以能够独立运行的EXE结构组织。 构造主模块。一个完整的系统只能有一个主程序,为了能够正确返回操作系统,含有主程序的模块的END伪指令后一定要带主过程名,要确保过程之间的通信正确等。 构造子模块。应把除含主程序外的其余模块均改写成子模块形式,为了确保正确返回到被调用程序,则子模块的END伪指令后不能带过程名,要保存和恢复所用到的寄存器,过程之间的通信要正确等。,

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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