汇编语言程序设计的基本方法.ppt
第四章第四章 程序设计的基本方法程序设计的基本方法微机原理与接口技术微机原理与接口技术 2010.5Chapter 4 汇编语言程序设计微机原理与接口技术4.4 汇编语言程序设计方法汇编语言程序设计方法4.4.1 概述概述4.4.2 分支程序设计分支程序设计4.4.3 循环程序设计循环程序设计4.4.4 子程序设计子程序设计2Chapter 4 汇编语言程序设计微机原理与接口技术设计一个程序设计一个程序要点要点:认真分析问题的认真分析问题的需求需求,选择好,选择好解决方法解决方法;针对选定的算法,编写高质量的程序。针对选定的算法,编写高质量的程序。一个高质量的程序不仅要一个高质量的程序不仅要满足设计的要求满足设计的要求,而且还应尽可能实现以下几点:而且还应尽可能实现以下几点:(1)结构清晰、简明、易读、易调试。)结构清晰、简明、易读、易调试。结构好结构好(2)执行速度快。)执行速度快。效率高效率高(3)占用存储空间少。)占用存储空间少。资源少资源少4.4.1 概述概述3Chapter 4 汇编语言程序设计微机原理与接口技术(1)分析问题分析问题,选择合适的解题方法。,选择合适的解题方法。(2)根据具体问题,确定)根据具体问题,确定输入输出数据的格式输入输出数据的格式。(3)分配存贮区分配存贮区并给变量命名并给变量命名(包括分配寄存器包括分配寄存器)。(4)绘制程序的)绘制程序的流程图流程图,即将解题方法和步骤用,即将解题方法和步骤用程序流程图的形式表示出来。程序流程图的形式表示出来。(5)根据流程图)根据流程图编写程序编写程序。(6)静态检查静态检查与与动态调试动态调试。汇编语言程序设计的一般步骤汇编语言程序设计的一般步骤4Chapter 4 汇编语言程序设计微机原理与接口技术几种框图符号几种框图符号1.1.起始起始、终止终止框框2.2.判断判断框框3.3.处理说明处理说明框框4.4.子程序子程序或过程调用框或过程调用框5.5.流向流向框框6.6.连接连接框框YN5Chapter 4 汇编语言程序设计微机原理与接口技术分支程序的特点:根据不同情况作出不同的处理,分支程序的特点:根据不同情况作出不同的处理,程序结构分成程序结构分成了若干支路了若干支路。分支的结构形式:分支的结构形式:(1)(2)(1)(2)结构特点:结构特点:程序运行方向是向前的,条件确定,程序运行方向是向前的,条件确定,只能执行分支中的一个只能执行分支中的一个。机器根据不同的情况作出判定,机器根据不同的情况作出判定,有选择的执行相应的分支有选择的执行相应的分支。这类程序称之为这类程序称之为分支程序分支程序。NY判定条件判定条件分支分支1分支分支2相当于相当于C语言的语言的if、else判定条件判定条件分支分支1分支分支2相当于相当于C语言的语言的switch()分支分支n4.4.2 分支程序设计分支程序设计6Chapter 4 汇编语言程序设计微机原理与接口技术(1)分支由条件转移指令产生分支由条件转移指令产生,不同条件通过,不同条件通过FLAGS的的标志位状态标志位状态(0或或1)反映出来;)反映出来;(2)转移指令不影响转移指令不影响FLAGS的标志位的标志位,可连续使用转,可连续使用转移指令,产生多个分支。移指令,产生多个分支。例:可以产生如下的多个分支。例:可以产生如下的多个分支。CMP BYTE PTR ARRAYBX,0 JLE L1 ;小于等于小于等于0,转移到,转移到L1 分支分支1 ;大于大于0L1:JL NEXT ;小于小于0,转移到,转移到NEXT 分支分支2 ;等于等于0NEXT:分支分支3 ;小于小于0问题:计算机怎样判断这些分支?问题:计算机怎样判断这些分支?7Chapter 4 汇编语言程序设计微机原理与接口技术(1)选择选择合适合适的转移指令;的转移指令;(2)为每个分支安排为每个分支安排出口出口;(3)将分支中的将分支中的公共部分公共部分尽量放到分支前或分尽量放到分支前或分支后的支后的公共程序段公共程序段中;中;(4)流程图、程序对应流程图、程序对应;(5)调试时,逐分支检查调试时,逐分支检查。分支程序设计要点分支程序设计要点8Chapter 4 汇编语言程序设计微机原理与接口技术 特点:特点:(1)改变程序的)改变程序的执行顺序执行顺序,即改变指令指针,即改变指令指针CS:IP的值;的值;(2)不改变)不改变标志位标志位。4.4.2.1 转移指令转移指令 设计分支程序的时候,设计分支程序的时候,关键关键在于根据需要,在于根据需要,根据各个根据各个标志位的不同状态标志位的不同状态,选用,选用合适合适的转的转移指令。移指令。9Chapter 4 汇编语言程序设计微机原理与接口技术转移转移指令指令条件条件转移转移无条件无条件转移转移简单条件简单条件转移转移(10(10条条)无符号数无符号数条件转移条件转移(4)(4)有符号数有符号数条件转移条件转移(4)(4)段内直接、段间直接段内直接、段间直接段内间接、段间间接段内间接、段间间接转移指令的分类转移指令的分类10Chapter 4 汇编语言程序设计微机原理与接口技术1 无条件转移指令无条件转移指令格式:格式:JMP 标号标号作用:作用:使使CPU无条件地转移无条件地转移到指令指明的目的地到指令指明的目的地址处(标号指定)执址处(标号指定)执行,转移的行,转移的范围范围大,大,灵活性灵活性大;大;不能构成分支程序不能构成分支程序,但可将各分支的出口但可将各分支的出口重新汇集重新汇集在一起;在一起;CMP ARRAYBX,BYTE PTR 0 JLE L1 ;小于等于小于等于0 分支分支1 ;大于大于0 JMP GO1L1:JL NEXT ;小于小于0 分支分支2 ;等于等于0 JMP GO1NEXT:分支分支3 ;小于小于0GO1:;所有分支汇集所有分支汇集11Chapter 4 汇编语言程序设计微机原理与接口技术某些条件转移指令转移的范围超过它规定的范围某些条件转移指令转移的范围超过它规定的范围时,时,用用JMP搭桥搭桥。例:例:JL L1 ;小于小于0时转时转L1 L1:可改为如下指令串:可改为如下指令串:JGE L0 ;大于等于大于等于0时转时转L0 JMP L1 ;小于小于0时无条件转时无条件转L1L0:L1:1 无条件转移指令无条件转移指令;超过了规定的转移范围超过了规定的转移范围12Chapter 4 汇编语言程序设计微机原理与接口技术根据所处的根据所处的位置位置分类:分类:段内转移段内转移:要转移的目的地址与指令本身在:要转移的目的地址与指令本身在同一同一段段;段间转移段间转移:要转移的目的地址与指令本身在:要转移的目的地址与指令本身在不同不同段段。根据寻址的根据寻址的方式方式分类:分类:直接方式直接方式转移:转移到转移:转移到标号标号。间接方式间接方式转移:从转移:从存储器存储器或或寄存器寄存器中得到转移目中得到转移目的地的的地的段地址段地址和和偏移地址偏移地址。1 无条件转移指令无条件转移指令13Chapter 4 汇编语言程序设计微机原理与接口技术格式格式名称名称功能功能JMP 标号标号段内直接段内直接(IP)+位移量位移量 IPJMP OPD段内间接段内间接(OPD)IPJMP FAR PTR 标号标号段间直接段间直接标号的标号的EA IP段首址段首址 CSJMP OPD段间间接段间间接(OPD)IP(OPD+2)CS1 无条件转移指令无条件转移指令14Chapter 4 汇编语言程序设计微机原理与接口技术例:例:JMP NEXT 直接方式的无条件转移指令直接方式的无条件转移指令JMP WORD PTR BX 段内间接转移指令段内间接转移指令(16位段位段)JMP DWORD PTR BXDS:BX指向的双字单元中指向的双字单元中存放着存放着EA和段首址和段首址(16位段位段)1 无条件转移指令例无条件转移指令例15Chapter 4 汇编语言程序设计微机原理与接口技术2 条件转移指令条件转移指令 条件转移指令语句格式:条件转移指令语句格式:操作符操作符 标号标号 JX 标号标号功能:如果转移条件满足,则标号的功能:如果转移条件满足,则标号的EA(立即(立即数)数)IP 否则,执行紧跟转移指令之后的那条指令。否则,执行紧跟转移指令之后的那条指令。16Chapter 4 汇编语言程序设计微机原理与接口技术2 条件转移指令条件转移指令例如:例如:JZ NEXT INC AX NEXT:DEC CX E9000140490100H0103H0203HJZ NEXTINC AXDEC AX位移量位移量=标号标号EAEA下一条指令下一条指令EAEA有符号数有符号数位移量位移量17Chapter 4 汇编语言程序设计微机原理与接口技术2 简单条件转移简单条件转移特点:特点:只能是只能是段内直接跳转段内直接跳转,即:,即:(1)用立即数改变用立即数改变IP的值,不改变的值,不改变CS。(2)为有符号数,)为有符号数,0 向前转,否则往回转。向前转,否则往回转。(3)16位段位段:汇编程序计算的位移量在:汇编程序计算的位移量在n IF -128127之间时,翻译成之间时,翻译成8位有符号数;位有符号数;n ELSE IF -3276832767间时,翻译成间时,翻译成16位有符号位有符号数;数;n ELSE ERROR。18Chapter 4 汇编语言程序设计微机原理与接口技术JZ/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)简单条件转移指令简单条件转移指令19Chapter 4 汇编语言程序设计微机原理与接口技术 JZ L1 MOV AX,0 L1:ZF=1?MOV AX,0NYL1:指令与流程图的对应关系指令与流程图的对应关系20Chapter 4 汇编语言程序设计微机原理与接口技术特点:特点:根据根据单一标志位单一标志位确定转移方向;确定转移方向;当超出转移范围时,可用当超出转移范围时,可用JMP搭桥;搭桥;不能作不能作段间转移段间转移,不得作,不得作间接转移间接转移;不影响不影响FLAGS的标志位的标志位,可连续使用转移,可连续使用转移指令,产生多个分支。指令,产生多个分支。(1)简单条件转移指令简单条件转移指令21Chapter 4 汇编语言程序设计微机原理与接口技术例:分析以下程序段,指出所完成的功能。例:分析以下程序段,指出所完成的功能。MOV Y,-1 MOV AX,X CMP AX,0 JE EXIT1 ADD AX,1000H JO OVER JNS EXIT1 NEG AXEXIT1:MOV Y,AX EXIT0:MOV AH,4CH INT 21HOVER:LEA DX,OVERF MOV AH,9 INT 21H JMP EXIT0 DATA SEGMENTX DW nY DW 0OVERF DB 0AH,0DH,IS overflow!$DATA ENDS22Chapter 4 汇编语言程序设计微机原理与接口技术1.无符号数无符号数条件转移指令往往跟在条件转移指令往往跟在比较指令之后比较指令之后;2.根据与无符号数特征有关条件标志根据与无符号数特征有关条件标志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)无符号数条件转移指令无符号数条件转移指令23Chapter 4 汇编语言程序设计微机原理与接口技术 大于大于转(即不小于且不等于转)转(即不小于且不等于转)JA/JNBE 条件标志:条件标志:CF=0且且ZF=0时转移时转移 用于两个用于两个无符号数无符号数a、b的比较,若的比较,若ab则实现转移则实现转移 查看查看a,b两数相减的结果:两数相减的结果:a-b CMP a,b CF(有没有借位有没有借位)ZF(相不相等相不相等)a b a-b 0 0 a=b a-b 0 1 a B0000+A B1000-A=OPS,不转移不转移结果为正有溢出,说明真正结果应为负结果为正有溢出,说明真正结果应为负(OPD小小),转移转移结果为负无溢出,说明结果为负无溢出,说明OPD AX,如果结果小于如果结果小于0转转L。ADD AX,-2 JL L 问题:可以用问题:可以用JS吗?吗?No18 0 01H -327670FFFEH -2 7FFFH 此例中不能用此例中不能用JS,因为当,因为当(AX)=8001H时时(即即-7FFFH的补码的补码)说明两负数相加结果为正,产生溢出,仅用说明两负数相加结果为正,产生溢出,仅用JS不发生转移。不发生转移。而此时而此时OF=1、SF=0,SF OF=1,发生转移。,发生转移。该例说明该例说明JLJL本质上是判本质上是判断运算结果是否为负,断运算结果是否为负,而不仅仅是而不仅仅是(OPD)(OPS).(OPD)(OPS).可见,对于可见,对于有符号数有符号数,只用一个标志位只用一个标志位来判断来判断是否转移往往会造成是否转移往往会造成错错误误。要用有符号数条件。要用有符号数条件转移指令,转移指令,除非是和除非是和0 0进进行比较。行比较。31Chapter 4 汇编语言程序设计微机原理与接口技术例例3:清除数据段中:清除数据段中EA为为8002H 2000H号字号字中的内容为中的内容为0。MOV BX,8002HL:MOV WORD PTRBX,0 SUB BX,2 CMP BX,2000H JAE L ;问题:此处用问题:此处用JGE会怎样会怎样?JNB呢呢?不能循环,因为清第一个字后,不能循环,因为清第一个字后,EA修改为修改为8000H,为负,跳出循环。,为负,跳出循环。地址是一种无符号数。地址是一种无符号数。32Chapter 4 汇编语言程序设计微机原理与接口技术根据以上各条件指令的选用,可总结如下:根据以上各条件指令的选用,可总结如下:1.简单简单转移指令转移指令用在用在TEST、CMP、AND、OR后面,测试某一标志位是否后面,测试某一标志位是否满足条件;满足条件;用在算术运算指令后,测试某一标志位是否满足条件;用在算术运算指令后,测试某一标志位是否满足条件;在循环计数控制中,用来判断循环是否结束在循环计数控制中,用来判断循环是否结束(JZ/JE/JNZ/JNE)。2.有符号数有符号数的条件转移指令的条件转移指令用在用在CMP后面,比较带符号数大小,确定转移方向;后面,比较带符号数大小,确定转移方向;用在算术运算指令后面,根据结果正负确定转移方向;用在算术运算指令后面,根据结果正负确定转移方向;用在用在OR,AND后面,根据结果正负确定转移方向。后面,根据结果正负确定转移方向。3.无符号数无符号数的条件转移指令的条件转移指令用作无符号数的比较用作无符号数的比较-地址的比较、地址的比较、ASCII码比较;码比较;用于用于循环控制循环控制。33Chapter 4 汇编语言程序设计微机原理与接口技术例例1:从键盘输入:从键盘输入09中任一自然数,求其立方值。若中任一自然数,求其立方值。若输入的字符不是输入的字符不是09中的数字,则显示中的数字,则显示“Input Error!”从键盘输入一个字符从键盘输入一个字符是是0909中的某一个数中的某一个数求其立方求其立方显示输入错显示输入错结束结束Y Y开始开始N N34Chapter 4 汇编语言程序设计微机原理与接口技术从键盘输入一个字符从键盘输入一个字符是是09中的某一个数中的某一个数求其立方求其立方显示输入错显示输入错结束结束YN程序是从程序是从上到下一上到下一行编写的行编写的。从二维框从二维框图,向一图,向一维变迁。维变迁。35Chapter 4 汇编语言程序设计微机原理与接口技术从键盘输入一个字符从键盘输入一个字符不是不是09中的数中的数求其立方求其立方显示输入错显示输入错结束结束Ny条件成立条件成立时,一般时,一般的转移标的转移标号应与该号应与该指令有一指令有一段距离,段距离,条件不成条件不成立的处理立的处理分支,就分支,就在转移指在转移指令之下。令之下。条件写条件写法变迁法变迁36Chapter 4 汇编语言程序设计微机原理与接口技术从键盘输入一个字符从键盘输入一个字符(AL)9Ny条件细化条件细化加标号加标号LERR:EXIT:j1.asm37Chapter 4 汇编语言程序设计微机原理与接口技术分支程序设计应该注意的问题(分支程序设计应该注意的问题(1 1)1.选择合适的转移指令。选择合适的转移指令。例:例:CMP AX,0 JL L1 能不能换成能不能换成JB,JS;JB:CF=1且且ZF=02.要为每个分支准备好出口。要为每个分支准备好出口。例:例:CMP AX,0 JGE L1 MOV DL,-L1:MOV DL,+38Chapter 4 汇编语言程序设计微机原理与接口技术分支程序设计应该注意的问题(分支程序设计应该注意的问题(2 2)3.应将各分支的公共部分尽量提到分支前或分支后应将各分支的公共部分尽量提到分支前或分支后的公共程序段去执行,使程序简短、清晰。的公共程序段去执行,使程序简短、清晰。CMP AX,0JL L1ADD AX,SUMMOV SUM,BXJMP EX1L1:NEG AXADD AX,SUMMOV SUM,AXEX1:CMP AX,0JGE L1NEG AXL1:ADD AX,SUMMOV SUM,AXEX1:39Chapter 4 汇编语言程序设计微机原理与接口技术分支程序设计应该注意的问题(分支程序设计应该注意的问题(3 3)4.分支比较多时,框图对每个分支的判断分支比较多时,框图对每个分支的判断先后次序先后次序应尽量与问题提出的先后次序应尽量与问题提出的先后次序一致。而程序对各一致。而程序对各分支的安排也需要与框图的分支的安排也需要与框图的安排次序一致安排次序一致,这样,这样在编写程序时就不会漏掉某一分支,而且写出的在编写程序时就不会漏掉某一分支,而且写出的程序清晰,容易阅读和检查。程序清晰,容易阅读和检查。5.在调试分支程序时,要在调试分支程序时,要假定各种可能的输入数据假定各种可能的输入数据,沿着沿着每一支路逐一检查每一支路逐一检查,测试程序是否正确。只,测试程序是否正确。只有所有分支都满足设计要求时,才能保证整个程有所有分支都满足设计要求时,才能保证整个程序满足设计要求。序满足设计要求。40