微机原理课件第四章汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:5975778 上传时间:2023-09-10 格式:PPT 页数:122 大小:1.07MB
返回 下载 相关 举报
微机原理课件第四章汇编语言程序设计.ppt_第1页
第1页 / 共122页
微机原理课件第四章汇编语言程序设计.ppt_第2页
第2页 / 共122页
微机原理课件第四章汇编语言程序设计.ppt_第3页
第3页 / 共122页
微机原理课件第四章汇编语言程序设计.ppt_第4页
第4页 / 共122页
微机原理课件第四章汇编语言程序设计.ppt_第5页
第5页 / 共122页
点击查看更多>>
资源描述

《微机原理课件第四章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理课件第四章汇编语言程序设计.ppt(122页珍藏版)》请在三一办公上搜索。

1、1,微型计算机原理及其应用第四章:汇编语言程序设计,2,第四章 汇编语言程序设计,汇编语言程序格式伪指令语句DOS系统功能调用和BIOS中断调用程序设计方法,3,汇编语言是利用指令的助记符、符号地址、标号来编写的语言。用汇编语言编写的程序称为汇编语言源程序;把汇编语言源程序翻译成由机器代码组成的目标程序的过程称为汇编;用来把汇编语言源程序自动翻译成目标程序的软件叫汇编程序。,4,计算机语言可分为机器语言、汇编语言、高级语言三类。机器语言是计算机唯一能识别的语言(二进制语言)汇编语言是面向机器的语言,不同的CPU有不同的汇编语言(PC机汇编、单片机汇编)优点:直接针对硬件操作,效率高,节省内存,

2、运行速度快,实时性能好。高级语言是面向过程的语言:如Basic、c、Pascal目前流行的面向对象的语言:VB、VC、C#8086系统中常用的汇编程序:宏汇编程序MASM,5,【例】显示输出“This is a sample program.”DATA SEGMENT;数据段DA1 DB This is a sample program.DB 0DH,0AH,;回车符和换行符的ASCII码DATA ENDS STACK SEGMENT STACK STACK;堆栈段 ST1 DB 100 DUP(?);定义100个空的字节单元STACK ENDSCODE SEGMENT;代码段 ASSUME

3、CS:CODE,DS:DATA,SS:STACK;段分配MAIN PROC FAR;主过程开始START:MOV AX,STACK;初始化SS MOV SS,AX,6,PUSH DS;为返回DOS设置堆栈 MOV AX,0 PUSH AX MOV AX,DATA;初始化DS MOV DS,AX MOV AH,9;9号调用,显示字符串,以结束 MOV DX,OFFSET DA1 INT 21H RET;返回DOSMAIN ENDP;主过程结束CODE ENDS;代码段结束 END START;源程序结束,7,【例】显示输出“Hello!”DATA SEGMENT;数据段STRING DB Hel

4、lo!,DATA ENDS CODE SEGMENT;代码段 ASSUME CS:CODE,DS:DATA;段分配START:MOV AX,DATA;初始化DS MOV DS,AX MOV AH,9;9号调用,显示字符串,以结束 MOV DX,OFFSET STRING INT 21H MOV AH,4CH;返回DOS INT 21HCODE ENDS;代码段结束 END START;源程序结束,8,由例程看出:(1)8086汇编源程序具有分段结构 段名 SEGMENT 段名 ENDS 在源程序中各段的顺序可以任意,段的数目可根据需要确定(至少有一个代码段),原则上不受限制。而每个段又是由若干

5、语句组成,语句是汇编语言源程序的基础。(2)CS不能人为设置,其它段寄存器的初始化需两条指令完成(MOV AX,DATA MOV DS,AX)。,9,(3)两种返回DOS的方法:MAIN PROC FAR;将主程序建立为过程 PUSH DS;将DOS段值和偏移量(0)入栈 MOV AX,0 PUSH AX RET;返回DOS(将0和DOS段值IP、CS)MAIN ENDP;主过程结束使用4CH号的DOS系统功能调用 MOV AX,4C00H(或MOV AH,4CH)INT 21H(4)全部源程序用END伪指令结束。,10,MASM中可使用的语句分成两类:指令性语句和伪指令语句。一、指令性语句特

