微机原理及接口技术第05章课件.ppt

上传人:牧羊曲112 文档编号:3765192 上传时间:2023-03-21 格式:PPT 页数:200 大小:2.43MB
返回 下载 相关 举报
微机原理及接口技术第05章课件.ppt_第1页
第1页 / 共200页
微机原理及接口技术第05章课件.ppt_第2页
第2页 / 共200页
微机原理及接口技术第05章课件.ppt_第3页
第3页 / 共200页
微机原理及接口技术第05章课件.ppt_第4页
第4页 / 共200页
微机原理及接口技术第05章课件.ppt_第5页
第5页 / 共200页
点击查看更多>>
资源描述

《微机原理及接口技术第05章课件.ppt》由会员分享,可在线阅读,更多相关《微机原理及接口技术第05章课件.ppt(200页珍藏版)》请在三一办公上搜索。

1、第4章 16位和32位微处理器的指令系统及汇编语言编程,教学目的和要求 掌握16位微处理器的寻址方式、指令系统及汇编语言编程,了解32位微处理器的指令系统,并结合附录A能够掌握汇编语言编程的上机操作,教学重点 16位微处理器的寻址方式、指令系统及汇编语言编程(完整段模式)32位汇编语言编程(简化段模式),教学难点 微处理器的寻址方式与指令系统 汇编语言编程的基本概念和编程方法,4.0 入 门,指令通常应提供的信息,1.做什么操作 2.操作数从哪里来 3.操作结果放在哪里 4.对于调用和转移指令,还要涉及转移或调用地址的提供方式,指令系统的特点,8086/8088的指令系统完全相同,都能在x86

2、系列CPU上运行指令的特点体现在:格式上、功能上和寻址方式可变长指令,如CISC指令18字节寻址方式多样灵活,处理数据能力强有重复指令和运算指令,扩充了条件指令、移位/循环指令为加强软件中断功能和支持多处理器相同的工作,增设了有关的指令,如test,wait等,指令的组成,操作码(OP)字段 标明计算机要执行什么操作操作数(operand)字段 指出指令在执行过程中所需要的 操作数(值为多少 或者放在什么地方),以及操作结果送到哪里,指令的一般格式,每条指令为字节的整数倍长(指令规整)操作数字段可以有零个、一个、二个或三个操作数,通常称为“一地址”,“二地址”或“三地址”指令。,示例1,无操作

3、数指令(控制类指令),如:HLTLOCKCLCCLDCLIIRET,示例2,单操作数指令,如:加1指令 INC AX 只需要指出加1的操作数,它是“一地址”指令。双操作数指令,如:ADD AX,BX 大多数运算型指令都是双操作数指令,对这种指令,有的机器(大中型)使用“三地址”指令:除给出参加运算的两个操作数外,还要指出运算结果的存放地址,操作指令,现代微型计算机中多采用二地址指令,两个操作数分别称为“源操作数”和“目的操作数”,指令执行后,把运算结果放到目的操作数的地址之中。指令的操作码在机器中的表示比较简单,只要对每一种操作指定相应的二进制代码即可;而指令的操作数字段的情形就比较复杂。,编

4、址方式,计算机中的编址设备:Register、系统主存和I/O设备编址方式:三个零地址空间:即对上述三种设备分别进行编址,并分别采用不同的寻址方式,很复杂,如:PC/XT两个零地址空间:对通用寄存器R进行独立编址,主存和I/O统一编址,地址码的地址高端用于I/O地址,64K。优点:简化了指令系统缺点:指令执行过程复杂,编址方式,一个零地址空间:三种设备统一编址,寄存器、主存和I/O对应低地址到高地址无零地址空间:指堆栈计算机CACHE和BUFFER是否需要编址?,寻址方式,寻址方式的定义:指令中如何提供操作数或操作数地址的方式。规定如何对地址字段作出解释以找到操作数。*程序转移时需提供转移地址

5、,这跟提供操作数地址在方法上没有本质区别,因此也归入寻址方式的范畴。,指令系统设计,包括操作码字段和操作数字段一个指令系统能够提供哪些寻址方式,能否为编制程序提供方便,这是指令系统设计的关键。需要说明的是,在不同的计算机系统中,寻址方式的名称和分类并不统一,但基本可以归结为以下几种方式或它们的变型或组合:,寻址方式,固定寻址立即寻址(立即数寻址)寄存器寻址直接寻址间接寻址变址寻址,4.1 8086微处理器的寻址方式与指令系统,4.1.1 寻址方式 一条指令包含操作码和操作数两部分,操作码指出该指令要进行的操作,操作数指出该指令需要的操作数或操作数的地址。指令根据一定的方式,找到操作数或操作数的

