《东北大学汇编语言第06章分支结构程序.ppt》由会员分享,可在线阅读,更多相关《东北大学汇编语言第06章分支结构程序.ppt(36页珍藏版)》请在三一办公上搜索。
1、第六章分支结构程序,6.1分支结构程序的引出6.2转移指令6.3分支结构程序设计6.4多分支结构程序设计,6.1分支结构程序的引出,用计算机处理问题过程中,总是要求计算机能做出各种逻辑判断,并根据判断的结果,做相应的处理。例如,火车站用计算机计算托运行李的托运费,当旅客行李重量小于或等于20kg时,收费0.2元/kg,当行李重量超过20kg时,20kg以内部分0.2元/kg,超出部分,收费0.3元/kg。这个处理过程,可归纳为下面数学表达式:0.2w(w20kg)0.2*20+0.3*(w-20)(w20kg),P=,6.2转移指令,6.2.1无条件转移指令6.2.2条件转移指令,6.2.1无
2、条件转移指令,指令汇编格式:JMP targ操作:段内转移:IP目标的偏移地址段间转移:IP目标的偏移地址CS目标所处代码段的基址受影响的状态标志位:无说明:指令中的targ可以是直接标号、寄存器间接或存储器间接寻址形式。,6.2.1无条件转移指令,(1)段内转移(NEAR)1)段内直接转移JMP LABEL_N;LABEL_N在当前代码段JMP SHORT LABEL_N;LABEL_N在当前代码段,且在-128127范围内;例:,6.2.1无条件转移指令,CSEGSEGMENTASSUMECS:CSEGSTART:JMPL1JMPSHORTL2JMPL2JMPSTARTL2:NOPORGL
3、2+100HL1:NOPCSEGENDSEND,6.2.1无条件转移指令,0000CSEGSEGMENTASSUME CS:CSEG0000E9010ARSTART:JMPL10003EB05 JMPSHORTL20005EB0390JMPL20008EBF6JMPSTART000A90L2:NOP010AORGL2+100H010A90L1:NOP010BCSEGENDSEND,6.2.1无条件转移指令,(1)段内转移(NEAR)2)段内寄存器间接转移JMP AX3)段内存储器间接转移JMP SIJMP WORD PTRBX+DI+1000H,6.2.1无条件转移指令,(2)段间转移(FAR
4、)1)段内直接转移 JMP LABELF2)短内存储器直接转移LABEL_D DD 12345678H JMP LABEL_D JMPDWORD PTR BX,6.2.2条件转移指令,条件转移指令是根据CPU中状态标志位的状态决定程序执行的流程,既可能产生程序转移,也可能不产生程序转移。条件转移指令是以对不同的状态标志的测试为条件。如果条件成立,则控制转移到指令中所给出的转移目标。条件不成立,程序将顺序执行。所有的条件转移指令均为短(short)转移。,6.2.2条件转移指令,1.根据单标志转移的指令,Even,Odd,6.2.2条件转移指令,2.根据两数(A,B)的大小关系转移的指令(1)使
5、用该指令前用过比较(CMP A,B)、减法(SUB A,B、SBB A,B)指令。(2)A与B的关系共有6种:AB A(3)比较转移时分无符号数和带符号数。例如:A=11111111B B=00000001B,6.2.2条件转移指令,Below Above Less Great Equal,6.2.2条件转移指令,JNAE JNA JNBE JNB JNGE JNG JNLE JNL,6.2.2条件转移指令,CMPA,BJLXXXSFOF=1(SF=1&OF=0,SF=0&OF=1)例:A=81H B=02HCMPA,B结果SF=0,OF=1,6.3分支结构程序设计-例6.1,例6.1设X为单
6、字节带符号整数,且存于ARGX单元,计算结果Y存入RLT单元。,6.3分支结构程序设计-例6.1,X+10(0X8)5X-2(8X15)X(X=0,X15)-X(X0),Y=,6.3分支结构程序设计-例6.1,1:;*EXAM6.1*2:SSEGSEGMENTSTACK3:STKDB50DUP(0)4:SSEGENDS5:DSEG SEGMENT6:ARGXDB-57:RLTDB?8:DSEG ENDS9:CSEGSEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:BEGIN:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG1
7、5:MOVSS,AX16:MOVSP,SIZESTK,17:MOVAL,ARGX;取X值18:ANDAL,AL;置标志位19:JSABSL;X0转20:JZMOVE;X=0转21:CMPAL,8;X8?22:JLEONE;是,转23:CMPAL,15;X15?24:JGEMOVE;是,转25:SALAL,1;计算5X-226:SALAL,127:ADDAL,ARGX28:SUBAL,229:JMPMOVE30:ONE:ADDAL,10;X8,计算X+1031:JMPMOVE32:ABSL:NEGAL;取补33:MOVE:MOVRLT,AL;保存结果34:MOVAH,4CH35:INT21H36
8、:CSEGENDS37:ENDBEGIN,6.3分支结构程序设计-例6.1,6.3分支结构程序设计-例6.2,例6.2设内存中有三个互不相等的无符号字数据,分别存放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。,6.3分支结构程序设计-例6.2,1:;*EXAM6.2*2:SSEGSEGMENTSTACK3:STKDB20DUP(0)4:SSEGENDS5:DSEGSEGMENT6:ARGDW7138H,84A6H,29EH7:MAXDW?8:DSEGENDS9:CSEGSEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:FMAX:M
9、OVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,SIZESTK,17:LEA SI,ARG;取数据首址18:MOV AX,SI;取第1个数19:MOV BX,SI+2;取第2个数20:CMP AX,BX;两数比较21:JAE FMAX1;AX中的数大22:MOV AX,BX;大数送AX23:FMAX1:CMP AX,SI+4;大数与第3个数比较24:JAE FMAX2;AX中的数大25:MOV AX,SI+4;第3个数大大值26:FMAX2:MOV MAX,AX;保存最大值27:MOV AH,4CH28:INT 21H29:CSEG E
10、NDS30:ENDF MAX,6.3分支结构程序设计-例6.2,6.3分支结构程序设计-例6.3,例6.3内存由ADR单元开始存放两个带符号字数据,编制程序,若两数同号将FLAG单元置0,否则置全1。判断两数是否同号,即判断两个数的最高位是否相同,若相同即为同号。判断的方法有两种:第一种方法:先取出一个数,判断符号是否为正,若为正,再判断另一个数的符号是否为正,也为正,则两数同号,否则为异号;若第一个数的符号为负判断另一个数的符号是否为负,也为负,则两数同号,否则为异号。,6.3分支结构程序设计-例6.3,1:;*2:SSEG SEGMENTSTACK3:STK DB20 DUP(0)4:SS
11、EG ENDS5:DSEG SEGMENT6:ADR DW73A5H,924BH7:FLAG DB?8:DSEG ENDS9:CSEG SEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:START:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,SIZESTK,6.3分支结构程序设计-例6.3,17:MOVAX,ADR18:ANDAX,AX;置标志19:JNSPLUS;正转20:MOVAX,ADR+221:ANDAX,AX;第二个数置标志22:JSSAME;同为负23:UNSAME:M
12、OVAL,0FFH;异号标志24:JMPLOAD25:PLUS:TESTADR+2,8000H;第二个数置标志26:JSUNSAME;异号27:SAME:XORAL,AL;同号标志28:LOAD:MOVFLAG,AL;存标志29:MOVAH,4CH30:INT21H31:CSEGENDS32:ENDSTART,1001 0010 0100 10111000 0000 0000 0000,6.3分支结构程序设计-例6.3,0111 0011 1010 01011001 0010 0100 1011,1110 0001 1110 1110,换个算法:,1:;*2:SSEG SEGMENTSTACK
13、3:STK DB20 DUP(0)4:SSEG ENDS5:DSEG SEGMENT6:ADR DW73A5H,924BH7:FLAG DB?8:DSEG ENDS9:CSEG SEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:START:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,SIZE STK,6.3分支结构程序设计-例6.3,6.3分支结构程序设计-例6.3,17:MOVAX,ARG18:XORAX,ARG+2;两数异或19:MOVAL,0;同号标志20:JNSLOAD;同
14、号21:DECAL;异号标志22:LOAD:MOVFLAG,AL;存标志23:MOVAH,4CH24:INT21H25:CSEGENDS26:ENDSTART,6.3 分支结构程序设计-例6.4,例6.4 设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性,并将它们配制成奇校验存入原单元。字符的ASCII码是用七位二进制表示的,当用一个字节单元(8位)保存一个字符的ASCII码时,字节单元的第7位空闲,不同的计算机存放ASCII码时,系统软件对该位有不同的定义:1)第7 位总是0;2)第7 位总是1;3)做为奇偶校验位;4)第7 位为1,扩充128 种特殊字符或图形代码(在西文状态下
15、);5)做为汉字代码的标志位(在中文状态下)。,6.3 分支结构程序设计-例6.4,1:;*EXAM 6.4*2:SSEGSEGMENTSTACK3:STKDB20 DUP(0)4:SSEGENDS5:DSEGSEGMENT6:ASCDBAC7:DSEGENDS8:CSEGSEGMENT9:ASSUMECS:CSEG,DS:DSEG10:ASSUMESS:SSEG11:MKODD:MOVAX,DSEG12:MOVDS,AX13:MOVAX,SSEG14:MOVSS,AX15:MOVSP,LENGTH STK,16:MOVAX,WORD PTR ASC;取两字符17:ANDAL,AL;置奇偶标志
16、18:JPONEXT;奇转19:ORAL,80H;配为奇性 20:NEXT:ANDAH,AH;置奇偶标志21:JPOLOAD;奇转 22:ORAH,80H;配为奇性 23:LOAD:MOVWORD PTR ASC,AX24:MOVAH,4CH25:INT21H26:CSEG ENDS27:ENDMKODD,6.3 分支结构程序设计-例6.4,6.4 多分支结构程序设计,利用计算机解决实际问题时,常遇到这样的情况:处理某个问题时有多种选择方案,根据实际情况选择其中一种。每种处理方案由一段程序完成,每一段程序可以看作一个分支,程序在执行过程中根据当前的状况,决定下一步应执行哪一个分支,这就构成了多
17、个分支的程序。如用计算机控制一台电动机,该电动机有正转、逆转,在每种转动方式下又有几种转速的档次控制,这些控制可以通过键盘09的数字键进行选择,进入某种档次选择后,执行相应分支程序,使电机以最佳方式由一个状态进入所选状态。假设程序的十个分支的起始地址分别为ADR0,ADR1,.ADR9。,1:;*2:SSEGSEGMENTSTACK3:STKDB20 DUP(0)4:SSEGENDS5:DSEGSEGMENT6:DSEGENDS7:CSEGSEGMENT8:ASSUMECS:CSEG,DS:DSEG9:ASSUMESS:SSEG10:MOTOR:MOVAX,DSEG11:MOVDS,AX12:
18、MOVAX,SSEG13:MOVSS,AX14:MOVSP,SIZE STK15:MOVAH,01 16:INT21H17:CMPAL,0 18:JZADR0 19:CMPAL,1 20:JZADR1 21:22:CMPAL,823:JZADR824:ADR9:25:ADR0:ADR1:ADR8:CSEGENDS:ENDMOTOR,6.4 多分支结构程序设计,6.4 多分支结构程序设计,地址常数表法 所谓地址常数表法,就是把多个分支中的每个分支程序段的起始地址顺序存放在一个存储区中,这个存储区称地址表存储区。根据键值,将相应处理程序的入口地址取入某寄存器,然后用间接转移指令实现转移。,6.4
19、多分支结构程序设计,1:;*EXAM 6.5.2*2:SSEGSEGMENTSTACK3:STKDB20 DUP(0)4:SSEGENDS5:DSEGSEGMENT6:ADRTABDWOFFSET ADR0,OFFSET ADR17:DWOFFSET ADR2,.,OFFSET ADR98:DSEGENDS9:CSEGSEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:BRANCH:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,LENGTH STK,17:LEADI,ADRTAB;取地址表首址18:MOVAH,01;读键盘19:INT21H20:SUBAL,0;转换为数字21:XORAH,AH;扩展为字数据22:SHLAX,1;乘223:ADDDI,AX;形成相应地址24:MOVAX,DI;取程序入口25:JMPAX;转去执行 26:ADR0:27:ADR1:ADR9:CSEGENDS:ENDBRANCH,6.4 多分支结构程序设计,MOV BX,AXJMP ADRTABBXMOV BX,AXJMP DI+BX,
链接地址:https://www.31ppt.com/p-6533475.html