6、点:与机器指令相对应,汇编时产生目标代码。标号:指令助记符 操作数,操作数;注释标号:表示本指令语句的符号地址,后跟冒号“:”,用作转移的目标地址;指令助记符:指出指令的操作类型,由英文字母缩写而成;操作数:指明参加指令运算的数据,有无操作数、单操作数和双操作数之分,其中双操作数之间用逗号“,”分隔,操作数与指令助记符之间用空格隔开;注释:用来说明一条指令或一段程序的功能,前面以分号“;”为标记,汇编程序对注释不进行汇编,增加可读性其中指令助记符是关键字,不可省略,其余部分均可省略。,4-1 汇编语言程序格式,11,二、伪指令语句特点:没有对应的机器指令(本身不产生目标代码),只为汇编程序提供

7、汇编信息。格式:名字 伪指令指示符 操作数,操作数;注释名字:给伪指令取的名称,用符号地址表示,名字后不带冒号“:”,只用空格符与伪指令指示符相分隔;伪指令指示符:是MASM规定的符号,明确不同的操作;操作数:规定同指令性语句,区别在于操作数可能多于2个;注释:规定同指令性语句其中不可省略的部分是伪指令指示符,其余均可缺省。三、数据项操作数的三种基本数据项:常数、变量、标号,12,常量:固定值,不能改变 a.数字常数:字母后缀B、Q(或O)、D可省略、H b.字符串常数:ABCASCII码字节序列41H、42H、43H c.符号常数:COUNT EQU 100变量:某操作数据所存放单元的符号地

8、址,在CS以外的其它段由DB、DW等定义标号:某条指令所存放单元的符号地址,在CS中定义变量和标号均具有三种属性:a.段值(SEGMENT):可用分析运算SEG取出b.段内偏移地址(OFFSET):可用分析运算OFFSET取出c.类型(TYPE):可用分析运算TYPE取出 变量:每个元素所包含的字节数,有BYTE、WORD和DWORD三种类型。标号:可转移的距离(或距离属性),有NEAR和FAR两种。,13,四、MASM中的表达式表达式由运算对象和运算符组成,在汇编过程中完成表达式运算。其中运算对象可以是常数、变量、标号、寄存器等。1.算术运算符(运算对象和运算结果均为整数)包括:+、-等,常

9、用于地址运算。注:两符号地址相减表示某符号地址占用的内存字节数。【例】ARRAY DB 1,2,3,4,5,6,7,8 TRY DB 20 MOV CX,TRY-ARRAY 汇编后:MOV CX,8,14,2.逻辑运算符(按位运算)包括:AND、OR、NOT、XOR例:AND AL,8FH AND 73H 运算符,汇编过程中完成 指令助记符,程序执行时完成。3.关系运算符包括:EQ、NE(不等)、LT(小于)、GT(大于)、LE()、GE()a.结果为真,输出全1(字节运算为OFFH或字运算为OFFFFH)b.结果为假,输出全0【例】MOV AX,10H GE 16汇编后:MOV AX,0FF

10、FFH,15,4.数值返回运算符(或分析运算符)功能:返回运算对象的某个参数值。包括:SEG、OFFSET、TYPE、LENGTH、SIZESEG 变量或标号;取段基址 常用法:MOV AX,SEG M1(或用段名)MOV DS,AXOFFSET 变量/标号;取偏移地址值 常用法:MOV BX,OFFSET DA1;设地址指针 LEA BX,DA1TYPE 变量/标号;取类型属性 变量返回1(DB)、2(DW)、4(DD)等 标号返回-1(NEAR)、-2(FAR)(0FFH)(0FEH),16,DATASEGMENT;定义数据段VAR1 DB 10H,18H,25H,34H;定义字节数据VA

11、R2 DW 2300H,1200H;定义字数据VAR3 DD 11002200H,33004400H;定义双字数据DATAENDS;数据段结束设DATA段起始于物理地址30000H处,则MOV BX,SEG VAR1 汇编成:MOV BX,3000HMOV CX,SEG VAR2 汇编成:MOV CX,3000HMOV DX,SEG VAR3 汇编成:MOV DX,3000HMOV BX,OFFSET VAR1 汇编成:MOV BX,0000HMOV CX,OFFSET VAR2 汇编成:MOV CX,0004HMOV DX,OFFSET VAR3 汇编成:MOV DX,0008H,17,【例