6、地址,然后取出操作数进行处理。寻找操作数地址的方式称为寻址方式,表4-1 8086/8088的6种寻址方式,一、寄存器寻址,汇编格式:R(R是寄存器名)说明:寻找的操作数在寄存器R中 例【4-1】INC AX,二、寄存器间接寻址,汇编格式:R(R是寄存器名)说明:寄存器R的内容是操作数在内存的EA,先从寄存器R中取出操作数在内存的EA,再根据EA和某段寄存器生成PA寻找操作数,所以称为间接寻址。能用来作间接寻址的寄存器只能是BX、SI、DI或BP四者之一 例【4-2】MOV AX,SI,二、寄存器间接寻址(续),三、变址寻址,汇编格式:XR(R是寄存器名,X表示位移量,其值是用8位或16位二进

7、制补码表示的有符号数)。说明:寄存器R内容和位移量X之和是操作数在内存的EA。先将寄存器R中的值和位移量X相加求出操作数在内存的EA,再根据EA和某段寄存器生成PA寻找操作数。能用来作变址寻址的寄存器只能是BX、SI、DI 或BP四者之一。例【4-3】MOV BX,2BX,三、变址寻址(续),四、基址变址寻址,汇编格式:XBR+IR或XBRIR(BR为基址寄存器,IR为变址寄存器,X表示位移量,其值是用8位或16位二进制补码表示的有符号数)说明:基址寄存器BR、变址寄存器IR的内容和位移量X三者之和是操作数在内存的EA。先将寄存器BR、IR中的值和位移量X相加求出操作数在内存的EA,再根据EA

8、和某段寄存器生成PA寻找操作数。基址寄存器只能用BX或BP,变址寄存器只能用SI或DI,四、基址变址寻址(续),五、立即寻址,汇编格式:n(n是一个常数,称为立即数)说明:指令操作码后面单元的内容为操作数(常数n),操作数在内存代码段。立即寻址所提供的操作数直接放在指令中,它是紧跟在指令操作码后面的一个可用8位或16位二进制补码表示的有符号数。立即寻址主要用来给寄存器或内存单元赋初值 例【4-6】MOV AX,2是将立即数2送到AX中,六、直接寻址,汇编格式:含有变量的地址表达式或段寄存器:EA 说明:在一条指令中直接给出某一内存单元的EA,这个EA经过汇编后放在这条指令的下一个字单元。例【4

9、-7】MOV AX,2000是将数据段中EA为2000的内存单元中的内容送到AX中。,4.1.3 8086指令系统,一、数据传送指令,4.1.3 8086指令系统,一、数据传送指令(续1),4.1.3 8086指令系统,一、数据传送指令(续2),4.1.3 8086指令系统,一、数据传送指令(续3),4.1.3 8086指令系统,二、算术运算指令,4.1.3 8086指令系统,二、算术运算指令(续1),4.1.3 8086指令系统,二、算术运算指令(续2),4.1.3 8086指令系统,三、位操作指令,4.1.3 8086指令系统,三、位操作指令(续1),4.1.3 8086指令系统,三、位操

10、作指令(续2),4.1.3 8086指令系统,四、转移指令,转移指令分条件转移指令和无条件转移指令两大类,其特点是改变程序的执行顺序(即改变指令指针IP的值),但不改变状态标志位的状态。条件转移指令根据条件标志的状态判断是否转移。无条件转移指令则不作任何判断,无条件地转移到指令中指明的目的地址处执行。转移指令共有19条,具体见表4-9,4.1.3 8086指令系统,四、转移指令,4.1.3 8086指令系统,四、转移指令(续1),4.1.3 8086指令系统,四、转移指令(续2),4.1.3 8086指令系统,四、转移指令(续3),4.1.3 8086指令系统,四、转移指令(续4),4.1.3

11、 8086指令系统,五、字符串操作指令,为了方便地实现字符串操作,8086/8088提供了字符串操作指令。只要按规定设置好初始条件,选用正确的字符串操作指令,就可完成规定的操作,这些指令的前面可加重复前缀,能在条件满足的情况下反复执行,而不用考虑指针如何移动、循环次数如何控制等问题,从而简化了程序设计。字符串操作指令在使用格式和使用方法上有许多类似的地方,它们隐含使用的寄存器、标志位和符号见表4-10,4.1.3 8086指令系统,五、字符串操作指令(续1),4.1.3 8086指令系统,五、字符串操作指令(续2),4.1.3 8086指令系统,五、字符串操作指令(续3),系统规定:源串一定要

