汇编语言程序设计的基本方法_第1页
汇编语言程序设计的基本方法_第2页
汇编语言程序设计的基本方法_第3页
汇编语言程序设计的基本方法_第4页
汇编语言程序设计的基本方法_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

第四章程序设计的基本方法微机原理与接口技术

二月2324.4汇编语言程序设计方法4.4.1概述4.4.2分支程序设计4.4.3循环程序设计4.4.4子程序设计3设计一个程序要点:认真分析问题的需求,选择好解决方法;针对选定的算法,编写高质量的程序。一个高质量的程序不仅要满足设计的要求,而且还应尽可能实现以下几点:(1)结构清晰、简明、易读、易调试。结构好(2)执行速度快。

效率高(3)占用存储空间少。

资源少4.4.1概述4(1)分析问题,选择合适的解题方法。(2)根据具体问题,确定输入输出数据的格式。(3)分配存贮区并给变量命名(包括分配寄存器)。(4)绘制程序的流程图,即将解题方法和步骤用程序流程图的形式表示出来。(5)根据流程图编写程序。(6)静态检查与动态调试。汇编语言程序设计的一般步骤5几种框图符号起始、终止框判断框处理说明框子程序或过程调用框流向框连接框YN112126分支程序的特点:根据不同情况作出不同的处理,程序结构分成了若干支路。分支的结构形式:(1)(2)结构特点:程序运行方向是向前的,条件确定,只能执行分支中的一个。机器根据不同的情况作出判定,有选择的执行相应的分支。这类程序称之为分支程序。NY判定条件分支1分支2相当于C语言的if、else…判定条件分支1分支2相当于C语言的switch()分支n4.4.2分支程序设计7(1)分支由条件转移指令产生,不同条件通过FLAGS的标志位状态(0或1)反映出来;(2)转移指令不影响FLAGS的标志位,可连续使用转移指令,产生多个分支。例:可以产生如下的多个分支。CMPBYTEPTRARRAY[BX],0

JLEL1;小于等于0,转移到L1┇分支1;大于0L1:JLNEXT;小于0,转移到NEXT ┇分支2;等于0NEXT: ┇分支3;小于0问题:计算机怎样判断这些分支?8选择合适的转移指令;为每个分支安排出口;将分支中的公共部分尽量放到分支前或分支后的公共程序段中;流程图、程序对应;调试时,逐分支检查。分支程序设计要点9特点:(1)改变程序的执行顺序,即改变指令指针CS:IP的值;(2)不改变标志位。4.4.2.1转移指令设计分支程序的时候,关键在于根据需要,根据各个标志位的不同状态,选用合适的转移指令。10转移指令条件转移无条件转移简单条件转移(10条)无符号数条件转移(4)有符号数条件转移(4)段内直接、段间直接段内间接、段间间接转移指令的分类111无条件转移指令格式:JMP标号作用:①使CPU无条件地转移到指令指明的目的地址处(标号指定)执行,转移的范围大,灵活性大;②不能构成分支程序,但可将各分支的出口重新汇集在一起;CMPARRAY[BX],BYTEPTR0JLE L1;小于等于0

┇分支1;大于0

JMPGO1L1:JLNEXT;小于0

┇分支2;等于0JMPGO1NEXT:┇分支3;小于0GO1:;所有分支汇集12③某些条件转移指令转移的范围超过它规定的范围时,

用JMP搭桥。例:JLL1;小于0时转L1┇L1:……可改为如下指令串:

JGEL0;大于等于0时转L0

JMPL1;小于0时无条件转L1L0:……┇L1:……1无条件转移指令;超过了规定的转移范围13根据所处的位置分类:段内转移:要转移的目的地址与指令本身在同一段;段间转移:要转移的目的地址与指令本身在不同段。根据寻址的方式分类:直接方式转移:转移到标号。间接方式转移:从存储器或寄存器中得到转移目的地的段地址和偏移地址。1无条件转移指令14格式名称功能JMP标号段内直接(IP)+位移量IPJMPOPD段内间接(OPD)IPJMP[FARPTR

]标号段间直接标号的EAIP段首址CSJMPOPD段间间接(OPD)IP(OPD+2)CS1无条件转移指令15例:JMPNEXT