12、】A1 DB 20H,30H A2 DW 0438H A3 DD?L1:MOV AH,TYPE A1 MOV BH,TYPE A2 MOV AL,TYPE A3 MOV BL,TYPE L1汇编后:MOV AH,1 MOV BH,2 MOV AL,4 MOV BL,0FFH,18,LENGTH 变量;返回重复操作符DUP之前的重复次数,若不是由DUP定义,则都返回1。SIZE 变量;返回该变量包含的总字节数。SIZE=LENGTH*TYPE注:SEG、OFFSET、TYPE可用于变量和标号前,返回三种属性值;而LENGTH和SIZE只对变量才有效。【例】M1 DW 100 DUP(?)M2 D

13、W 1,2,3 M3 DB A B C D MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV AL,LENGTH M3,19,汇编后:MOV CX,100 MOV BL,1 MOV AL,1 若指令改为:MOV CX,SIZE M1 MOV BL,SIZE M2 MOV AL,SIZE M3 则汇编后:MOV CX,200 MOV BL,2 MOV AL,1,20,5.修改属性运算符(综合运算符)功能:修改变量/标号的三种属性段操作符:修改段基址与偏移地址来源的默认关系,格式如下:段前缀:变量或地址表达式例:MOV AX,ES:BXPTR:对变量/标号赋予新的属性,以

14、保证操作数类型的匹配,常与BYTE、WORD、NEAR、FAR等连用。格式:新类型 PTR 变量/标号例:MOV BX,10H;汇编时提示错误 MOV BYTE PTRBX,10H;BX10H MOV WORD PTRBX,10H;BX,BX+10010H,21,例:N1 DB 15H,36H N2 DW 1122H,3344H MOV AX,WORD PTR N1 执行后:AX=3615H MOV BL,BYTE PTR N2 执行后:BL=22H MOV AX,WORD PTR N1+1 执行后:AX=2236H注:若符号地址出现在操作数中,其类型为DB、DW所定义的类型(如直接寻址、寄存

15、器相对寻址、相对基址变址寻址),如类型不匹配汇编时提示Warning Error:Operand types must match 或 Illegal size for operand;若存储器操作数中不包含符号地址(如寄存器间接寻址等),则该操作数的类型不确定,指令中的另一操作数必须明确类型,否则汇编时提示Severe Error:Operand must have size.例:LEA BX,N1之后CMP BX,10H 或 INC BX均出错。,22,THIS:对变量/标号赋予新的属性,且该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。格式:变量/标号 EQU THIS 类型

16、例:FIRST EQU THIS BYTE TABLE DW 200 DUP(?)TABLE为字类型,FIRST为字节类型,两者地址相同。(该数据区具有双重类型属性)MOV AL,FIRST MOV AX,TABLE 均正确。SHORT:说明转向地址为短转移(8位位移量)格式:SHORT 标号例:JMP SHORT LP MOV-128+127之间LP:MOV,23,6.其它运算符 方括号 a.表示地址表达式例:M1 DB 10H,20H,30H,40H M2 DW 1234H,5678H,9ABCH MOV BX,OFFSET M1 MOV CL,BX;10HCL MOV BX,OFFSET

17、 M2 MOV DX,BX+2;M2的第二个单元5678HDX b.表示多重变量的下标值(下标从0开始算)例:MOV CX,M20;1234HCX MOV M21,CX;CXM2的第二个单元,覆盖5678H,24,4-2 伪指令语句,特点:无对应的机器代码,在汇编期间进行处理(不是由CPU执行)(为汇编程序提供汇编信息)一、数据定义语句功能:为一个数据项分配存储单元,用一个符号名与这个存储单元相联系,且为此存储单元提供任意初始值。例:ARRAY DB 1,2,4 则ARRAY记为第一个字节的偏移地址该伪指令助记符有:DB 定义字节 DW 定义字 DD 定义双字,25,1、操作数是常数或表达式,

18、可以为数据或地址 DA DW 1122H,34H,5*20H2、操作数为字符串,字符串必须用单引号括起来 STR1 DB OK STR2 DW OK注:字符串一般用DB定义,有时2个字符可用DW定义3、可用?保留空单元(分配内存单元但不初始化)M1 DB?M2 DW 1234H,?4、用重复操作符DUP初始化重复数据格式:DB(或DW)重复次数 DUP(重复内容)注:DUP可嵌套 ARR DW 3 DUP(1,2 DUP(0),2);变量共占?个字节单元,24,26,二、表达式赋值语句(不占用内存)1、赋值语句 EQU格式:符号名 EQU 表达式(表达式应有确定值)COUNT EQU 100E