12、在当前数据段中,目的串只允许在当前附加数据段中。所有的串操作指令均以寄存器间接方式访问源串或目的串中的各元素,并自动修改SI和DI的内容。若DF=0,则每次操作后,SI、DI自动增量(字节操作加1、字操作加2);若DF=1,则每次操作后,SI、DI自动减量(字节操作减1、字操作减2),使之指向下一个元素,4.1.3 8086指令系统,五、字符串操作指令(续4),当指令带有重复前缀时,则指令重复执行,每执行一次,就检查一次重复条件是否成立,如成立,则继续重复;否则终止重复,执行后续指令 REP:重复,即无条件重复CX寄存器中指定的次数 REPE/REPZ:相等/为0时重复,即(CX)0(重复次数

13、还未为0)同时ZF=1(比较时相等)时重复,否则,重复终止。REPNE/REPNZ:不相等/不为0时重复,即(CX)0(重复次数还未为0)同时ZF=0时重复,否则,重复终止,4.1.3 8086指令系统,五、字符串操作指令(续5),4.1.3 8086指令系统,五、字符串操作指令(续6),4.1.3 8086指令系统,五、字符串操作指令(续7),4.1.3 8086指令系统,五、字符串操作指令(续8),4.1.3 8086指令系统,五、字符串操作指令(续9),4.1.3 8086指令系统,五、字符串操作指令(续10),4.1.3 8086指令系统,六、处理机控制指令,4.1.3 8086指令系

14、统,六、处理机控制指令(续1),4.1.3 8086指令系统,六、处理机控制指令(续2),4.2 16位汇编语言编程,4.2.1 伪指令,在汇编源程序中使用一些固定格式的约定符号,这些符号主要用来告诉汇编程序如何工作,这就是汇编控制命令,也称伪指令。伪指令和机器指令(在4.1.3中所讲的指令)最大的区别有2点 伪指令是在汇编源程序汇编期间,被汇编程序识别并解释。主要是为变量申请内存空间、建立堆栈、告诉汇编程序从何处开始汇编以及到何处结束等。而可执行指令是在程序执行期间被CPU译码并执行的,4.2.1 伪指令,汇编结束后伪指令就完成任务,在程序执行期间不再考虑它,因此伪指令不翻译成目标码。而可执

15、行指令经汇编程序汇编后,变成机器可以识别并执行的目标码 一、数据定义伪指令数据定义伪指令见表4-13 格式:变量名 数据定义伪指令 表达式,功能:定义数据存储区,其类型由所使用的数据定义伪指令指定,4.2.1 伪指令,4.2.1 伪指令,二、符号定义伪指令,等价伪指令格式:符号名 EQU 表达式功能:用来为常量、表达式及其他各种符号定义一个等价的符号名,但它并不申请分配存储单元。如果一个常量在程序中使用非常频繁可以用一个符号来表示它,这就是符号常量。如假定学生成绩处理程序中经常使用某班的人数用等价伪指令定义为:N EQU 40。指令MOV AX,N在汇编时用40代替N变成MOV AX,40,4

16、.2.1 伪指令,等号伪指令 格式:符号名=表达式 功能:该语句的功能和EQU相似,不同的是等号伪指令能对所定义的符号名再重新定义,当使用等号语句连续定义同一符号名时,以最后一次定义的值为准,4.2.1 伪指令,三、段定义伪指令 格式:段名 SEGMENT 定位方式组合方式 类别 段名 ENDS 功能:定义了一个以SEGMENT伪指令开始,以ENDS伪指令结束,以段名命名的存储段,4.2.1 伪指令,说明:段名是程序员为该段所起的名字,用来指出为该段分配的存储区起始位置。一个程序模块可以定义为若干段,段名可以各不相同,也可以重复,汇编程序将一个程序中的同名段处理成一个段。段的定义可以嵌套,但不

17、能交叉。定位方式、组合方式和类别是可选项,可省略。数据段(或附加数据段)中一般定义常量和变量,是为程序的代码段提供数据和保存计算结果的。它的一般格式如下:DATA SEGMENT 常量或变量定义 DATA ENDS,4.2.1 伪指令,堆栈段为程序定义堆栈,堆栈的大小依赖于你所编写的程序对堆栈的使用程度。如果你省略堆栈段定义,当你的程序使用堆栈时,系统会自动建立堆栈。并且在汇编时会出现一个警告:“LINK:warning L4021:no stack segment”。对于一般的小程序可省略堆栈段定义,堆栈段的一般格式如下:STACK SEGMENT STACKDB n DUP(0)STACK

18、 ENDS 其中n是堆栈的长度,由程序员根据需要自定,4.2.1 伪指令,代码段是程序对数据进行处理的部分。在一个程序中,数据段、堆栈段和附加数据段都可以省略,代码段不能省略,代码段的一般格式如下:CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EDATA 假定伪指令 START:可执行语句 MOV AH,4CH INT 21H CODE ENDS END START 程序结束伪指令,五、置汇编地址计数器伪指令ORG,汇编地址计数器用符号“$”表示,它用来记录正在被汇编程序汇编的语句地址,也就是说其内容标出了汇编程序当前的工作位置。在一个源程序中

