第3章常用伪指令与汇编语言程序设计顺序程序与分支程序

上传人:re****.1 文档编号:586585053 上传时间:2024-09-05 格式:PPT 页数:55 大小:308KB
返回 下载 相关 举报
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序_第1页
第1页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序_第2页
第2页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序_第3页
第3页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序_第4页
第4页 / 共55页
第3章常用伪指令与汇编语言程序设计顺序程序与分支程序_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《第3章常用伪指令与汇编语言程序设计顺序程序与分支程序》由会员分享,可在线阅读,更多相关《第3章常用伪指令与汇编语言程序设计顺序程序与分支程序(55页珍藏版)》请在金锄头文库上搜索。

1、3.3. 程序的基本结构程序的基本结构最基本的程序结构:顺序结构、分支结构、循环结构。AB顺序结构分支结构判断ABNYABC1ABC2ABC3子程序、中断服务程序是一种特殊的程序,它们也是由以上三子程序、中断服务程序是一种特殊的程序,它们也是由以上三种基本结构构成的。种基本结构构成的。i=初值A修改并判断i YN循环结构BGLUT_C 2013-08 J.CB13.3.1 简单程序设计简单程序设计例:编写程序将字变量W中的无符号数W=65525除以8,将商保存在字变量QOUT中,将余数保存在字节变量REMA中。算法分析:可以使用除法指令,也可以使用右移三位实现除以8的运算。65525 0FFF

2、5H 1111 1111 1111 0101B(1)右移3位,移出的三位就是余数,剩余的就是商。余数的保留:可以选择两种方法GLUT_C 2013-08 J.CB21111 1111 1111 0101CREMA01111 1111 1111 010C1000 0000001111 1111 1111 01C0100 0000000111 1111 1111 0C1010 00001010 0000右移右移5位位00000101GLUT_C 2013-08 J.CB3开始开始定义定义W、QOUT、REMAAXW, BL 0AX右移右移1位,最低位移进位,最低位移进CBL右移右移1位,位,C移入

3、它的最高位移入它的最高位AX右移右移1位,最低位亦如位,最低位亦如CBL右移右移1位,位,C移入最高位移入最高位AX右移右移1位,最低位亦如位,最低位亦如CBL右移右移1位,位,C移入最高位移入最高位QPUTAXBL右移右移5位位,REMA BL结束结束使用伪指令定义使用伪指令定义W、QOUT、REMA三个内存三个内存单元,单元,W、QOUT为为16位,位,REMA为为8位。位。这里的结束是结束这里的结束是结束应用程序,返回操应用程序,返回操作系统。作系统。可以使用可以使用INT 21H的的 4CH号功能调号功能调用返回操作系统用返回操作系统 MOV AH,4CH INT 21HGLUT_C

4、2013-08 J.CB4DATA SEGMENT DATAWDW 65525QOUT DW?REMA DB?DATA ENDSCODE SEGMENT CODEASSUME CS:CODE, DS:DATASTART:MOVAX,DATA;取数据段开始地址MOVDS,AX;数据段开始地址送数据段基址寄存器MOVAX,W;从存储器取出DS:WAXMOVBL,0;余数寄存器清0SARAX,1;算术右移1位,符号不变,W最低位进入CRCRBL,1;带进位循环右移1位,C进入BL最高位SARAX,1;算术右移1位,符号不变,W次低位进入CRCRBL,1;带进位循环右移1位SARAX,1;算术右移1位

5、,符号不变,W次低位进入CRCRBL,1;带进位循环右移1位,余数在BL高3位MOVCL,5数据段结束数据段结束代码段开始代码段开始数据段开始数据段开始GLUT_C 2013-08 J.CB5SARBL,CL;余数右移5位,将其移到BL低3位MOVQOUT,AX;保存商MOVREMA,BL;保存余数MOVAH, 4CHINT21HCODE ENDSEND本程序是返回操作系统本程序是返回操作系统代码段结束代码段结束汇编源程序结束汇编源程序结束GLUT_C 2013-08 J.CB6还有就是:还有就是:W直接取低直接取低3位作为位作为余数余数然后然后W右移右移3位得到位得到商商开始开始定义定义W、