19、QU左边的名字等价于右边的表达式2、等号语句=COUNT=100与EQU语句具有相同功能。区别:EQU中的符号名不允许重复定义,应先用PURGE语句解除,而“=”伪指令可以。例:C1 EQU 100 PURGE C1;C1不再代表100 C1 EQU 200,27,三、段定义语句1、段定义语句 SEGMENTENDSSEGMENT和ENDS必须成对使用,将源程序分段。段名 SEGMENT 定位类型 组合类型 分类名 段名 ENDS在SEGMENT和ENDS之间,对于数据段、附加段和堆栈段中,一般是一些伪指令;而对于代码段,主要是指令序列和伪指令。,28,(1)定位类型:对段起始地址定位此参数一

20、般缺省,缺省值为PARA,表示段起始地址必须在节的整数边界(存储空间从0开始,每16个存储单元叫一节)。(2)组合类型:提出各个逻辑之间的组合方式此参数在堆栈段中不可缺省,用STACK指定该段为堆栈段。而在其它段中一般缺省,缺省值为NONE,表示该段与其它同名段不进行连接,各段独立存在于存储器中。(3)分类名此参数一般缺省,主要作用是汇编程序连续时将所有分类名相同的逻辑段组成一个段组。,29,2、段分配语句(ASSUME)ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRA该语句不可省略,一般放在代码段的开始。用来建立4个段寄存器(CS、DS、ES、SS)与程序中所

21、取段名(位于SEGMENT和ENDS之前)之间的对应关系。但ASSUME语句只指定某个段分配给哪个段寄存器,它并不能把段基址装入段寄存器中,故DS、ES、SS的具体值还必须分别通过两条MOV指令得到(如初始化SS,还应加上SP的初始化),但CS的赋值是在程序初始化时自动完成的。,30,总结:分段程序的两种完整段定义格式(1)DATA SEGMENT;数据段 DATA ENDS STACK SEGMENT STACK;堆栈段 STT DW 100 DUP(?)TOP EQU SIZE STT STACK ENDS CODE SEGMENT;代码段 ASSUME CS:CODE,DS:DATA,S

22、S:STACK;段分配 MAIN PROC FAR;主过程 START:MOV AX,STACK;初始化SS和SP MOV SS,AX MOV SP,TOP,DW 100 DUP(?)TOP EQU$,31,PUSH DS;为返回DOS设置堆栈 MOV AX,0;(XOR AX,AX),(AND AX,0);(SUB AX,AX)PUSH AX MOV AX,DATA;初始化DS MOV DS,AX RET;返回DOSMAIN ENDPCODE ENDS END START,32,(2)前面两个段相同 CODE SEGMENT ASSUME START:段寄存器及SP初始化 MOV AH,4C

23、H;利用4CH号DOS系统 INT 21H;功能调用返回DOS CODE ENDS END START,33,例:两个16位无符号二进制数相乘。DATA SEGMENTD1 DW 1234HD2 DW 5678HP1 DD?P2 DD?DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP(?)TOP EQU SIZE STT STACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA,34,START:MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,AXL

24、1:MOV AX,D1 MUL D2 MOV BX,OFFSET P1 MOV BX,AX MOV BX+2,DX MOV AH,4CH INT 21HCODE ENDS END START,35,四、过程定义语句(子程序定义语句)格式:过程名 PROC NEAR或FAR RET 过程名 ENDPa.每定义一个过程,PROC和ENDP要成对出现,两者前面的过程名应一致。b.主、子程序在同一代码段中,则定义为NEAR型(或缺省)主、子程序不在同一代码段中,则定义为FAR型;一般可将主程序定义为FAR属性(主过程作为DOS调用的一个远端子过程)c.要调用一个过程,在主调函数中用CALL 过程名,而

25、过程返回必须通过RET语句。,36,例:用过程调用的方法,将内存中4个BCD码相加。DATA SEGMENTONE DB 22H,33H,44H,55HTWO DB 55H,66H,77H,88HSUM DB 20 DUP(?)DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP(?)TOP EQU SIZE STTSTACK ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATASTART:MOV AX,STACK MOV SS,AX MOV SP,TOP,37,MOV AX,DATA MOV DS,A