19、,往往包含了多个段,汇编程序在将该源程序汇编成目标程序时,每遇到一个新段,就为该段分配一个初值为0的汇编地址计数器,然后,再对该段中的语句汇编。在汇编过程中,对凡是需要申请分配存储单元的语句和产生目标代码的语句,汇编地址计数器则按该语句目标代码的长度增值。因此,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。汇编地址计数器符号“$”可出现在表达式中,4.2.1 伪指令,汇编地址计数器的值可以用伪指令ORG进行设置。格式:ORG 数值表达式 功能:将汇编地址计数器设置成数值表达式的值。其中,数值表达式的值应为非负的整数,其值在065535之间,例【4-15】汇编地址计数器和伪指令O

20、RG举例DATA SEGMENTORG 4BUF DB readmeORG$+5NUM DB-2DATA ENDS,4.2.2 汇编语言中的常量、变量及标号,一、常量 常量是指在程序执行期间不变的量。在8086/8088宏汇编语言中可使用的常量见表4-14。常量主要用于伪指令中给变量赋初值,或者用作机器指令语句中的立即操作数、变址寻址和基址变址寻址中的位移量。常量一般可以直接以数值形式出现在汇编语句中,这种常量称数值常量。但对经常使用的数值常量,可以事先为它定义一个名字,然后在语句中用名字来表示该常量,这种常量称符号常量。伪指令EQU和等号“=”可用来实现将数值常量定义成符号常量,4.2.2

21、汇编语言中的常量、变量及标号,4.2.2 汇编语言中的常量、变量及标号,二、变量,在汇编语言中,变量是一个数据单元的名字,即数据存放地址的符号表示。它有3个属性:变量的段属性。指变量所在段的首地址,当需要访问该变量时,它所在段的首地址一定要在某一段寄存器中 变量的偏移属性。指变量所在段的首地址到变量所在的存储单元之间的距离,用字节数表示。它表示变量在某段的相对位置,也就是我们所说的偏移地址(或有效地址)EA 变量的类型。指存取某变量所需要的字节数,变量的定义格式如下:变量名 数据定义伪指令 表达式,汇编语言中的符号常量名、变量名、段名、过程名、标号都称为标识符。标识符是由字母、数字(09)、特

22、殊字符(?、.、_、$)等组成的字符串,但该字符串不能以数字或下划线_作为开始字符。标识符最大长度不能超过31个字符,并且汇编语言对字母的大写和小写没有统一要求,也就是说,汇编语言对标识符中字母的大写和小写不作区分,如ABC、aBc、Abc和aBC都认为是同一个标识符。注意不能使用汇编语言的保留字如算术运算指令名ADD、SUB等做标识符,:数值表达式 ASCII字符串(只有用DB定义变量时,才允许字符串长度超过2个字符)地址表达式。如果该地址表达式为一变量(或标号)名,用DW伪指令是取它的偏移地址来初始化变量,用DD伪指令是取它的段首址和偏移地址来初始化变量,表达式的几种方式,?(表示所定义的

23、变量初值不确定)重复子句 格式:n DUP(表达式)其中,n是重复因子,只能取正整数,它表示定义了n个存储单元,其类型由它前面的数据定义伪指令确定。而每个存储单元中的初值由DUP后面圆括号中的表达式给定,如果是“?”,则表示变量的初值不确定 可以是以上表达式组成的序列,各表达式之间用逗号隔开,例【4-16】有下面的数据段,画出其内存分配图DATA SEGMENTTABLE DB 1,2,3,2 DUP(6,-2)COUNTER EQU$-TABLEVARY DW 1234HCHAR DB 123,3 DUP(1)POINTER1 DW VARYPOINTER2 DD CHARDATA ENDS

24、,标号是机器指令语句存放地址的符号表示,也可以是过程名。过程名实际上是过程入口地址的符号表示,即过程第一条机器指令语句的存放地址 标号的用法有两种:在代码段某一指令的前面,是当前一条指令语句地址的符号表示,用来提供一个转移地址,让其他的指令向此指令转移,一般的机器指令语句前不需要标号 用来表示过程入口地址,三、标号,4.2.3 汇编语言中的运算符号和表达式,数值表达式是利用算术、逻辑、移位或关系运算符将常量连结在一起构成的表达式,它的运算结果是一个数值 算术运算符共有+、-、*、/、MOD 5个,其中*、/、MOD优先级相同,+、-优先级相同,并且*、/、MOD优先级高于+、-。可利用括号改变

25、一个表达式某一部分的优先级。MOD是取余数,如7 MOD 3的值是1 逻辑运算符有AND、OR、XOR、NOT 4个,分别是逻辑与、逻辑或、逻辑异或、逻辑非。逻辑运算是按位进行的,所以运算的结果仍是整数常量,一、数值表达式,移位运算符有左移SHL和右移SHR 2个运算符。SHL表示将常量左移运算符右边常量规定的次数,SHR表示将常量右移运算符右边常量规定的次数,所空的位补0 关系运算符有EQ、NE、GT、LT、GE、LE共6个运算符,分别是等于、不等于、大于、小于、大于或等于、小于或等于。关系运算的结果是两个特殊的量,若关系不成立,则结果为0;否则为0FFFFH,地址表达式的值是段内偏移地址,