6、QOUT、REMAAXW ,REMA 7REMA REMA AND ALAX右移右移3位位QOUT AX 开始开始AX右移右移3位:位:MOV CL ,3SAR AX , CL注意:如果是带符号数,注意:如果是带符号数,就要用算术右移就要用算术右移SAR,不要不要用逻辑右移用逻辑右移SHR对于无符号数,则可用对于无符号数,则可用SAR或或SHR这里选用这里选用SARGLUT_C 2013-08 J.CB7MOV AX,W;从变量从变量W取数据取数据MOV REMA, 7;余数变量余数变量REMAP赋值赋值00000111BANDREMA,AL;余数是余数是AL的的 最低最低3位,位,MOV C

7、L,3;SARAX, CL;算术右移算术右移3位,符号不变,位,符号不变,AX中得到商中得到商MOV QOUT,AX;保存商保存商MOV AH, 4CHINT21H该程序结果相同,但程序代码简单了,执行速度也快了该程序结果相同,但程序代码简单了,执行速度也快了GLUT_C 2013-08 J.CB8(2) 使用除法指令使用除法指令DIV src注意:对于注意:对于8086处理器处理器为了商是字数据,为了商是字数据,被除数被除数32位:位:DXAX(DX0,AXW) 除数除数16位位 BX8DIV BX 商在商在AX,余数在余数在DX,对于本次运算,余,对于本次运算,余数为字节数据,实际上只有数

8、为字节数据,实际上只有DL有效有效 .DATAW DW 65525QOUT DW ?REMA DB ?.CODEMOVAX, DATAMOVDS, AXMOV DX,0MOV AX,WMOV BX,8DIV BXMOV QOUT, AXMOV REMA, DLMOVAH, 4CHINT 21HEND如果是带符号数,应该使如果是带符号数,应该使用符号扩展指令用符号扩展指令CWD和带和带符号除法指令符号除法指令IDIV由于题目指定是无符号数,由于题目指定是无符号数,这里可以将高这里可以将高16位扩展为位扩展为0,用,用DIV除法指令除法指令GLUT_C 2013-08 J.CB9例例 将将AXAX

9、中的中的3 3位位BCDBCD数转换为二进制数数转换为二进制数存入字节变量存入字节变量SBSB中中(AX(AX中的数大于中的数大于0 0,小于,小于255)255)每位十进制用一个每位十进制用一个8421编码(自然二进制编码)表示(即每编码(自然二进制编码)表示(即每一位十进制数都是用二进制表示)一位十进制数都是用二进制表示)十进制数的展开表达式十进制数的展开表达式3位位BCD码码N2N1N00ALAHGLUT_C 2013-08 J.CB10主要部分程序流程图AL=AL+AHAL=AL*CHAHBLAL=百位百位*10既执行既执行AL=AL*CHAL=BL and 0FHAL=AL+BL因百

10、位因百位*10不会大于不会大于255,AH=0,可以,可以使用使用AH右移右移4位,高位位,高位补补0得到十位数得到十位数ALSB保留各位十位到保留各位十位到BL取百位到取百位到ALALAHCH 10,CL=4AH=BLAH右移右移4位得到十位位得到十位由于题目给出不大由于题目给出不大于于255,因此最后一,因此最后一次乘次乘10加个位也只加个位也只是一个字节相加是一个字节相加GLUT_C 2013-08 J.CB11M0V CH,10M0V CH,10MOV CL,4MOV CL,4MOV BL,AL MOV BL,AL ;暂存十位和个位到;暂存十位和个位到BL,BL,MOV AL,AH M