26、X MOV ES,AX MOV SI,OFFSET ONE;设置地址指针 MOV BX,OFFSET TWO MOV DI,OFFSET SUM CLD;清方向标志 CLC;清进位标志 MOV CX,4;循环次数LL:CALL ABC LOOP LL MOV AH,4CH INT 21H,38,ABC PROC NEAR;完成单字节数据加法运算 LODSB;DS:SIAL,SI+1SIL1:ADC AL,BX;带进位相加 DAA;十进制调整 STOSB;ALES:DI,DI+1DI INC BX;修改指针 RETABC ENDPCODE ENDS END START,39,五、程序开始和结束语

27、句1.NAME:为源程序目标模块赋名字格式:NAME 程序名一般放在程序开始,列表文件将打印此程序名,如缺省NAME语句,汇编程序将源文件名作目标模块的名字。2.ORG:定位伪指令格式:ORG 表达式(值为065535)功能:表示下面存储单元的偏移地址从表达式的值开始排。即程序和数据要从某一个特定的地址开始存放。注:一般,段内的EA是从段名SEGMENT以下,以0作为开始,以后每分配一个字节,EA加1。若要给某变量或标号设置特定的起始偏移地址,可用ORG语句。,40,例:DATA SEGMENT ORG 100H A1 DB 10H,20H,30H ORG 200H A2 DB 40H,50H

28、,60H DATA ENDS3.END:源程序结束语句格式:END 标号:标号为程序中第一条指令的起始地址,可以缺省。放在源程序最后一行,告诉汇编程序,源程序到此结束,此后的内容将被认为不属于本程序的范畴。,41,汇编语言中经常地址计数器的值。(P150)注:地址计数器用来保存当前指令或数据的偏移地址。其值可用“”来引用,“”的值是动态变化的。常用于堆栈段的长度定义,以便于设置堆栈指针。例:ORG 1000H ABC DW 1,2,+4,ODH,OAH,+3设定ABC的偏移地址为1000H,则第一个“”代表1004H,而第二个“”代表100AH。上述语句等价于 ABC DW 1,2,1008H

29、,ODH,OAH,100DH例:STACK SEGMENT DW 100 DUP(?)TOP EQU STACK ENDS MOV SP,TOP;代码段中初始化堆栈指针SP,42,六、高档微机增加的伪指令1、常用伪指令(1).386 选择80386指令系统(2).EXIT 返回DOS(3).MODEL 选择编程模型(4).STARTUP 指示程序的开始(包括段寄存器初始化)2、汇编语言的两种编程格式完整的段定义模型常用模型SMALL,包含两个段:64KB的代码段和64KB的数据段。,43,例:将存储块LIST1中100个字节的内容复制到存储块LIST2中。.MODEL SMALL;小模型.38

30、6;选择80386指令系统.STACK 100H;定义堆栈段.DATA;定义数据段LIST1 DB 100 DUP(?)LIST2 DB 100 DUP(?).CODE;定义代码段.STARTUP;说明程序的起点,初始化DS、SSCLDMOV SI,OFFSET LIST1MOV DI,OFFSET LIST2MOV CX,100REP MOVSB.EXIT 0;返回DOS(返回0,表示无错误)END,44,操作系统(OS)包括DOS、WINDOWS、UNIX等。操作系统是用户和PC机之间的接口,用户依靠操作系统来使用PC机。DOS系统设置了两层内部子程序(供用户使用)基本输入输出系统BIOS

31、(OS的核心)主要功能:驱动系统所配置的外部设备采用BIOS功能调用(INT 10HINT 1AH)DOS层的功能模块(DOS系统功能调用)主要功能:文件管理、存储管理、作业管理、设备管理等原理:通过BIOS使用外部设备,但功能较BIOS弱。(INT 21H)一、DOS系统功能调用简述按功能分为六组:1.字符I/O管理 2.传统的文件管理(磁盘)3.扩充的文件管理(目录、文件)4.内存管理(内存)5.作业管理(终止、装入等)6.其它资源管理(日期、时间等),4-3 DOS系统功能调用和BIOS中断调用,45,二、DOS系统功能调用(88种功能,系统功能号00H57H)调用格式分四步:系统功能号