26、它具有段、偏移地址及类型三个属性。地址表达式是由变量、常量、标号、寄存器和运算符组成的有意义的式子地址表达式除可使用数值表达式的运算符外,还可根据需要使用一些特殊运算符,二、地址表达式,用来指明某个变量、标号或地址表达式的类型属性,或者使它临时兼有与原定义所不同的类型属性,但保持它们原来的段属性和偏移地址属性不变。其格式是:类型 PTR 地址表达式 根据地址表达式的不同值,类型可以是BYTE、WORD、DWORD、NEAR、FAR,1类型运算符PTR,为了将源程序中的指令正确地翻译成目标代码,汇编程序要求每个语句中操作数的类型要明确,如果是双操作数指令,还要求源操作数和目的操作数类型一致,既同

27、时为字节类型或同时为字类型。下面分4种情况说明:对于单操作数指令,操作数的类型必须明确 对于双操作数指令,只要有一个操作数类型明确就可以了 如果两个操作数类型都明确,则它们的类型必须一致 如果两个操作数类型都不明确,就要用PTR来指定类型了,跨段前缀“:”用于临时给变量、标号或地址表达式指定一个段属性,且只能在所出现的语句中有效,它并不改变地址表达式的偏移地址和类型属性,它的格式是:段寄存器名:地址表达式,段名:地址表达式 MOV AX,SI等价于MOV AX,DS:SI,默认从数据段中取数据。若改为MOV AX,ES:SI,则从附加数据段中取数据,2跨段前缀“:”,属性分离运算符可分离出变量

28、、标号的段、偏移地址及类型的属性值。其格式是:分离运算符 变量或标号,运算结果是一个数值常量,3.属性分离运算符,段属性分离运算符SEG。该运算符分离出其后变量或标号所在段的首地址 偏移属性分离运算符 OFFSET。该运算符分离出其后变量或标号的偏移地址 类型分离运算符 TYPE 该运算符取其后变量或标号的类型。如果是变量,其类型值由变量的类型确定,某一变量类型的类型值和该变量在内存中所占的字节数相同,取变量所含的数据存储单元个数运算符LENGTH,格式:LENGTH 变量。它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定,如果第一个表达式为重复子句“n DUP(表达式)”,

29、则取值为前面的重复因子n,如果为其他形式的表达式,则取值为1 取变量所含的数据存储区大小运算符SIZE,格式:SIZE 变量。它的取值为:LENGTH变量*TYPE 变量,也就是说,它的取值是一个变量所占内存的实际字节数,4.其他运算符,字节分离运算符HIGH和LOW格式:HIGH 常量或地址表达式;LOW 常量或地址表达式 其中,HIGH分离出其后常量或地址表达式的高8位,LOW分离出其后常量或地址表达式的低8位。汇编语言中的常用的运算符的优先级见表4-17。,4.2.4 顺序与分支程序的设计,顺序型结构程序的特征是在程序的指令中无转移指令,计算机从程序的第一条指令开始顺序执行,直到程序的最

30、后一条指令为止,例【4-29】在一个表中存放着0到9十个数字的立方值,编程从键盘输入0到9之间的任意一个数,查表找出这个数的立方值,4.2.4 顺序与分支程序的设计,有分支控制的程序结构称为分支型结构(或称选择结构)。分支型结构可分为二分支型结构和多分支型结构。在分支程序中,不同的条件往往是通过标志寄存器中条件标志的不同状态反映的。因此分支程序设计中一个至关重要的问题是根据各标志的不同状态选用合适的转移指令。转移指令分条件转移指令和无条件转移指令两大类,一、条件转移 语句格式:标号:操作符 短标号 功能:如果条件满足,则(IP)+位移量IP,4.2.4 顺序与分支程序的设计,在转移指令中,位移

31、量为当前(IP)到转移目的地址处的字节距离。如果当前(IP)到某标号(即转移的目的地址)的位移量在-128127之间,则该标号称为短标号。当位移量为正时,表示向前转;当位移量为负时,表示向后转,条件转移指令的目的地址均是短标号,条件转移指令共有18条,分成以下三类 1简单条件转移指令 共有10条,根据单个标志的状态决定是否转移 2.无符号数条件转移指令共有4条,根据多个标志的状态决定是否转移,这类指令将比较对象视为无符号数 3.带符号数条件转移指令 共有4条,根据多个标志的状态决定是否转移,这类指令将比较对象视为带符号数,4.2.4 顺序与分支程序的设计,二、无条件转移 无条件转移指令使CPU