11、OV AL,AH ; ; 百位存入百位存入ALAL中中MUL CH MUL CH ;百位;百位1010AXAXMOV AH,BLMOV AH,BLSHR AH,CL SHR AH,CL ;取十位;取十位ADD AL,AH ADD AL,AH ;百位;百位10 + 10 + 十位十位ALALMUL CH MUL CH ;( (百位百位10 + 10 + 十位十位) )10 10 AXAXAND BL,0FH AND BL,0FH ;取个位;取个位ADD AL,BL ADD AL,BL ;( (百位百位10 + 10 + 十位十位)10 +10 +个位个位ALAL ;约定结果不大于约定结果不大于2

12、55255MOV SB,AL MOV SB,AL ; ALSB,ALSB,如果没有明确结果不大于如果没有明确结果不大于255255,则需要考虑,则需要考虑1616位结果位结果GLUT_C 2013-08 J.CB120999的的BCD数转换为二进制,主要部分程序流程图数转换为二进制,主要部分程序流程图AL取百位取百位AX百位百位*10AH取十位取十位百位百位*10+十位十位AL=AL+AHAX=AL*10BL=BL and 0FHAX=AX+BX因百位因百位*10不会大于不会大于255,AH=0,可以使用,可以使用AH右移右移4位,高位补位,高位补0得得到十位数到十位数AXSBSB应该是字操作

13、数(应该是字操作数(16位)位)BH要清要清0AX为为000999之间的之间的BCD数数GLUT_C 2013-08 J.CB13M0V CH,10M0V CH,10MOV CL,4MOV CL,4MOV BL,AL MOV BL,AL ;暂存十位和个位到;暂存十位和个位到BL,BL,MOV AL,AH MOV AL,AH ; ; 百位存入百位存入ALAL中中MUL CH MUL CH ;百位;百位1010AXAXMOV AH,BLMOV AH,BLSHR AH,CL SHR AH,CL ;取十位;取十位ADD AL,AH ADD AL,AH ;百位;百位10 + 10 + 十位十位ALALM

14、UL CH MUL CH ;(;(百位百位10 + 10 + 十位十位)10 10 AXAXAND BL,0FH AND BL,0FH ;取个位;取个位MOV BX,0 MOV BX,0 ; BH=0; BH=0,ADD AX,BX ADD AX,BX ;( (百位百位10 + 10 + 十位十位)10 +10 +个位个位SBSB ;最后结果为;最后结果为1616位数,不能简单位数,不能简单+ +低低8 8位位MOV SB,AX MOV SB,AX ;AXAXSBSBGLUT_C 2013-08 J.CB14 简单程序设计简单程序设计例例下面再看几个补充的例题。下面再看几个补充的例题。例例 :

15、将存储器单元:将存储器单元DAT1中保存的一个组合中保存的一个组合BCD数转换成两个数转换成两个对应对应ASCII码值,并存入码值,并存入DAT2开始的两个单元,低位在前,高开始的两个单元,低位在前,高位在后。位在后。GLUT_C 2013-08 J.CB15BCD码转换成码转换成ASCII码数据:码数据:非压缩非压缩BCD数据在高半字节数据在高半字节+3.例如数字例如数字55:0000 0101 0011 0101 0000 0101 0011 0000 0011 0101 用逻辑或指令用逻辑或指令OR OR 0000 0101 0011 0000 0011 0101 用加法指令用加法指令O

16、R + 得到的结果是相同的。都是在高半字节加得到的结果是相同的。都是在高半字节加3。GLUT_C 2013-08 J.CB16该问题算法就很简单:该问题算法就很简单: 从从DAT1取出取出BCD数据,先将高数据,先将高4位清位清“0”,与,与30H相加或进相加或进行逻辑或,存入行逻辑或,存入DAT2,再取出数据,将数据逻辑右移,再取出数据,将数据逻辑右移4位(高位(高位位BCD数移到低数移到低4位,高位,高4位变位变“0”,再与,再与30H相加(或进行逻辑相加(或进行逻辑或),存入或),存入DAT2+1单元。单元。程序流程图:程序流程图:GLUT_C 2013-08 J.CB17 程序流程图程

17、序代码DATA SEGMENT DAT1 DB 34H;待转换的数DAT2 DB ?,?DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTARA: MOV AX, DATA MOV DS, AX;送段地址 LEA SI,DAT1 LEA DI,DAT2 MOV AL,SI AND AL, 0FH ADD AL,30H MOV DI,AL MOV AL,SI 开始段定义AL(SI )AL(AL)�FH(DI)(AL)+30HAL(SI )结束AL(AL)右移4位(DI+1)(AL)+30H设置DS,SIDAT1DIDAT2显示:显示:MOV DL,A

18、LMOV AH,02HINT 21HGLUT_C 2013-08 J.CB18 MOV CL,4 SHR AL,CL ORL AL, 30H MOV DI+1, AL MOV AH,4CH INT 21H CODE ENDS END START如果要送到屏幕显示,则将转换结果先送如果要送到屏幕显示,则将转换结果先送DL,02送送AH,调,调用用DOS功能。功能。送送ASCII字符显示的系统调用:字符显示的系统调用:功能功能AH=02H,需要显示的字符需要显示的字符ASCII码码DL ,执行执行 INT 21H显示:MOV DL,ALMOV AH,02HINT 21HAH=4CH功能调用。功能是

19、结束本程序,返回DOSGLUT_C 2013-08 J.CB19再看一个顺序程序: 编写一个计算Z=(x2-3y)/2的程序,x,y为单字节正整数,Z用2字节保存。这是一个算术运算程序,算法设计:首先计算 X2=X*X, 暂存该结果,其次计算 3*y,第三步计算 X2-3*y第四步计算 (x2-3y)/2。该步使用算术右移实现除2运算,比用除法指令执行速度快。依据该算法,可以画出程序流程框图。GLUT_C 2013-08 J.CB20开始计算Z=x*x计算Z=(X*X-3Y)/2结束计算3*yX2的计算,可以分解为3*Y的计算,可以分解为ALxMUL ALBXAXCXAXADD AX,CXAD

20、D AX,CXALY,AH=0GLUT_C 2013-08 J.CB21;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE, DS:DATA EXPRE PROC FAR ;过程定义,远过程START: PUSH DS ;DS:00保存的是一条返回 SUB AX,AX ;DOS 指令。 PUSH AX ;这里,将返回DOS的地址 ;压入堆栈 MOV AX,DATA操作系统会自动在操作系统会自动在DS:00处安排一条返回操作系处安排一条返回操作系统的指令,故子程序开统的指令,故子程序开始处向堆栈中

21、压入始处向堆栈中压入 DS:00执行执行RET指令,则就是指令,则就是转到转到DS:00返回返回DOSGLUT_C 2013-08 J.CB22MOV DS,AX;数据段首地址(基地址)MOV AL , X;取变量X MOV BL,ALMUL BL;X*X=X2MOV BX,AX MOV AL , Y;取变量YMOV AH,0;正整数,高字节直接扩展0 MOV CX,AXADD AX ,CX;2YADD AX, CX;3YXCHG AX, BX SUB AX ,BX ;X2-3YSHR AX ,1; 右移一位 /2MOV Z , AXRET;将DS:00弹出到CS:IP EXPRE ENDP

22、;过程定义结束 CODE ENDSEND STARTRET 指令,转到DS:00,对于EXE格式程序,它是一条返回DOS的指令。GLUT_C 2013-08 J.CB23;数据段定义DATA SEGMENTXDB 25YDB 32ZDW?DATA ENDS;代码段开始CODE SEGMENTASSUME CS:CODE, DS:DATA MOV AX , DATAMOV DS , AXMOV AL , XMOV BL , AL可以使用常规返回DOS方法 INT 21H的4CH功能调用GLUT_C 2013-08 J.CB24MUL BL;X*X=X2MOV BX , AX MOV AL , Y

23、;YMOV AH , 0 MOV CX , AXADD AX , CX;2YADD AX , CX;3YXCHG AX , BX SUB AX , BX ;X2-3YSHR AX ,1; 右移一位 /2MOV Z , AXMOV AH , 4CHINT 21HEXPRE ENDP ;过程定义结束 CODE ENDSEND START用INT 21 的4CH号功能调用返回DOS。GLUT_C 2013-08 J.CB25例 BCD加法程序例如:已知字变量W1、W2分别存放两个非压缩的BCD数,编写程序求两数之和,并将结果存入SUM字变量中。注意:W!,W2为2为字变量(2字节)压缩BCD数,00

24、99,它们的和则可能为3位BCD数,故SUM应该定义3个字节(用DB定义三个字节)。计算机内部只有二进制运算指令,对于BCD数运算,是十进制数,用二进制运算指令运算,需要进行调整。加法、减法、乘法在运算后进行调整除法在运算前先进行调整。 只有字节运算才能进行调整 非压缩BCD数加法调整 AAA(压缩BCD数加法用DAA)GLUT_C 2013-08 J.CB26l压缩BCD加法后,用DAA调整l非压缩BCD加法后,用AAA调整l压缩BCD减法后,用DAS调整l非压缩BCD加法后,用AAS调整l压缩BCD加法后,用AAM调整l(压缩的BCD乘法,不能调整)l除法指令前用AAD调整(存放在AX中的

25、两位非压缩BCD数)开始开始定义定义W1、W2、SUMALW1第一字节(个位)第一字节(个位)ADD AL,W2第一字节,第一字节,AAAC送送SUM+2最低位最低位 (百位)(百位)结束结束SUMALALW1第二字节(十位)第二字节(十位)ADC AL,W2第二字节,第二字节,AAASUM+1AL将将SUM+2清清0,然后进,然后进行带进位的循环左移,行带进位的循环左移,就可将就可将CY移进移进SUM+2最低位,其余位最低位,其余位=0GLUT_C 2013-08 J.CB27例如例如:0809+0607=01 05 060809+0607=01 05 06,程序段如下:,程序段如下:DAT

26、A SEGMENT DATA SEGMENT W1 DW 0809HW1 DW 0809HW2 DW 06078HW2 DW 06078HSUM DB 3 DUP(0)SUM DB 3 DUP(0)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ; ; MOV AL,BYTE PTR W1 MOV AL,BYTE PTR W1 ;取第一个数,;

27、取第一个数,ALAL09H09H ADD ADD AL,BYTE PTR W2AL,BYTE PTR W2 ; AL; AL09H+07=10h,AF=109H+07=10h,AF=1 AAA AAA ;ALAL06H,06H,产生产生CF=1CF=1 MOV SUM,AL MOV SUM,AL ;保存个位,进位信号在;保存个位,进位信号在CFCF MOV AL,BYTE PTR W1+1 MOV AL,BYTE PTR W1+1 ;ALAL08H08H GLUT_C 2013-08 J.CB28 ADC ADC AL,BYTE PTR W2+1 AL,BYTE PTR W2+1 ; AL;

28、AL0FH, CF=00FH, CF=0 AAA AAA ;ALAL05H, CF=105H, CF=1 MOV SUM+1,AL MOV SUM+1,AL ;存百位和千位;存百位和千位 MOV SUM+2,0 MOV SUM+2,0 ; ;处理向百位的进位,先将处理向百位的进位,先将SUM+2SUM+2 RCL UM+2,1 RCL UM+2,1 ; ;清清0 0,然后用带进位循环左移指,然后用带进位循环左移指 ; ;令将进位位移到令将进位位移到SUM+2SUM+2最低位最低位实际上,在实际上,在SUMSUM定义时,已经初始化为定义时,已经初始化为0 0,程序中可以不清,程序中可以不清0 0

29、 定义的变量定义的变量W1W1,W2W2,SUMSUM在汇编语言源程序中可以直接使用,在汇编语言源程序中可以直接使用,汇编程序在对源程序进行汇编时,可以识别是从变量所存放的汇编程序在对源程序进行汇编时,可以识别是从变量所存放的存储器中取出数据存储器中取出数据实际上就是汇编程直接寻址指令实际上就是汇编程直接寻址指令 MOV AL,W1MOV AL,W1,为了书写简单,我们直接写成为了书写简单,我们直接写成 MOV AL,W1.MOV AL,W1.GLUT_C 2013-08 J.CB29以上例子,有一些只给出了实现所要求功能的核心部分分代码,没有给出段定义的完整部分。有一些则给出了包含段定义的完

30、整代码;段定义的格式是相似的,可以参照教材上的例子和前面的段定义例子编写。教材上还有一些顺序程序的例子,由于时间关系,就不一一列举了。GLUT_C 2013-08 J.CB30顺序程序的结构简单,但实际程序设计中,往往需要对某些条件进行判断,依据不同的条件执行不同的分支,这样,顺序程序将不能满足要求。GLUT_C 2013-08 J.CB313.3.2 分支程序的设计分支程序的设计 就是利用CPU的条件转移指令,通过判断某个标志为的状态,控制程序的执行过程。 PF=0PF=0奇奇转转移移JNP/JPOJNP/JPOPF=1PF=1偶偶转转移移 JP/JPEJP/JPEOF=0OF=0无溢出无溢

31、出转转移移JNOJNOOF=1OF=1溢出溢出转转移移JOJOSF=0SF=0为为正正转转移移JNSJNSSF=1SF=1为负转为负转移移JSJSCF=0CF=0无无进进( (借借) )位位转转移移JNCJNCCF=1CF=1有有进进( (借借) )位位转转移移JCJCZF=0ZF=0不相等不相等/ /不等于不等于0 0转转移移JNE/JNZJNE/JNZZF=1ZF=1相等相等/ /等于等于0 0转转移移JE/JZJE/JZ标标志志设设置置功能功能指令助指令助记记符符GLUT_C 2013-08 J.CB32二分支结构二分支结构分支结构判断ABNYABC1ABC2ABC3分支结构判断BNYA

32、BC1ABC2GLUT_C 2013-08 J.CB33多分支结构条件判断1Y程序1N条件判断2Y程序2条件判断n程序nY程序n+1NNGLUT_C 2013-08 J.CB34也可以按照条件编码实现多分枝转移也可以按照条件编码实现多分枝转移例如段内间接转移指令例如段内间接转移指令JMP REG转移到转移到CS:AXJMP WORD PTR MEM转移到转移到CS:MEMAX条件编码条件编码CODAXAX*kJMP AX分支程序分支程序0 分支程序分支程序1分支程序分支程序nCOD=0COD=1COD=nK是一个不小于是一个不小于2的整数。的整数。GLUT_C 2013-08 J.CB35我们

33、还是通过实例来讨论。例:内存单元M中有一个16位的带符号数,求它的绝对值,并将结果放回原处。 算法:求一个数的绝对值时,如果是正数,绝对值不变,如果是负数,则求它的机器负数(连同符号位一起每位取反,最低位+1,就是使用NEG指令)。有了算法,可以画出程序流程图。GLUT_C 2013-08 J.CB36转移目的转移目的指令给出指令给出标号(符标号(符号地址)号地址)开始设置DSSI M AX SIORL AX,AXSF=0NEG AXNYDONESI(AX)结束N_DATAN_DATA,负,负数,数,该标号该标号为了阅读程为了阅读程序方便序方便判断数据的符号,在判断数据的符号,在X86中中就是

34、判断就是判断SF标志位,数据传标志位,数据传送指令不改变标志位,因此送指令不改变标志位,因此用一条逻辑运算指令用一条逻辑运算指令ORL Ax,AX,它不改变它不改变AX的值,但设置的值,但设置标志位标志位SFGLUT_C 2013-08 J.CB37 DATA SEGMENT M DW 789AH;可以任意输入一个数 DATA ENDSCODE SEGMENT ASSUME CS:CODE2,DS:DATA2START: MOV AX,DATA MOV DS,AX LEA SI, M ;MOV SI,OFFSET M MOV AX,SI ORL AX,AX ;AND AX,AX JNS DON

35、E ;符号为SF=0转移到DONEN_DATA: NEG AX ;负数,利用NEG指令求负DONE: MOV SI,AX MOV AH,4CH INT 21H CODE ENDS END GLUT_C 2013-08 J.CB38多分支程序对分支程序,可以由这种2分支程序构成。满足条件1?NYFUN1满足条件2?满足条件3?分支4分支3分支2分支1YYNNFUN2FUN3FUN4FUN5TST2TST1TST3GLUT_C 2013-08 J.CB39计算函数的程序,x是十六位长度字数据算法分析:取出数据X,判断它的符号,首先判断是否=0,如果不是,则是负数,Y=-1,如果是,还须再次判断是否

36、等于0。程序流程框图为:GLUT_C 2013-08 J.CB40开始段定义及初始化取数据-AX(AX)0?(AX)=0?Y=-1Y=0Y=1结束YYNNLP1LP3LP2END1画流程图的时候,对转移目标地址(最好是分支程序的两个分支点)都给出一个标号,在写代码时好使用LP0GLUT_C 2013-08 J.CB41DATA SEGMENT X DW -8 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE3, DS:DATA3START: MOV AX, DATA3 ;设置段基址 MOV DS, AXLEA SI, X;取偏移地址MOV AX, SIAND

37、 AX,AXGLUT_C 2013-08 J.CB42JNS LP1 ;SF=0,转到LP1LP0:MOV Y,0FFH ;=0,继续判断, ;=0转到LP3LP2:MOV Y, 01H ;X0时, y=1LJMP END1LP3:MOV Y,00H ;X=0时,Y=0END1: MOV AH,4CH ;返回操作系统INT 21H CODE ENDSEND STARTGLUT_C 2013-08 J.CB43教材上有一个例子,算法分析:取出数据X,Y,异或,判断符号,SF=1,表明符号异号Z=0;SF=0,表明符号相同,判断是否X0,是,Z=1,否Z=-1。GLUT_C 2013-08 J.C

38、B44多分支的另一种实现方法多分支的另一种实现方法除了用二分支指令实现多分支外,还可以用以下指令实现:除了用二分支指令实现多分支外,还可以用以下指令实现:JMP REG ;JMP WORD PTR MEM例如,我们要依据例如,我们要依据AL中的低中的低4位数据(位数据(015)不同,分别转移)不同,分别转移到对应的分支去执行,每个分支约定占用到对应的分支去执行,每个分支约定占用200字节空间。字节空间。这类指令应用方法如下:这类指令应用方法如下:GLUT_C 2013-08 J.CB45ANLAL, 0FHMOV BL,100MULBLMOV AX, FUN0;JMPAXFUN0:.ORG F

39、UN0+100FUN1:;FUN1-FUN0=100;可以用定位伪指令确定每个;分支相距的距离ORG FUN14+100; 只要保证这段空间能存下FUN15:; 这段代码。也可以是一个转移表,也可以是一个转移表,利用远转移指令转到利用远转移指令转到各处理程序,这样各各处理程序,这样各功能分值的距离就比功能分值的距离就比较小,而且相距的字较小,而且相距的字节数也相同。节数也相同。GLUT_C 2013-08 J.CB46例例3.9 3.9 从键盘上键入从键盘上键入2 2位十六进制数将其拼合成一个字节存入字节变量位十六进制数将其拼合成一个字节存入字节变量SBSB中。中。DATA SEGMENTDA

40、TA SEGMENTIBUF IBUF DB 3,0,3 DUP(0)DB 3,0,3 DUP(0)SBSBDB 0DB 0DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTASSUME CS:CODE,DS:DATAASSUME CS:CODE,DS:DATAMOVMOVAX,DATAAX,DATAMOVMOVDS,AXDS,AXMOV DX, OFFSET IBUF MOV DX, OFFSET IBUF ;键入;键入2 2位十六进制数位十六进制数MOV AH, 10MOV AH, 10INT 21HINT 21HMOV AX, WORD PTR IBUF

41、+2 MOV AX, WORD PTR IBUF+2 ;键入字符从;键入字符从+2+2单元开始,取出送单元开始,取出送AXAXSUB AX, 3030HSUB AX, 3030H ;字符变为十六进制数;字符变为十六进制数CMP AL,0AHCMP AL,0AHJB LNSUB7JB LNSUB7;0 09,ASCII-30H9,ASCII-30H就是它对应的就是它对应的HEXHEX值值SUB AL,7SUB AL,7;A;AF F,ASCII-37HASCII-37H就是它对应的就是它对应的HEXHEX值值GLUT_C 2013-08 J.CB47LNSUB7:CMP AH,0AHLNSUB7

42、:CMP AH,0AHJB LNSUB7JB LNSUB7SUB AH,7SUB AH,7HNSUB7:MOV CL, 4 HNSUB7:MOV CL, 4 ;将;将AXAX中的数拼合成一个字节中的数拼合成一个字节SHL AL ,CLSHL AL ,CLOR AL, AHOR AL, AHMOV SBMOV SB,ALALMOV AH,4CHMOV AH,4CHINT 21HINT 21HCODE ENDSCODE ENDSENDENDGLUT_C 2013-08 J.CB48例例3.10 3.10 某工厂的产品有某工厂的产品有8 8种不同的加工处理程序种不同的加工处理程序P0P0P7P7,根

43、据键,根据键盘输入,做不同的处理,若是盘输入,做不同的处理,若是0 07 7以外的键,则退出加工处理以外的键,则退出加工处理 此例可以用两种方法实现此例可以用两种方法实现: :一种是用逐一比较判断一种是用逐一比较判断, ,逐次比较转移实现二叉分支、整体上逐次比较转移实现二叉分支、整体上实现多分支实现多分支; ; 另一种是跳转表法另一种是跳转表法, ,直接实现多分支直接实现多分支. .GLUT_C 2013-08 J.CB49 方法一方法一逐一比较法逐一比较法. .简单,条理清楚,易于实现,但转移简单,条理清楚,易于实现,但转移范围只能是:范围只能是:128128127127DATADATASE

44、GMENTSEGMENTINPUT DB INPUT DB Input( 0Input( 07): $7): $DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENTMOVMOVAX, DATAAX, DATAMOVMOVDS,AXDS,AX MOV DX , OFFSET INPUTMOV DX , OFFSET INPUT ; ;显示提示符显示提示符 MOV AH , 9MOV AH , 9;0909号功能是显示字符串,号功能是显示字符串,$ $是字符串结束符是字符串结束符 INT 21HINT 21H; MOV AH , 1 MOV AH , 1 ;等待键入

45、一个字符到等待键入一个字符到ALAL, INT 21HINT 21H CMP AL , CMP AL , 0 0 ;为为0 0字符则转字符则转P0P0 JE P0JE P0 CMP AL , CMP AL , 1 1 ;为为1 1字符则转字符则转P1P1 JE P1JE P1GLUT_C 2013-08 J.CB50CMP AL ,CMP AL ,2 2JE P2 JE P2 CMP AL ,CMP AL ,3 3JE P3 JE P3 CMP AL ,CMP AL ,4 4 JE P4JE P4CMP AL ,CMP AL ,5 5JE P5JE P5CMP AL ,CMP AL ,6 6J

46、E P6JE P6CMP AL ,CMP AL ,7 7JE P7JE P7JMP DOWNJMP DOWN ;不是;不是0 07 7则退出程序则退出程序 GLUT_C 2013-08 J.CB51P0: MOV DL ,P0: MOV DL , 0 0 ;键入键入0 0则执行则执行P0P0程序规定的功能程序规定的功能 JMP EXITJMP EXITP1: MOV DL ,P1: MOV DL , 1 1 ;键入键入1 1则执行则执行P1P1程序规定的功能程序规定的功能 JMP EXITJMP EXIT P7: MOV DL ,P7: MOV DL , 7 7 ;键入键入7 7则执行则执行P

47、7P7程序规定的功能程序规定的功能 JMP EXIT JMP EXITEXIT: MOV AH ,4CH EXIT: MOV AH ,4CH ;分支程序一定要注意汇合到结束处;分支程序一定要注意汇合到结束处 INT 21H INT 21HCODE ENDSCODE ENDSENDEND转移到汇集点转移到汇集点汇集点,所有分支在执行完各汇集点,所有分支在执行完各自的功能后,都无条件转移到自的功能后,都无条件转移到汇集点汇集点转移到汇集点转移到汇集点转移到汇集点转移到汇集点GLUT_C 2013-08 J.CB52方法二:跳转表法方法二:跳转表法 利用无条件的间接转移指令可实现远距利用无条件的间接

48、转移指令可实现远距离的多分支离的多分支( (间接跳转至不同分支的入口间接跳转至不同分支的入口处处) ) 在数据区造一地址表,存放不同的分在数据区造一地址表,存放不同的分支入口地址;支入口地址; 设表的首地址为设表的首地址为PTABPTAB,每一个入口地址,每一个入口地址占一个字单元。占一个字单元。P0P0的入口地址的入口地址=PTAB=PTAB,P Pi i的入口地址的入口地址PTABPTAB2 2i i若将若将2 2i iBXBX,则,则 JMP PTAB BXJMP PTAB BX 可转可转到到P Pi i入口处入口处PTAB P0PTAB+2 P1PTAB+4 P2GLUT_C 2013

49、-08 J.CB53INPUT DB INPUT DB INPUTINPUT(0 07 7):):$ $ PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 ;定义地址表;定义地址表 LEA DX , INPUTLEA DX , INPUT ;显示提示;显示提示 MOV AH , 9 MOV AH , 9 INT 21H INT 21H MOV AH , 1 MOV AH , 1 ;等待键入;等待键入0 07 7的数字的数字 INT 21HINT 21H CMP AL , CMP AL , 0 0 ;检查输入数据,不是

50、;检查输入数据,不是0 07 7则退出则退出 JB EXITJB EXIT CMP AL CMP AL , 7 7 JA EXIT JA EXIT AND AX AND AX ,07H07H ; 0-7,0-7,最低最低3 3位有用位有用 ADD AX ADD AX ,AX AX ; i i2 2BXBX MOV BX MOV BX ,AXAX JMP PTABBX JMP PTABBX ;(;(PTABPTAB2 2i i)PiPiIPIPEXITEXIT:RETRETAH=09H功能功能是显示字符串,是显示字符串,字符串以字符串以$字字符结束,字符符结束,字符串开始地址由串开始地址由DX指

51、定指定GLUT_C 2013-08 J.CB54P0P0: MOV DLMOV DL, 0 0 ;键入键入0 0则显示则显示0 0以替代以替代P0P0程序程序 JMP DOWNJMP DOWNP1: MOV DLP1: MOV DL, 1 1 ;键入;键入1 1则显示则显示1 1以替代以替代P1P1程序程序 JMP DOWNJMP DOWN P7: MOV DL ,P7: MOV DL , 7 7 DOWN:DOWN: MOV AH , 2 MOV AH , 2 INT 21H INT 21H JMP EXITJMP EXIT键入的键入的ASCASC码为无符号数,码为无符号数,所以,用所以,用JBJB、JAJA等指令而不能用等指令而不能用JGJG、JLJL等等. .汇集点,所有分支在执行完各汇集点,所有分支在执行完各自的功能后,都无条件转移到自的功能后,都无条件转移到汇集点汇集点无条件转移返回指令地址无条件转移返回指令地址GLUT_C 2013-08 J.CB55

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

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