微机原理37教材_第1页
微机原理37教材_第2页
微机原理37教材_第3页
微机原理37教材_第4页
微机原理37教材_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.7分支程序的设计分支程序就是根据条件的不同完成不同功能的程序。编写分支程序要用到条件转移指令。

执行转移/调用指令时,8086指令队列寄存器原内容(按顺序取出的后续指令)被清除,转向指令的地址(目标地址OPR)→CS、IP。CPU按CS、IP的指示,跳转到目标地址去执行。

3.7.1无条件转移指令使程序无条件跳转到目标地址(OPR)去执行。一.段内转移转移指令和待转向指令在同一代码段中,只改变IP的内容。1.段内直接转移

格式:JMPOPR;OPR—待转向指令标号

操作:IP←标号偏移地址说明:①标号偏移地址=JMP指令的下一条指令的偏移地址+位移量 位移量由汇编程序在汇编过程中,根据标号地址与JMP指令所在地址进行计算得到。例:

JMPSHORTNEXT; :

NEXT:MOVAL,05H;

:操作码08H操作码CS:0100H05H0101H0102H010AH010BHJMPSHORTNEXT8位位移量MOVAL,05H由计算机根据转移的相对位置计算得到。②转移范围 短转移(位移量为8位)—以JMP为中心的256个单元;

近转移(位移量为16位)—以JMP为中心的64KB个单元。③短转移和近转移也可以分别表示为

JMPSHORTOPR JMPNEARPTROPR例: :

JMPNEARPTRNEXT; :

NEXT:MOVAL,05H;由计算机根据转移的相对位置计算得到。操作码07H操作码CS:0100H05H0101H0102H010AH010BHJMPNEXT16位位移量MOVAL,05H00H2.段内间接转移

格式:JMPOPR ;OPR≡{R,M}

操作:IP←(EA)

说明:①有效地址EA由OPR的寻址方式确定;②转移范围为以JMP为中心的64KB。例:

BUFDW0301H … MOVBX,2C8FH JMPBUF … JMPNEXT … JMPBX … JMPWORDPTR[BX] NEXT:ADDAX,BX …;IP←NEXT偏移地址;IP←2C8FH;IP←0301H;IP←(2C8FH,2C90H)二.段间转移转移指令和待转向指令不在同一代码段中,同时改变CS、IP。

转移范围:1MB。

1.段间直接转移指令中直接给出不在本代码段中待转向指令标号。格式:JMP

FARPTROPR; OPR待转向指令的标号操作:CS←标号段地址,IP←标号偏移地址。例3.20

在C1代码段有一条转移到C2代码段的无条件转移指令,如下如示:

C1 SEGMENT … JMPFARPTRNEXT …

C1 ENDS

C2 SEGMENT … NEXT:MOVCL,AL …

C2 ENDS2.段间间接转移待转向指令的段地址、段内偏移地址放在连续的4个内存单元中(指令中给出访问内存单元的寻址方式—同操作数的寻址方式)。

格式:JMP

DWORDPTROPR;OPR≡{M}

操作:IP←(EA),CS←(EA+2)

例3.21

JMPDWORDPTR[BP][DI]

设SS=5000H,BP=1000H,DI=0050H,存放转向地址的堆栈段中的存储单元物理地址:

PA=50000H+1000H+0050H=51050H

此时转向地址的存储情况如图3.6所示,JMP指令位于C1代码段,转移到C2代码段,程序形式如下:

C1SEGMENT … 1000H:1300H JMPDWORDPTR[BP][DI] … C1ENDS

C2SEGMENT … 2000H:2500H MOVDL,AL …

C2ENDS存储单元的内容10000H1000H:1300H20000H2000H:2500H代码段C1段首地址JMP指令MOV指令C2段首地址00H25H00H20H堆栈段偏移地址→IP=2500H段地址→CS=2000H51050H51050H0050H1000H5000HSSBPDI+3.7.2条件转移指令