——直接方式的无条件转移指令JMPWORDPTR[BX]

——段内间接转移指令(16位段)JMPDWORDPTR[BX]——DS:[BX]指向的双字单元中存放着EA和段首址(16位段)1无条件转移指令例162条件转移指令条件转移指令语句格式:

操作符标号JX

标号功能:如果转移条件满足,则标号的EA(立即数)→IP否则,执行紧跟转移指令之后的那条指令。172条件转移指令例如:

┋JZNEXTINCAX┋NEXT:DECCX┋E9000140……49…0100H0103H0203HJZNEXTINCAXDECAX位移量=标号EA–下一条指令EA有符号数位移量182简单条件转移特点:只能是段内直接跳转,即:(1)用立即数改变IP的值,不改变CS。(2)为有符号数,>0向前转,否则往回转。(3)16位段:汇编程序计算的位移量在IF-128~127之间时,翻译成8位有符号数;

ELSEIF-32768~32767间时,翻译成16位有符号数;ELSEERROR。

19JZ/JE

ZF=1时,转移JNZ/JNE

ZF=0时,转移JS

SF=1时,转移JNS

SF=0时,转移JO

OF=1时,转移JNO

OF=0时,转移JC

CF=1时,转移JNC

CF=0时,转移JP/JPE

PF=1时,转移JNP/JPO

PF=0时,转移运算结果为0运算结果不为0运算结果为负数运算结果不为负数运算结果溢出运算结果没有溢出运算产生进位借位运算没有产生进位借位结果低8位1的个数为偶数结果低8为1的个数为奇数(1)简单条件转移指令20JZL1MOVAX,0……L1:ZF=1?MOVAX,0……NYL1:指令与流程图的对应关系21特点:①根据单一标志位确定转移方向;②当超出转移范围时,可用JMP搭桥;③不能作段间转移,不得作间接转移;④

不影响FLAGS的标志位,可连续使用转移指令,产生多个分支。(1)简单条件转移指令22例:分析以下程序段,指出所完成的功能。

┋ MOVY,-1 MOVAX,X CMPAX,0 JEEXIT1 ADDAX,1000HJOOVERJNSEXIT1NEGAXEXIT1:MOVY,AXEXIT0:MOVAH,4CHINT21HOVER:LEADX,OVERFMOVAH,9INT21HJMPEXIT0DATASEGMENTXDWnYDW0OVERFDB0AH,0DH,‘ISoverflow!$’DATAENDS23无符号数条件转移指令往往跟在比较指令之后;根据与无符号数特征有关条件标志CF和ZF的组合决定转移方向。

JA/JNBE

短标号

当CF=0且ZF=0时,转移

JAE/JNB

短标号当CF=0或者ZF=1时,转移JB/JNAE

短标号当CF=1且ZF=0时,转移JBE/JNA

短标号当CF=1或者ZF=1时,转移(2)无符号数条件转移指令24①大于转(即不小于且不等于转)JA/JNBE条件标志:CF=0且ZF=0时转移用于两个无符号数a、b的比较,若a>b则实现转移查看a,b两数相减的结果:a-bCMPa,bCF(有没有借位)ZF(相不相等)a>ba-b00a=ba-b01a<ba-b10一般用法:CMPOPD,OPS;(OPD)>(OPS)转JAP(2)无符号数条件转移指令25②大于或等于转(即不低于转)JAE/JNB条件标志:CF=0或ZF=1时转移即(OPD)≥(OPS)时转,等价于指令JNC(两数相等的时候ZF=1,那么CF=0)③小于或等于转(即不高于转)JBE/JNA条件标志:CF=1或ZF=0时转移即(OPD)≤(OPS)时转,④小于转(即不高于等于转)JB/JNAE条件标志:CF=1且ZF=0时转移即(OPD)<(OPS)转等价于指令JC(因为CF=1,则ZF=0)(2)无符号数条件转移指令26JG/JNLE