32、AH置入口参数执行中断指令INT 21H分析出口参数。三、常用的DOS系统功能调用1.01H号调用:读取键盘单字符并回显调用方式:MOV AH,1 INT 21H注:无入口参数 出口参数:所按键字符对应的ASC码AL,46,【例】交互式程序中用户按下1,2,3,程序转入相应的服务子程序,若按下其它键就继续等待。KEY:MOV AH,1;读入键值AL INT 21H CMP AL,1;按下数字键1?JE ONE CMP AL,2;按下数字键2?JE TWO CMP AL,3;按下数字键3?JE THREE JMP KEY;等待键入正确数字ONE:TWO:THREE:,47,2.02H调用:显示单

33、字符调用方式:MOV DL,待显示字符的ASC码 MOV AH,2 INT 21H 注:出口参数是把字符显示在屏幕上。3.09H号调用(字符串输出显示)调用方式:DS:DX待显示字符串的首地址 MOV AH,9 INT 21H注:待显示字符串必须以“”字符结束,且“”不显示,只作为结束标志。,48,【例】在屏幕上显示HOW ARE YOU!,且光标换行。CR EQU 0DH;回车符ASCII码 LF EQU 0AH;换行符ASCII码 MES DB HOW ARE YOU!,CR,LF,$MOV DX,OFFSET MES MOV AH,9 INT 21H4.OAH号调用(字符串输入)调用方式

34、:DS:DX接收字符的输入缓冲区首地址 MOV AH,OAH INT 21H注:a.直到回车符结束,49,b.缓冲区第一个字节为此区能接收字符的个数;第二个字节保留(用“?”初始化),用作填写实际字符个数;从第三个字节开始顺序存放键盘输入的字符。c.如实际输入字符数定义的字节数,缓冲区其余字节补零。【例】开辟一个缓冲区接收从键盘输入的字符串,将输入的字符数存入CL寄存器,并将指针指向第一个字符。BUFF DB 100;缓冲区大小 DB?;实际输入字符数 DB 100 DUP(?);顺序存放输入字符 MOV DX,OFFSET BUFF MOV AH,0AH INT 21H MOV BX,DX

35、MOV CL,BX+1;取字符数 ADD BX,2;指针指向第一个字符5.4CH号调用:返回操作系统调用方式:MOV AH,4CH INT 21H注:无入口参数,50,4-4 程序设计方法,汇编语言设计基本要求:结构化、简明、易读、易调试执行速度快占用的存储空间少 在结构化程序设计中,提倡采用的基本结构形式是:顺序结构、分支结构、循环结构、子程序结构。一、顺序结构一般为简单程序,由上而下顺序执行每条指令无分支,无循环,无转移,又称为直线程序顺序程序结构是各种其它程序结构中的局部程序段,51,【例】内存中TABLE开始存放09的平方值,通过人机对话,当任意输入09,查表得出平方值,放在AL中。.

36、MODEL SMALL.386.STACK 100H.DATATABLE DB 0,1,4,9,16,25,36,49,64,81BUF DB Input one number(09),ODH,0AH,$.CODE.STARTUPLEA DX,BUF;显示提示字符串MOV AH,9INT 21H,52,MOV AH,1;等待键入INT 21HAND AL,0FH;屏蔽AL高4位,低4位不变MOV BX,OFFSET TABLEMOV AH,0ADD BX,AXMOV AL,BX.EXIT 0END,XLAT TABLE,53,二、分支结构分支结构有两种形式:双分支结构和多分支结构,条件?,分支

37、程序段1,分支程序段2,Y,N,条件?,程序段1,程序段n,程序段2,条件1,条件2,条件n,图a:双分支,图b:多分支,54,1、双分支结构双分支结构一般由四个部分组成:产生条件:用于比较、判断的指令CMP、SUB、TEST、AND、CMPSB/W、SCASB/W、移位指令(如判AX中有多少个“1”)等只要能影响PSW中的一个或多个标志。测试:条件转移指令JC、JA、JG等定向:根据条件,决定程序的不同走向(条件满足或不满足,程序转移或不转移即顺序执行)标号:用来指定分支后的转移地址。应注意统一出口:某个分支结束后用JMP指令跳过另一分支。2、多分支结构一次判断可引出两个分支,故N个分支,需