根据标志位来判断测试条件:满足条件则转移到指令指定地址执行(分支);否则顺序执行下一条指令。条件满足否?是否转向转移地址执行顺序执行格式:JXXOPR;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/JNAEOPR;小于/不大于等于(CF=1)转移JNB/JAE OPR;不小于/大于等于(CF=0)转移JBE/JNA OPR;小于等于/不大于(CF∨ZF=1)转移JNBE/JAOPR;不小于等于/大于(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/JNGEOPR;小于/不大于等于转移SFOF=1SFOF=0((SFOF)∨ZF)=1((SFOF)∨ZF)=0注意:上述条件转移指令通常是与算术、逻辑、移位等指令联用的。且注意有符号和无符号的区别。如:若AL的内容是一个无符号数,那么

CMPAL,0;JANEXT;即当AL>0时转移若AL的内容是一个有符号数,那么

CMPAL,0;JGDONE;即当AL>0时转移3.7.3分支程序的结构单分支结构

判定条件是否分支程序段顺序往下执行多分支结构判定条件程序段n条件1程序段2程序段1条件2条件n…分为:单分支结构和多分支结构两种3.7.4分支程序设计举例

例:比较两个无符号数的大小,将大数存入MAX单元。

例3.23

检查NN单元的数据是否为1位16进制数,是则将其转换为ASCII码,否则置为0FFH。AL←NAL≥0?AL=AL+30HS存AL值ENDNYAL=AL+07HAL≤9?AL≤15?AL=0FFHYNNY×程序如下:ASTACKSEGMENTSTACKDW256DUP(?)TOPLABELWORDASTACKENDSDATASEGMENTNNDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA;SS:ASTACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX

MOVSP,OFFSETTOP

MOVAL,NN;AL←NCMPAL,9;AL和9比较

JBEALOOP1;AL≤9,转ALOOP1CMPAL,15;AL和15比较

JAALOOP2;AL>15,转ALOOP2ADDAL,07H;AL←AL+07HALOOP1:ADDAL,30H;AL←AL+30HDONE:MOVAH,4CH;返回DOSINT21HALOOP2:MOVAL,0FFH;AL←0FFHJMPDONECODE:ENDSENDSTART例3.22

符号函数

1(x>0)y=0(x=0)

-1(x<0)开始x=?Y←0Y←1Y←-1结束>0<0=0开始x=0?Y←0Y←1Y←-1结束NNYx≥0?YASTACK SEGMENT STACK DW256DUP(?)

TOP LABELWORDASTACK ENDSDATA SEGMENTXX DBXYY DB?DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:ASTACKSTART:

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: JENEPB ;X=0,转NEPB MOV YY,1 ;X>0,YY←1 JMP STOPNEPB: MOV YY,0 ;X=0,YY←0STOP: MOV AH,4CH ;返回DOS INT 21HCODE ENDS

END START

例3.24从键盘接受一个字符送入AL,根据AL的数值进行跳转AL←字符AL≤30H?BX=Li首址S转移到Li执行ENDYNAL逻辑左移1位AL≥39H?YNAL=AL-30HAH=0TAB+1+2+3+17+18L0L0L1L1L9L9设由键盘输入‘0’~‘9’中的任一个到AL,则AL的内容就为‘0’~‘9’中的任一个字符的ASCII值。然后根据ASCII值转到L0、L1、……、L9程序段中。STACK SEGMENT STACK DW256DUP(?)

TOP LABELWORDSTACKENDSDATA SEGMENTTAB DWL0,L1,L2,L3,L4,L5,L6,L7,

L8,L9DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:

MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOPMOVAH,01H ;键入字符INT 21HCMPAL,30H ;AL和30H比较

JB DONE ;AL<30H,转DONECMPAL,39H ;AL和39H比较JA DONE ;AL>39H,转DONESUB AL,30HSHL AL,1 ;AX←2*iMOVAH,0LEA BX,TAB ;BX←TAB偏移地址ADDBX,AX;BX←TAB+2*iJMP WORDPTR[BX];转(TAB+2*i)=Li处执行DONE:MOVAH,4CH ;返回DOS INT 21HL0:…

;分支L0 JMP DONEL1:…

;分支L1 JMP DONE

L9:…

;分支L9 JMP DONECODEENDSENDSTART多分支结构的实现形式之一endTAB+1+2+3+17+18L0L0L1L1L9L9DATA SEGMENTTAB DWL0,L1,L2,L3,L4,L5,L6,L7,L8,L9DATA ENDSL0:…

;分支L0 JMP DONEL1:…

;分支L1 JMP DONE

L9:…

;分支L9 JMP DONE多分支结构的实现形式之一(1)段内直接转移指令格式:JMPSHORTOPRD;OPRD≡{标号}功能:将程序无条件地转移到标号OPRD为起点的程序段执行。操作:IP←IP+D8;D8为8位偏移量的补码转移范围:IP-128~IP+127(256字节)3.7.1无条件转移指令①段内直接短转移指令说明:转移指令可以从现行指令地址(IP)向低地址转移——D8为负数;也可以向高地址转移——D8为正数。注意:JMPSHORTPTRCCC;错误指令

格式:JMP

NEARPTROPRD;

其中,OPRD≡{标号}功能:将程序无条件地转移到标号OPRD为起点的程序段执行。操作:IP←IP+D16;D16为16位偏移量的补码转移范围:IP-32768~IP+32767(64K一个段)②段内直接近转移指令说明:直接转移指令中的目标地址OPRD直接使用要转向指令的标号,属性操作符NEARPTR在指令中可省略,直接写成:其中,标号的偏移地址=当前转移指令的下一条指令的偏移地址+位移量位移量是是16位的,可以由汇编程序在汇编过程中,根据标号地址与JMP指令所在地址进行计算得到。

JMP

标号;IP←标号的偏移地址格式:JMPOPRD;OPRD≡{R,M}操作:IP←[EA];EA为OPRD确定的有效地址。例如:JM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论