5.6汇编语言程序设计的基本方法通常,编制一个汇编语言源程序应按如下步骤进行:⑴明确任务,确定算法。⑵绘制流程图(包括确定内存单元和分配寄存器)。⑶根据流程图编写汇编语言程序。⑷上机调试程序。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。5.6.1顺序程序设计顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1S1S2S3开始结束[例1]求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下:DATASEGMENTXDB8CHYDB64H;赋予初值ZDB?;分配存储空间DATAENDSSTACKSEGMENTDW20HDUP(0);给堆栈段分配一个TOPLABLEWORD;据区共32个字,每个STACKENDS;字的内容均为0CODESEGMENTMAINPROCFAR;定义子程序名为MAIN,类型FARASSUMECS:CODE;把段寄存器和ASSUMEDS:DATA;段名对应起来ASSUMESS:STACKSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATA;给数据段赋初值MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMOVAL,XADDAL,Y;两数低字节相加结果送ALMOVAH,0ADCAH,0;两数高字节带进位相加SHRAX,1MOVZ,ALRETMAINENDPCODEENDSENDSTART•例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。•例3把非压缩十进制数DAT1转换为压缩十进制数•例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。–DATASEGMENT–WDW268–XDW–73–YDW48–ZDW–85–DATAENDS–STACKSEGMENT–DW100DUP(?)–STACKENDS–CODESEGMENT–ASSUMECS:CODE,DS:DATA,SS:STACK–START:MOVAX,DATA–MOVDS,AX–MOVAX,X;计算X*Y–IMULY–MOVCX,AX;用CX存储结果低位–MOVBX,DX;用BX存储结果高位–MOVAX,Z;计算X*Y+ZCWDADDCX,AXADCBX,DXSUBCX,100SBBBX,0MOVAX,WCWDSUBAX,CXSBBDX,BXIDIVWMOVAH,4CHINT21HCODEENDSENDSTART第5章汇编语言程序设计8金手指考试网年金手指驾驶员考试科目一科目四元贝驾考网•例3把非压缩十进制数DAT1转换为压缩十进制数。–·STACK64H–·DATA–DAT1DW0908H;非压缩十进制数0908H–·CODE–BEGIN:MOVAX,@DATA–MOVDS,AX–MOVAX,DAT1;AX←0908H–MOVCL,4;CL←4–SALAH,CL;09字节左移4位,AH=90H–ROLAX,CL–;9008H字循环左移4位,AX=0089H–ROLAL,CL;89字节循环左移4位,AL=98H–MOVBYTEPTRDAT1,AL–;DAT1←98H,压缩十进制数98H–MOVAH,4CH;返回DOS–INT21H–ENDBEGIN返回5.6.2分支程序设计分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示:分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。IP受标志位的影响而跳变,影响标志的指令CMP、TEST、JXX条件S1S2条件SS1S2Sn条件NNYY…两路分支程序设计•例4用比较指令和条件转移指令实现两路分支的程序段。–…–MOVAX,M;假定M和N为有符号数–MOVBX,N–CMPAX,BX–;比较M和N的大小,影响标志位,准备条件–JGNEXT–;MN时转移,注意若M、N为无符号数时用JA指令–……;分支程序2–JMPDONE–NEXT:……;分支程序1–……–DONE:RET[例5]现有一符号函数:1当X0时Y=0当X=0时-1当X0时假定X为-25,且存放在VARX单元中,函数值Y存放在VARY单元,试编写程序根据X的值确定函数Y的值。根据题意画出流程图如下:实现符号函数程序的流程图开始AL←XAL≥0?Y←-1结束AL=0Y←1Y←0YYNN编写程序如下:DSEGSEGMENTVARXDB-25VARYDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAL,VARXCMPAL,0JGENEXTMOVAL,-1JMPHALTNEXT:JEHALTMOVAL,1HALT:MOVVARY,ALMOVAH,4CHINT21HCODEENDSENDSTART•例6已知X是单字节带符号数,请设计计算下列表达式的程序。Y=X+20(X≥0)|X|(X0)•例6已知X是单字节带符号数,请设计计算下列表达式的程序。–Y=–程序如下:–DATASEGMENT–XDB?–YDB?–DATAENDS–CODESEGMENT;代码段–START:PROCFAR–ASSUMECS:CODE,DS:DATA–MOVAX,0X+20(X≥0)|X|(X0)MOVAX,DATA;初始化DSMOVDS,AXMOVAL,X;取数XCMPAL,0;准备条件JNSPLUS;X≥0则转移NEGAL;X<0则求补JMPDONEPLUS:ADDAL,20;X≥0时,X+20DONE:MOVY,AL;计算结果送YRET;返回STARTENDPCODEENDSENDSTART;汇编结束分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。[例]:设内存中有三个互不相等的无符号字数据,分别是放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。分析:求三个无符号数中的最大值,只要把三个数据两两比较,用JA/JNB/JNA/JC等指令就可判断两数的大小,从而选出其中最大值。源程序如下:SSEGSEGMENTSTACKSTKDB20DUP(0)SSEGENDSDSEGSEGMENTARGDW7138H,84A6H,29EHMAXDW?DESGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEG,SS:SSEGFMAX:MOVAX,DSEGMOVDS,AXMOVSS,AXMOVSP,SIZESTKLEASI,ARGMOVAX,[SI]MOVBX,[SI+2]CMPAX,BXJAEFMAX1MOVAX,BXFMAX1:CMPAX,[SI+4]JAEFMAX2MOVAX,[SI+4]FMAX2:MOVMAX,AXMOVAH,4CHINT21HCSEGENDSENDFMAX循环结构程序设计循环体图2先判断后执行循环结构循环初始化NY循环控制部分循环初始化循环体N循环控制部分Y图1先执行后判断循环结构循环程序一般由四个部分组成:(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。例题•例7把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。例题•例4-26把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。DSEGSEGMENTBUFDW80DUP(?)DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEADI,MEMMOVBL,79LOOP1:MOVSI,DIMOVCL,BLLOOP2:MOVAX,[SI]ADDSI,2CMPAX,[SI]JNCNEXTMOVDX,[SI]MOV[SI-2],DXMOV[SI],AXNEXT:DECCLJNZLOOP2DECBLJNZLOOP1MOVAH,4CHINT21HCSEGENDSENDSTART