32、无条件地转移到指令中指明的目的地址处执行,在程序中用它将各分支的出口重新汇集到一起构成多分支结构,特别是当条件转移指令的转移范围超过-128127个字节时,往往要借助无条件转移指令实现,4.2.4 顺序与分支程序的设计,无条件转移指令和要转移的目的地址可以在同一段,也可以在另一段。前者称为段内转移,后者称为段间转移。段内转移指令只改变指令指针IP的内容,而段间转移指令则要同时改变指令指针IP和代码段寄存器的内容。无条件转移指令可通过各种寻址方式得到要转移的目的地址,常用的有直接寻址和间接寻址两种,表4-18列出了无条件转移指令的格式和功能说明,无条件转移指令和条件转移指令有两点重要区别:一是前

33、者的转移是无条件的,不做任何判断便转向目的单元;二是前者的转移范围不受限制,而后者只能在-128127个字节范围内转移,4.2.4 顺序与分支程序的设计,例【4-30】编程实现符号函数,4.2.4 顺序与分支程序的设计,对于多路分支的程序,如果直接用条件转移指令实现,那么N路分支,就需要N-1条条件转移指令,程序显得冗长繁琐,可用跳转表来实现多路分支 例【4-31】对学生的成绩分类,分类标准见表4-19。下面的程序是由入口地址组成跳转表的多路分支程序,4.2.5 循环程序设计,循环型结构有REPEAT-UNTIL模式(见图4-8)和WHILE模式(见图4-9)。,4.2.5 循环程序设计,RE

34、PEAT-UNTIL和WHILE两种模式的共同点是都有初始化部分、工作部分、调整部分和控制部分。这四部分的作用是:初始化部分,又称循环的预置部分。在循环体工作之前,把工作变量(保存中间结果或最后结果)、控制变量(控制循环是否结束)、地址单元、工作寄存器等置初值,为循环做好准备,初始化工作可保征循环程序在正确的初始状态下工作 工作部分,这是整个循环程序的核心部分,它由需要重复操作的指令序列组成,工作部分随求解问题所采用的算法不同而异,调整部分,为了保证工作部分每次在新的意义下工作,每执行一次工作部分,必须对操作数或操作数地址进行修改,为下一次循环作准备,同时控制变量也作相应的调整,为控制部分的条

35、件判定作准备。例如利用计数来控制的循环,每循环一次,计数值都要调整(增加或减少),控制部分根据计数器的值来决定是否退出循环。通常的循环结构是调整和工作部分同步工作,工作部分和调整部分合在一起,统称为循环体。,控制部分:为了能在正确的时机退出循环,要有出口测试,控制部分是用来控制循环程序是继续执行还是终止。控制部分是对修改过的控制变量进行测试,若达到预定要求,则循环结束,否则循环继续执行。控制部分根据实际情况可分为计数控制(又分为正计数和倒计数)和条件控制两种,4.2.5 循环程序设计,REPEAT-UNTIL和WHILE两种模式的区别是,REPEAT-UNTIL模式是先执行循环体,再判断条件是

36、否成立,因此对于REPEAT-UNTIL模式不管条件是否成立循环体至少执行一次;WHILE模式是先判断条件是否成立再执行循环体,因此对于WHILE模式循环体可能一次也得不到执行,4.2.5 循环程序设计,例【4-32】已知有N个数据存放在以BUF为首地址的字节存储区中,编程统计其中负数的个数。,在本例中,用到了三个寄存器,这三个寄存器的功能分别是:AX:累加器,用来累加BUF中负数的个数,初值为0 BX:地址寄存器,用来指示BUF的地址,初值为BUF的首地址 CX:计数器,用计数方式控制循环何时结束,初值为BUF的长度N,4.2.5 循环程序设计,如何控制循环是循环程序设计中的一个重要环节,下

37、面介绍最常见的两种循环控制方法:计数控制和条件控制 一、计数控制 当循环次数已知时,通常使用计数控制,计数控制又有正计数和倒计数两种形式 倒计数 先将循环次数N送入循环计数器中,每循环1次,计数器减1,直到循环计数器中的内容为0时结束循环,下面以例【4-32】的代码段为例说明这个问题。LEA BX,BUFMOV CX,N;初始化部分MOV AX,0CYCLE:CMP BYTE PTRBX,0JGE NEXT;工作部分INC AXNEXT:INC BXDEC CX;修改部分 JNZ CYCLE;控制部分,4.2.5 循环程序设计,正计数 先将0送入循环计数器中,每循环1次,计数器加1,直到循环计