38、N-1次判断。按条件的先后,依次分解成一串双分支结构,然后使用双分支的方法进行程序设计。实质是用一连串的条件转移指令来实现。,55,【例】存储器中有一串字符串首址为BUF,字符串长度N小于256,要求分别计算出其中数字、大写字母和其它字符的个数,存放在字符串的下面三个单元中。解:本题根据字符的ASCII码值范围进行判断,大写字母 41H5AH,数字30H39H。.MODEL SMALL.386.STACK 100H.DATA BUF DB 7 DB 01H,38H,47H,90H,33H,09H,76H NUM DB 3 DUP(?).CODE.STARTUP,56,MOV CH,BUF;数组

39、个数CH MOV BX,1 MOV DX,0;DH计数字个数,DL计字母个数LP:MOV AH,BUFBX;第一次取01HAH CMP AH,30H JL NEXT;小于0转(用JB最佳)CMP AH,39H JG ABC;大于9转(用JA最佳)INC DH;数字个数+1 JMP NEXTABC:CMP AH,41H JL NEXT;小于A 转 CMP AH,5AH JG NEXT;大于Z转 INC DL;字母个数+1,57,NEXT:INC BX;数组地址+1 DEC CH;计数-1 JNZ LP;不为0跳转继续 MOV NUM,DH;数字个数送入内存单元 MOV NUM+1,DL;字母个数

40、送入内存单元 MOV AH,BUF SUB AH,DH;计算其它字符个数 SUB AH,DL MOV NUM+2,AH;其它字符个数送入内存单元.EXIT 0END,58,【例】设有首地址为BUFFER的数据,已按升序排好,字组的长度N(=10),在该数组中查找数M(=80),若找到它则从数组中删掉,若找不到将它插入正确的排列位置,DX中记录数组最后的长度。DATA SEGMENTBUFFER DW 5,10,32,47,53,77,89,106,115,124N DW 10M EQU 80DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA

41、MAIN PROC FARSTART:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX,59,MOV AX,M;待查数AX MOV CX,N;计数CX MOV DX,N;数组长度 MOV DI,OFFSET BUFFER CLDREPNE SCASW;串扫描查找 JE DEL;找到ZF=1 DEC DX;未查到,此数插入正确位置 MOV SI,DX;定位到BUFFER最后一个数 ADD SI,DXL1:CMP AX,BUFFERSI;关键字从后向前比较 JL L2;关键字比数组中某个字小 MOV BUFFERSI+2,AX;否则

42、插在后面 JMP L3,60,L2:MOV BX,BUFFERSI;数组后移一个数 MOV BUFFERSI+2,BX SUB SI,2;指针前移一个数 JMP L1L3:ADD DX,2;修改长度 JMP NEXT1DEL:JCXZ NEXT;找到,且为最后一个数,删此元素DEL1:MOV BX,DI;其后元素依次前移 MOV DI-2,BX ADD DI,2 LOOP DEL1NEXT:DEC DX;改变数组长度NEXT1:RETMAIN ENDPCODE ENDS END START,61,三、循环结构1.循环结构有两种结构形式a.“先执行,后判断”结构(直到型):至少执行一次循环体(不

43、允许零次循环);适合于循环次数固定的程序b.“先判断,后执行”结构(当型):循环体可能一次也不执行(允许零次循环);适合于循环次数不固定的程序,62,入口,入口,初始化部分,初始化部分,循环体,修改参数,循环控制,出口,循环控制,循环体,修改参数,”先执行,后判断“结构,”先判断,后执行“结构,63,循环结构包括四部分:(1)初始化:为循环做准备,建立指针,设置循环计数器,设置其它变量的初值(2)循环体:循环部分的核心,完成循环的基本操作(3)修改参数:修改地址指针,为下次循环作准备(4)循环控制:修改计数器值,判断循环控制条件,决定是否继续循环,64,2.循环程序的控制方法 核心问题:循环的

44、控制(1)计数控制法(已知循环次数)正计数法:计数器初值为0,递增,与终值比较倒计数法:计数器初值设为循环次数,递减,直到减为0为止,一般用LOOP完成,或用DEC和JNZ联用实现。(2)条件控制法(循环次数未知)每执行一次循环体后判断一次循环条件,满足循环条件,继续循环;不满足则结束循环。一般在数据或表格处理中常在末尾添加一个特殊的结束标志。,65,【例】将BX中的16进制数转换为ASCII码,存放到BUF开始的内存单元中去,并在屏幕显示出数值。MOV SI,OFFSET BUF;设置地址指针 MOV CH,4;计数初值=4NEXT:MOV CL,4;最高位移到右边 ROL BX,CL MO

