《汇编语言程序设计整.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计整.ppt(38页珍藏版)》请在三一办公上搜索。
1、第4章 汇编语言程序设计,4.1 选择结构程序4.2 循环结构程序4.3 子符串处理4.4 子程序4.5 宏指令4.6 BIOS和DOS功能调用,按照指令执行的顺序,程序的结构可以划分成以下三种。顺序结构:程序按照它编写的顺序执行,每条指令只执行一 次,这样的程序称为“顺序结构”的程序。循环结构:一组指令被反复地执行,这样的程序称为“循环结 构”或者“重复结构”的程序。选择结构:根据某个条件,一部分指令被执行,另一部分指 令没有被执行,这样的程序称为“选择结构”或者“分支结构”的程序。一个实际运行的程序,常常是由以上三种结构的程序组合而成的,上面的三种结构称为程序的“基本结构”。,4.1 选择
2、结构程序,4.1.1 测试和转移控制指令 4.1.2 基本选择结构4.1.3 单分支选择结构 4.1.4 复合选择结构 4.1.5 多分支选择结构,测试和转移控制指令,1.无条件转移指令2.比较和测试指令 3.条件转移指令,1、无条件转移指令,执行JMP指令后,程序转移到新的“目的位置”执行。按照转移目的位置的远近,JMP指令分为近程转移和远程转移1)近程无条件转移指令 转移的目的位置与出发点在同一个段里,这样的转移称为近程转移,把目标位置的偏移地址置入IP寄存器中短转移、近程直接转移、近程间接转移,一般格式:,JMP 目的位置,2)远程无条件转移指令 用来实现不同段之间的转移,执行该指令时,
3、CPU把目的段的段基址装入CS,目的位置的段内偏移地址装入IP。远程直接转移JMP FAR PTR 远程标号指令中的远程标号位于另一个代码段中。执行该指令时,把该标号所在段的段基址送入CS,该标号的偏移地址送入IP。远程间接转移需要32位的目的地址,使用间接转移时,需要把32位目的地址事先装入用DD定义的存储单元。,FAR_TGT DD TWO;数据定义 JMP FAR PTR TWO;第一组,远程直接转移LEA BX,FAR_TGTJMP DWORD PTRBX;第二组,远程间接转移JMP FAR_TGT;第三组,远程间接转移,2、比较和测试指令 该指令用来确定某个数据的特征,如是否小于0、
4、是否为偶数。,(1)CMP(Compare,比较)指令指令格式:CMP目的操作数,源操作数目的操作数:8位/16位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器/存储器/立即数。功能:目的操作数-源操作数,保留运算产生的标志位,不保留运算的差。用来比较两个有符号数或无符号数的大小。,2)TEST(Test,测试)指令指令格式:TEST目的操作数,源操作数目的操作数:8位/16位/32位的寄存器/存储器操作数。源操作数:与目的操作数同类型的寄存器/存储器/立即数。功能:TEST指令将目的操作数与源操作数进行逻辑乘运算,保留运算产生的各标志位,但是不保留逻辑乘的结果。该指令用
5、来测试目的操作数中某几位二进制的特征。,指令 TESTVAR,1 执行后:,如果ZF=0,说明变量VAR的D0位为1,该数为奇数如果ZF=1,说明变量VAR的D0位为0,该数为偶数,3、条件转移指令,“J”是条件转移指令操作码的第一个字母“cc”是代表转移条件的13个字母“label”是转移目的地的标号。,条件转移指令格式:,Jcclabel,1)根据两个有符号数比较结果的条件转移指令 两个有符号数的比较结果通过OF,SF,ZF反映出来,代表转移条件的字母有G(greater),L(less),E(equal),N(not)。,2)根据两个无符号数比较结果的条件转移指令 两个有符号数的比较结果
6、通过CF,ZF反映出来,代表转移条件的字母有A(above),B(below),E(equal)。,3)根据单个标志位的条件转移指令 根据某一个标志位来决定程序的走向,其中一些在前面已出现,4.1.2 基本选择结构 根据不同的条件,需要进行不同的处理,在不同的程序间进行选择。,逻辑流程 源程序代码 正确的流程 错误的流程,4.1.3 分支选择结构 程序A或程序B之一为空,即没有对应的处理过程。,计算AX|AX|的两种判断方法:,4.1.4 复合选择结构,选择结构一个分支的程序中又出现了选择结构,这样的结构称为“复合选择结构”或者“嵌套选择结构”。,4.1.5 多分支选择结构,在选择结构程序里,
7、如果可供选择的程序块多于两个,如下图(a)所示,(b)是汇编语言程序的实现方法。,INCLUDEYLIB.H.CODEPROMPTDB0DH,0AH,“Input X(-10001000):$”X DB?OUT_MSG DB0DH,0AH,“Y=$”START:PUSHCSPOPDS;装载DSLEADX,PROMPT;输入提示信息CALLREADINT;从键盘了输入X的值MOVX,AX;保存输入值,例4-1 对分段函数 进行计算。,COMP:CMPX,3;比较,X3?JGGREATER;X3成立,转“GREATER”CMPX,-3;比较,X3 的程序段OUTPUT:LEADX,OUT_MSG;
8、结果的前导文字CALLWRITEINT;输出计算结果CALLCRLF;输出回车换行EXIT:MOVAX,4C00HINT21HENDSTART,例4-2计算分段函数:X的值从键盘输入,Y的值送显示器输出。,INCLUDE YLIB.HDATASEGEMNTMESS1 DB 0DH,0AH,Input value of X please:$MESS2 DB0DH,0AH,Y=:$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,MESS1CALLREADINT;输入X的值,CMPAX,-2JGEL2L1:S
9、UBAX,3;AXX-3JMPDONEL2:CMPAX,3JGL3MOVBX,AXADDAX,AX;AX2XADDAX,AX;AX4XADDAX,BX;AX5XADDAX,6;AX5X+6JMPDONEL3:MOVAX,2;AX2DONE:LEADX,MESS2CALLWRITEINT;输出Y的值CALLCRLFMOVAX,4C00HINT21HCODEENDSENDSTART,DATASEGMENTPROMPTDB0DH,0AH,“Input a number(13):$”MSG1 DB0DH,0AH,“FUNCTION 1 EXECUTED.$”MSG2 DB0DH,0AH,“FUNCTI
10、ON 2 EXECUTED.$”MSG3 DB0DH,0AH,“FUNCTION 3 EXECUTED.$”DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,例4-3 从键盘上输入数字“1”到“3”,根据输入选择对应程序 块执行。,INPUT:LEADX,PROMPTMOVAH,9INT21H;输出提示信息MOVAH,1INT21H;输入一个数字CMPAL,1JBINPUT;“0”或非数字,重新输入JEF1;数字“1”,转F1CMPAL,2JEF2;数字“2”,转F2CMPAL,3JEF3;数字“3”,转F3JMP
11、INPUT;大于“3”,重新输入,F1:LEADX,MSG1;F1程序块JMPOUTPUTF2:LEADX,MSG2;F2程序块JMPOUTPUTF3:LEADX,MSG3;F3程序块JMPOUTPUTOUTPUT:MOVAH,9INT21HMOVAX,4C00HINT21HCODEENDSENDSTART,4.2 循环结构程序,循环结构也称为“重复结构”,它使得一组指令重复地执行,可以用有限长度的程序完成大量的处理任务,几乎所有的应用程序中都离不开循环结构。循环一般由以下4个部分组成:,(1)初始化部分:为循环做准备,如累加器清零,设置地址指针和计数器的初始值等。(2)工作部分:实现循环的基
12、本操作,也就是需要重复执行的一段程序。(3)修改部分:修改指针、计数器的值,为下一次循环做准备。(4)控制部分:判断循环条件,结束循环或继续循环。,计数循环:循环的次数事先已经知道,用一个变量记录循环的次数。进行减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减1,计数器减为0时,循环结束。条件循环:循环的次数事先并不确定,每次循环开始时或结束后测试某个条件,根据这个条件是否满足来决定是否继续下一次循环。,按照循环结束的条件,有以下两类循环:,按照循环结束判断在循环中的位置,有以下两种结构的循环:,WHILE循环:进入循环后,先判断循环结束条件,条件满足则退出循环,循环次数最少
13、为0次。DO-WHILE循环:进入循环后,先执行工作部分,然后判断循环继续的条件,条件满足则转向工作部分继续循环,循环次数最少1次。,LOOPLabel;CXCX-1,若(CX)0,转移到LabelLOOPZ/LOOPE Label;CXCX-1,若(CX)0且ZF=1,转移到LabelLOOPNZ/LOOPNELabel;CXCX-1,若(CX)0且ZF=0,转移到Label,循环指令采用相对寻址方式,Label距离循环指令的下一条指令必须在-128+127B之内。,1、循环指令,2、计数循环,计数循环是基本的循环组织方式,用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。,3、
14、条件循环,用条件控制循环具有普遍性,计数循环本质上是条件循环的一种。,4、多重循环,若一个循环的循环体内包含了另一个循环,称为多重循环,各层循环可以是计数循环也可以是条件循环。,例4.4 字符串STRING以代码0结束,求这个字符的长度(字符个数),DATASEGMENTSTRING DB“A string for testing.”,0LENTH DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AXLEASI,STRING;装载字符串指针MOVCX,0;设置计数器初值TST:CMPBYTE PTR SI,
15、0;比较JEDONE;字符串结束,转向DONEINCCX;计数INCSI;修改指针JMPTST;转向TST,继续循环DONE:MOVLENTH,CX;保存结果MOVAX,4C00HINT21HCODEENDSENDSTART,例4.5 一个有符号字数组以0为结束标志,求这个数组的:最大值、最小值、平均值。,DATASEGEMNTLISTDW-56,+12,88,-126,-5,16,32,-99,72,-18,0MINDW?MAXDW?AVGDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVMIN,327
16、67;将32767假设为最小的数MOVMAX,-32768;将-32768假设为最大的数MOVAVG,0;AVG用作累加器,清零LEASI,LISTMOVCX,0AGAIN:MOVAX,SICMPAX,0JZDONE;找到零元素,转DONE结束处理,INCCX;纪录非零元素个数ADDAVG,AX;累加CMPAX,MINJGESKIP1MOVMIN,AX;比预设最小值还小,保留SKIP1:CMPAX,MAXJLESKIP2 MOVMAX,AX;比预设最大值还大,保留SKIP2:ADDSI,2JMPAGAINDONE:JCXZNULL;元素个数为零,转NULL处理MOVAX,AVGCWDIDIVC
17、XMOVAVG,AX;计算平均值JMPEXIT NULL:MOVMIN,0;元素个数为0,将“最大值”、“最小值”MOVMAX,0;“平均值”清零MOVAVG,0EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART,DATASEGMENTPOSITIONDW?STRINGDB“This is a string for example.”,0DATAENDSCODESEGMENTASSUME DS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX,例4-6 查找字母a在字符串STRING中第一次出现的位置,如果未出现,置位置值为-1。,MOVSI,
18、-1;SI用作字符串字符指针MOVCX,30;字符串长度30L0:INCSI;修改指针CMPSTRINGSI,a;一个字符与a进行比较LOOPNEL0;字符串未结束,未找到,继续JNENOTFOUND;未找到,转“NOTFOUND”MOVPOSITION,SI;保存位置值JMPEXITNOTFOUND:MOVPOSITION,-1;未找到,置位置值为-1EXIT:MOVAX,4C00HINT21HCODEENDSENDSTART,程序使用LOOPNE指令来控制循环,既有计数控制,又有条件控制。,例4-7 编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。,DATASEGEMN
19、TLISTDW-56,+12,88,-126,-5,16,32,-99,72,-18MINDW?MINABS DW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,LISTMOVMIN,AX;将数组第一个元素假设为绝对值最小的数MOVMINABS,32767;最小的绝对值假设为32767LEASI,LISTMOVCX,10,AGAIN:MOVAX,SICMPAX,0JGESKIP1NEGAX;求绝对值SKIP1:CMPAX,MINABS;绝对值与假设的最小绝对值比较JGESKIP2;假设的绝对值较小,
20、跳过MOVMINABS,AX;保存新的最小绝对值MOVAX,SI;取出新的绝对值最小的数MOVMIN,AX;保留新的绝对值最小的数SKIP2:ADDSI,2LOOPAGAINMOVAX,4C00HINT21HCODEENDSENDSTART说明:一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。,例4-8 缓冲区BUFFER中存放有字符串,以0为结束标志。编写程序,把字符串中的大写字母转换成小写字母。,DATASEGEMNTBUFFER DBA String for Test.,0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEABX,BUFFER;BUFFER缓冲区指针ONE:MOVAL,BX;从缓冲区取出一个字符ANDAL,ALJZQUIT;为零,处理完成CMPAL,AJBNEXTCMPAL,ZJANEXTADDAL,a-AMOVBX,ALNEXT:INCBXJMPONEQUIT:MOVAX,4C00HINT21HCODEENDSENDSTART,