38、数器中的内容与循环次数N相等时结束循环 下面将例【4-32】的代码段改写为用CX进行正计数来说明这个问题,LEA BX,BUFMOV CX,0;初始化部分MOV AX,0CYCLE:CMP BYTE PTRBX,0JGE NEXT;工作部分INC AXNEXT:INC BXINC CX;修改部分CMP CX,N;控制部分JNZ CYCLE,4.2.5 循环程序设计,二、条件控制 有些情况下,循环次数无法事先确定,但它与问题中的某些条件有关,这些条件可以通过指令来测试,如果测试的结果满足循环条件,则继续循环,否则结束循环 例【4-33】编程统计AX中1的个数。【分析】每次判断AX的最低位,如果最

39、低位为1则BL加1;否则BL不加1。然后AX逻辑右移1位,左边补0,在某一时刻AX必然为0。因此,可以将AX是否为0作为条件控制循环,4.2.6 子程序设计,子程序设计是使程序模块化的一种重要手段。当设计一个比较复杂的程序时,将程序划分为若干个相对独立的模块,确定各模块的入口及出口参数,为各模块分配不同的名字,对每一个模块编制独立的程序段(即子程序),最后将这些子程序根据调用关系连成一个整体。这样既便于分工合作,又可避免重复劳动,节省存储空间,提高程序设计的效率和质量,使程序简洁、清晰、易读,便于修改和扩充,4.2.6 子程序设计,一、定义子程序,子程序的定义格式是:子程序名 PROC NEA

40、R/FAR 子程序名 ENDP 子程序也称为过程,PROC、ENDP是定义子程序时必须使用的保留字,PROC和ENDP相当于一对括号,将子程序的指令包括在内。如果主程序和子程序位于同一代码段,则称为段内调用,此时在PROC后可加NEAR说明此子程序是近过程。如果主程序和子程序不在同一代码段,则称为段间调用,此时在PROC后可加FAR说明此子程序是远过程。如果NEAR和FAR都不写,系统默认该子程序是近过程,4.2.6 子程序设计,二、子程序的调用和返回 为了实现子程序的调用和返回,可使用子程序调用指令CALL和返回指令RET 1子程序调用指令CALL 子程序调用指令CALL的格式是:CALL

41、OPD。根据OPD寻址方式的不同,又分为直接调用和间接调用。因此,子程序调用指令CALL共有4种组合,见表4-21,4.2.6 子程序设计,对于段间间接调用,需要双字单元存放子程序的入口地址信息,第一个字单元中放子程序入口的偏移地址,第二个字单元中放子程序所在段的段首址,见表4-22,2返回指令RET RET指令通常作为子程序的最后一条指令,用来控制CPU返回到主程序的断点处继续向下执行,RET指令的语句格式及功能见表4-23,4.2.6 子程序设计,无论是段内返回还是段间返回,当RET指令执行后,主程序的断点地址信息已送回到IP、CS中,堆栈恢复了转子前的状态 RET指令的另一种格式是:RE

42、T N,其中N是偶数。该指令用来废除栈顶N个无用的参数。其操作是在正常RET操作之后再做SP+NSP,4.2.6 子程序设计,三、调用子程序前后怎样保存和恢复寄存器 如果在子程序中要用到某些寄存器(或存储单元),就会破坏这些寄存器(或存储单元)在转子前原有的内容。当执行完子程序返回断点继续执行主程序时,只能以被破坏的现场为背景进行工作,这显然是不对的。因此,必须考虑现场的保存和恢复。一般情况下,在子程序的开始安排一些保存现场的指令,在子程序的返回指令之前再恢复现场。例如,若子程序SUBP中改变了寄存器AX、BX、CX的内容,则在子程序的开始处将这些寄存器的内容入栈保存,在子程序的返回指令之前用

43、出栈指令依次恢复,具体实现方法如下:,4.2.6 子程序设计,四、主程序和子程序间的参数传递 主程序在调用子程序之前,必须把需要子程序处理的原始数据传递给子程序,即为子程序准备入口参数。子程序对入口参数进行一系列处理之后得到处理结果,该结果必须送给调用它的主程序,即提供出口参数以便主程序使用。这种主程序为子程序准备入口参数、子程序为主程序提供处理结果的过程称为主程序和子程序间的参数传递。常用的参数传递方法有寄存器法、约定单元法和堆栈法三种,本节主要讲解前两种方法,1寄存器法 寄存器法就是子程序的入口参数和出口参数都在约定的寄存器中。此法的优点是参数传递快,编程也较方便,且节省内存单元。但由于寄

44、存器个数有限,而且在处理过程中要经常使用寄存器,如果要传递的参数很多,将导致无空闲寄存器供编写程序使用。所以寄存器法只适用于要传递参数较少的情况,4.2.6 子程序设计,例【4-34】寄存器法参数传递举例,编写子程序求两个数的最大公约数【分析】X和Y中放着两个整数,在主程序中分别用寄存器AX和BX将这两个整数传递给计算这两个整数最大公约数的子程序GCDP,子程序GCDP将计算结果用寄存器AX传回主程序,存放在GCD中。这道题的核心是求两个整数最大公约数的子程序GCDP,它用的是辗转相减法。当两个整数不相等时用大数减去小数,直到两个数相等为止。假定X、Y的值分别为32、24,处理过程见表4-24