45、V AL,BL;转换成ASCII码 AND AL,0FH ADD AL,30H CMP AL,3AH;字符为AF吗?JL STORE,66,ADD AL,7STORE:MOV SI,AL;字符存入内存 MOV AH,2;显示单字符 MOV DL,AL INT 21H INC SI DEC CH;修改计数并判断 JNZ NEXT HLT;循环结束此题采用“先执行,后判断”的结构。,67,【例】AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放到CL寄存器。MOV CL,0;初始化L1:AND AX,AX;循环控制 JZ STOP SAL AX,1;循环体 JNC L2 INC CLL

46、2:JMP L1STOP:HLT 此方法采用“先判断,后执行”的结构。,68,MOV BX,16;初始化 MOV CL,0L1:SAL AX,1;控制循环 JNC L2 INC CLL2:DEC BX JNZ L1STOP:HLT 此方法采用“先执行,后判断”的结构。,69,3.循环程序的两种基本模式(1)单重循环:循环体为顺序和分支结构(2)多重循环:循环体为一个新的循环结构多重循环是由单重循环嵌套而成。最常用:双重循环(分为内循环和外循环)设计方法同单重循环,但应注意:双重循环的初始控制条件及程序实现;各层循环之间不能交叉,可以从内循环跳到外循环,不可以从外循环跳进内层循环;防止出现死循环

47、。,70,【例】存储器数据段从BUF开始存放着一个无符号字数组,数组的第一个字中存放着该数组的长度,编制一个程序使此数组中的数据按照从小到大的顺序排列。分析一:采用冒泡排序算法,即从第一个数据开始,相邻的数进行比较,若次序不对,两数交换位置。第一遍比较(N-1)次后,最大的数已到了数组尾,第二遍仅需比较(N-2)次就够了,共比较(N-1)遍就完成了排序,共有两重循环。DATA SEGMENTBUF DW 7,15,37,8600,A768H,3412H,1256H,76HDATA ENDSSTACK SEGMENT STACK SA DB 100 DUP(?)TOP EQU$STACK END

48、S,71,CODE SEGMENT ASSUME CS:CODE,DS,DATA,SS:STACKMAIN PROC FARSTART:MOV AX,STACK MOV SS,AX MOV SP,TOP PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV CX,BUFBX;CX作为内循环计数器 DEC CX,72,L1:MOV DX,CX;DX作为外循环计数器L2:ADD BX,2;修改地址指针 MOV AX,BUFBX;取一数 CMP AX,BUFBX+2;与下一数比较 JBE CONTI;若符合前小后大,转移 XCHG

49、AX,BUFBX+2;否则两数交换 MOV BUFBX,AXCONTI:LOOP L2;内循环控制 MOV CX,DX;外循环次数CX MOV BX,0;地址指针返回 LOOP L1;外循环控制 RETMAIN ENDPCODE ENDS END START,73,分析二:采用改进的冒泡排序法,即用设置标志的方法。设立一个FLAG位作标记,进入外循环时标志为0,在内循环中每进行一次交换,标志置1。内循环结束测试标志,若为1,再一次进入外循环;若为0,表示内循环没有进行数据交换,可以提前结束外循环,不必循环N-1遍,节省了操作时间。,74,START:MOV DI,OFFSET BUF;设置地址

50、指针 MOV CX,DI;设内循环计数器CX DEC CX;N-1,内循环次数L1:MOV DX,CX;设外循环计数器DX MOV BH,0;BH为FLAGL2:ADD DI,2 MOV AX,DI CMP AX,DI+2 JBE CONTI XCHG AX,DI+2;若前大后小,交换,FLAG=1 MOV DI,AX MOV BH,1CONTI:LOOP L2 CMP BH,0;FLAG=0,提前结束,跳出外循环 JE STOP,75,MOV CX,DX MOV DI,OFFSET BUF LOOP L1STOP:RET思考:如何改为降序?,76,总结:双重循环需要内、外两个循环计数器方法(

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号