3.7 分支程序的设计,分支程序就是根据条件的不同完成不同功能的程序 编写分支程序要用到条件转移指令 执行转移/调用指令时,8086指令队列寄存器原内容(按顺序取出的后续指令)被清除,转向指令的地址(目标地址OPR) →CS、IPCPU按CS、IP的指示,跳转到目标地址去执行3.7.1 无条件转移指令 使程序无条件跳转到目标地址(OPR)去执行 一. 段内转移 转移指令和待转向指令在同一代码段中,只 改变IP的内容 1.段内直接转移 格式:JMP OPR; OPR — 待转向指令标号 操作:IP ← 标号偏移地址,说明: ①标号偏移地址 =JMP指令的下一条指令的偏移地址+位移量 位移量由汇编程序在汇编过程中,根据标号 地址与JMP指令所在地址进行计算得到例: : JMP SHORT NEXT; : NEXT:MOV AL,05H; :,,,由计算机根据转移的相对位置计算得到②转移范围 短转移(位移量为8位) —以JMP为中心的256 个单元; 近转移(位移量为16位) —以JMP为中心的 64KB个单元 ③短转移和近转移也可以分别表示为 JMP SHORT OPR JMP NEAR PTR OPR,例: : JMP NEAR PTR NEXT; : NEXT:MOV AL,05H;,,,由计算机根据转移的相对位置计算得到。
2. 段内间接转移 格式:JMP OPR ; OPR ≡{R,M} 操作:IP ← (EA) 说明: ①有效地址EA由OPR的寻址方式确定; ②转移范围为以JMP为中心的64KB例: BUF DW 0301H … MOV BX, 2C8FH JMP BUF … JMP NEXT … JMP BX … JMP WORD PTR [BX] NEXT: ADD AX, BX …,; IP ← NEXT偏移地址,; IP ← 2C8FH,;IP ← 0301H,; IP ←(2C8FH,2C90H),二. 段间转移 转移指令和待转向指令不在同一代码段中,同 时改变CS、IP 转移范围:1MB 1. 段间直接转移 指令中直接给出不在本代码段中待转向指令标号 格式:JMP FAR PTR OPR ; OPR 待转向指令的标号 操作:CS←标号段地址,IP ←标号偏移地址例3.20 在C1代码段有一条转移到C2代码段的无条件转移指令,如下如示: C1 SEGMENT … JMP FAR PTR NEXT … C1 ENDS C2 SEGMENT … NEXT:MOV CL,AL … C2 ENDS,,,,,,2.段间间接转移 待转向指令的段地址、段内偏移地址放在连续 的4个内存单元中(指令中给出访问内存单元的寻址 方式—同操作数的寻址方式)。
格式:JMP DWORD PTR OPR ; OPR ≡{M} 操作:IP ←(EA), CS ←(EA+2),例3.21 JMP DWORD PTR [BP][DI] 设SS=5000H,BP=1000H,DI=0050H,存放转向地址的堆栈段中的存储单元物理地址: PA=50000H+1000H+0050H=51050H 此时转向地址的存储情况如图3.6所示,JMP指令位于C1代码段,转移到C2代码段,程序形式如下:,C1 SEGMENT … 1000H:1300H JMP DWORD PTR [BP][DI] … C1 ENDS C2 SEGMENT … 2000H:2500H MOV DL,AL … C2 ENDS,,,,,存储单元的内容,,,3.7.2 条件转移指令,根据标志位来判断测试条件:满足条件则转移到指令指定地址执行(分支);否则顺序执行下一条指令格式:JXX OPR; OPR≡{标号},操作:当条件XX满足时则转移到OPR执行,否则顺序执行注意: 属于段内直接短转移指令,转移范围为256字节(IP-128~IP+127)。
JS OPR ;结果为负转移 JNS OPR ;结果为正转移,JP/JPE OPR ;结果中“1”的个数为偶转移 JNP/JPO OPR ;结果中“1”的个数为奇转移,JO OPR ;结果有溢出转移 JNO OPR ;结果无溢出转移,JC OPR ;结果有进位转移 JNC OPR ;结果无进位转移,JZ/JE OPR ;结果为零/相等转移 JNZ/JNE OPR ;结果不为零/不相等转移,(1) 单条件转移指令,,,,,,JB /JNAE OPR ;小于/不大于等于(CF=1)转移,JNB /JAE OPR ;不小于/大于等于(CF=0)转移,JBE /JNA OPR ;小于等于/不大于(CF∨ZF=1)转移,JNBE /JA OPR ;不小于等于/大于(CF∨ZF=0)转移,B:Below——小于(低于) A:Above——大于(高于) E:Equal——等于,(2) 适合无符号数比较的条件转移指令,L:Less——小于 G:Greater——大于 E:Equal——等于,JNL /JGE OPR ;不小于/大于等于转移,JLE /JNG OPR ;小于等于/不大于转移,JNLE /JG OPR ;不小于等于/大于转移,(3)适合带符号数比较的条件转移指令,JL /JNGE OPR ;小于/不大于等于转移,SFOF=1,SFOF=0,((SFOF) ∨ ZF)=1,((SFOF) ∨ ZF)=0,,注意:上述条件转移指令通常是与算术、逻辑、移位等指令联用的。
且注意有符号和无符号的区别 如: 若AL的内容是一个无符号数,那么 CMP AL, 0 ; JA NEXT ; 即当AL0时转移 若AL的内容是一个有符号数,那么 CMP AL, 0 ; JG DONE ;即当AL0时转移,3.7.3 分支程序的结构,分为:单分支结构和多分支结构两种,3.7.4 分支程序设计举例,例:比较两个无符号数的大小,将大数存入MAX单元例3.23 检查NN单元的数据是否为1位16进制数,是则将其转换为ASCII码,否则置为0FFHAL←N,AL≥0?,AL=AL+30H,S,存AL值,END,,N,Y,AL=AL+07H,AL≤9?,AL≤15?,AL=0FFH,,,,,,,,,Y,N,N,Y,,,,×,程序如下: ASTACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD ASTACK ENDS DATA SEGMENT NN DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA;SS:ASTACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX,MOV SP,OFFSET TOP MOV AL,NN ;AL← N CMP AL,9 ;AL和9比较 JBE ALOOP1 ;AL ≤9,转ALOOP1 CMP AL,15 ;AL和15比较 JA ALOOP2 ;AL15,转ALOOP2 ADD AL,07H ;AL ← AL+07H ALOOP1: ADD AL,30H ;AL ← AL+30H DONE: MOV AH,4CH ;返回DOS INT 21H ALOOP2: MOV AL,0FFH ;AL ← 0FFH JMP DONE CODE: ENDS END START,,例3.22 符号函数,1 (x0) y = 0 (x=0) -1 (x0),,,,,ASTACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD ASTACK ENDS DATA SEGMENT XX DB X YY DB ? DATA ENDS,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:ASTACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AL,XX ;AL←X CMP AL,0 ;X与0比较 JGE NEPA ;X≥0,转NEPA MOV YY,0FFH ;X<0,YY← -1 JMP STOP,,,能否缺省?为什么?,NEPA: JE NEPB ;X=0,转NEPB MOV YY,1 ;X>0,YY←1 JMP STOP NEPB: MOV YY,0 ;X=0,YY←0 STOP: MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,,,例3.24从键盘接受一个字符送入AL, 根据AL的数值进行跳转,,,设由键盘输入 ‘0’~‘9’中的任一个到AL,则AL的内容就为‘0’~‘9’中的任一个字符的ASCII值。
然后根据ASCII值转到L0、L1、……、L9程序段中STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT TAB DW L0,L1,L2,L3,L4,L5,L6,L7, L8,L9 DATA ENDS,,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP,MOV AH,01H ;键入字符 INT 21H CMP AL,30H ;AL和30H比较 JB DONE ;AL<30H,转DONE CMP AL,39H ;AL和39H比较 JA DONE ;AL>39H,转DONE SUB AL,30H SHL AL,1 ;AX←2*i MOV AH,0,,,,LEA BX,TAB ;BX←TAB偏移地址 ADD BX,AX ;BX←TAB+2*i JMP WORD PTR [BX];转(TAB+2*i)=Li处执行 DONE: MOV AH,4CH ;返回DOS INT 21H L0:… ;分支L0 JMP DONE L1: … ;分支L1 JMP DONE … … L9: … ;分支L9 JMP DONE CODE ENDS END START,,多分支结构的实现形式之一,,,,end,,,,DATA SEGMENT TAB DW L0,L1,L2,L3,L4,L5,L6,L7,L8,L9 DATA ENDS,L0:… ;分支L0 JMP DONE L1: … ;分支L1 JMP DONE … … L9: … ;分支L9 JMP DONE,多分支结构的实现形式之一,(1) 段内直接转移指令,格式:JMP SHORT OPRD;OPRD≡{标号},功能:将程序无条件地转移到标号OPRD为起点的程序段执行。
操作:IP←IP+D8;D8为8位偏移量的补码,转移范围:IP-128~IP+127(256字节),3.7.1 无条件转移指令,① 段内直接短转移指令,说明:转移指令可以从现行指令地址(IP)向低地址转移——D8为负数;。