45、,4.2.6 子程序设计,2约定单元法 约定单元法是把入口参数和出口参数都在约定的存储单元中。此法的优点是每个子程序要处理的数据或送出的结果都有独立的存储单元,编写程序时不易出错。缺点是要占用一定数量的存储单元,例【4-35】用约定单元法重写例【4-34】,求两个整数最大公约数和最小公倍数【分析】数据段的变量X、Y、GCD、LCM是约定的存储单元,这些存储单元主、子程序都可使用。参数存放在X、Y中可由GCDP子程序使用,子程序处理结束后将结果存入GCD,主程序计算最小公倍数送LCM,计算X、Y最小公倍数的方法是:LCM=(X*Y)/GCD,4.2.6 子程序设计,子程序也可以不带参数,只是完成

46、某种功能。下面的程序是在屏幕上输出一个空行。NEWLINE PROCPUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21H,MOV DL,0AHINT 21HPOP DXPOP AXRET NEWLINE ENDP,4.2.7 常用的DOS和BIOS调用,我们在编制汇编源程序时,常常希望能从键盘输入字符或在显示器上显示出程序运行的结果。但由于计算机机种的不同、外设型号的差异,控制它们工作的程序也会有差异。如果每次都需要我们根据自己的工作环境来设计控制这些外设工作的程序,则必须要先搞清楚与之有关的设备、电路、接口等各方面的问题,既复杂,效率又低,也没有通用性,正确的做法是

47、:把这些控制过程编写成程序,作为操作系统的一部分事先放在系统盘上,用户在需要时只要按规定的格式设置好参数,直接调用即可。这种方式叫做利用操作系统的标准功能调用进行输入/输出。这样既便于操作系统对外设进行统一管理,也便于用户在编制程序时,不用考虑输入/输出的控制细节,提高了工作效率,使编制出来的程序更具有通用性,4.2.7 常用的DOS和BIOS调用,DOS提供了系统功能调用,编号从057H,主要分为设备管理、文件管理、目录管理、及其它功能调用四大类 在微机的只读存储器ROM中的程序,一部分是BASIC语言解释程序,另一部分是基本输入/输出系统BIOS。BIOS的主要功能是驱动系统中所配置的常用

48、外设,如显示器、键盘、打印机、磁盘驱动器以及异步通信接口等,使程序员不必过多地关心这些设备具体的物理特性和逻辑结构细节(如外设寄存器地址、命令及状态格式等),从而能方便地控制各种输入/输出操作。与DOS的设备管理系统功能调用相比,使用BIOS能完成更复杂的输入/输出操作 表4-25中列出了最常用的DOS和BIOS调用,更详细的内容要查阅有关的资料,4.3.1 80286相对8086增加的指令 1.立即数入栈指令 格式:PUSH nnnn,功能:将字立即数nnnn压入堆栈 2将所有寄存器的内容压入堆栈指令 格式:PUSHA,功能:将8个16位通用寄存器的内容按AX、CX、DX、BX、SP、BP、

49、SI、DI的顺序入栈。,4.3 32位微处理器的寻址方式与指令系统,格式:POPA,功能:将从栈顶开始的8个存储字依次弹出堆栈并按DI、SI、BP、SP、BX、DX、CX、AX的顺序分别传送。4扩充的带符号整数乘法指令 格式1:IMUL OPD,OPS 格式2:IMUL OPD,OPS1,OPS2 其中,OPD是16位通用寄存器,格式1中的OPS可以是16位通用寄存器、字存储器、8或16位立即数;格式2中的OPS1可以是16位通用寄存器、字存储器,但不能为立即数;格式2中的OPS2只能为8或16位立即数,3弹出堆栈指令,功能:格式1是OPD乘以OPS,将乘积送OPD;格式2将OPS1乘以OPS

50、2,乘积送OPD 5串输入指令 格式1:REPINS 目标串,DX 格式2:REPINSB 格式3:REPINSW,功能:以DX中的值为外设端口地址,从此端口输入一字符存入由ES:DI(或EDI)所指的存储器中,且根据方向标志DF和串操作的类型来修改DI(或EDI)的值,利用REP前缀可以连续输入串字符存入存储器中,直到CX(或ECX)减到零为止 其中,格式1中的目标串为目标操作数的符号地址,该符号地址确定了目标操作数的属性(字或字节),DX寄存器中的内容为外设端口地址。当符号地址的属性为字节时,则该指令每次读入一个字节,DI内容加1或减1;当符号地址的属性为字时,则该指令每次读入一个字,DI

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号