短标号

当SF=OF且ZF=0时,转移JGE/JNL

短标号

当SF=OF或者ZF=1时,转移JL/JNGE

短标号

当SF≠OF且ZF=0时,转移JLE/JNG

短标号当SF≠OF或者ZF=1时,转移(3)有符号数条件转移指令27问题:CF和ZF标志位是否可以作为判断有符号数比较大小的标志位?来看两有符号数相减的结果:A-B,A,B取值有下列几种情况:ABA-B取值CFZFSFOFA=B0100++A>B0000++A<B1010+-A-B无溢出0000+-A-B有溢出0011-+A-B无溢出1010-+A-B有溢出1001--A>B1000--A<B0010不能用CF、ZF的组合来判断有符号数的大小,而用SF、OF、ZF组合。

28①

小于转(或不大于等于转)JL/JNGE功能:SFOF=1(SF≠OF)且ZF=0转(异或为1时转移)。(两数相减,差为负就说明(OPD)小于(OPS),为什么不仅仅判断SF=1,用JS呢?没有溢出时可以,有溢出的时候结果为正)设(OPD)-(OPS)有:SFOFSFOF000011101110结果为正无溢出,说明OPD>=OPS,不转移结果为正有溢出,说明真正结果应为负(OPD小),转移结果为负无溢出,说明OPD<OPS,应转移结果为负有溢出,说明真正结果应为正,不转移(3)有符号数条件转移指令29②大于等于转(或不小于0转)JGE/JNL条件:SFOF=0或ZF=1转移,即SF=OF或ZF=1转。用于两带符号数比较,若A≥B则条件满足,实现转移。③大于转(或不小于等于转)JG/JNLE条件:SFOF=0且ZF=0转,即SF=OF且ZF=0转。④小于等于转(或不大于0转)JLE/JNLE条件:SFOF=1或ZF=1转移,即SF≠OF或ZF=1转。(3)有符号数条件转移指令30例1:请实现:(AX)小于0转A处执行。CMPAX,0JLATESTAX,8000HJNZAANDAX,AXJLAADDAX,0JLASUBAX,0JLAORAX,0JLA31例2:(AX)+(-2)=>AX,如果结果小于0转L。ADDAX,-2JLL问题:可以用JS吗?No18001H-327670FFFEH-2

7FFFH

此例中不能用JS,因为当(AX)=8001H时(即-7FFFH的补码)说明两负数相加结果为正,产生溢出,仅用JS不发生转移。而此时OF=1、SF=0,SFOF=1,发生转移。该例说明JL本质上是判断运算结果是否为负,而不仅仅是(OPD)<(OPS).可见,对于有符号数,只用一个标志位来判断是否转移往往会造成错误。要用有符号数条件转移指令,除非是和0进行比较。32例3:清除数据段中EA为8002H~2000H号字中的内容为0。MOVBX,8002HL:MOVWORDPTR[BX],0SUBBX,2CMPBX,2000HJAEL;问题:此处用JGE会怎样?JNB呢?不能循环,因为清第一个字后,EA修改为8000H,为负,跳出循环。地址是一种无符号数。33根据以上各条件指令的选用,可总结如下:1.简单转移指令用在TEST、CMP、AND、OR后面,测试某一标志位是否满足条件;用在算术运算指令后,测试某一标志位是否满足条件;在循环计数控制中,用来判断循环是否结束(JZ/JE/JNZ/JNE)。2.有符号数的条件转移指令用在CMP后面,比较带符号数大小,确定转移方向;用在算术运算指令后面,根据结果正负确定转移方向;用在OR,AND后面,根据结果正负确定转移方向。3.无符号数的条件转移指令用作无符号数的比较---地址的比较、ASCII码比较;用于循环控制。34例1:从键盘输入0~9中任一自然数,求其立方值。若输入的字符不是0~9中的数字,则显示“InputError!”从键盘输入一个字符是0~9中的某一个数求其立方显示输入错结束Y开始N35从键盘输入一个字符是

温馨提示

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

评论

0/150

提交评论