第四章汇编语言程序设计汇编语言程序设计概述汇编语言基本语法汇编语言程序设计BIOS及DOS功能调用汇编语言程序设计实 例分析问题——问题性质、目的、要求、已知条件等等。建立相应数学模型。确定算法——把实际问题转化为计算机求解的步骤和方法。绘制 流程图——形象化描述程序算法。确定数据结构——数据的组织方式,分配存储区编写程序——将流程图用指令集合来实现。应该“简单明了、 层次清晰、运算正确、短小精悍”。上机调试——验证程序功能,反复修改达到完善。汇编语言程序设计程序设计基础基本步骤 计算机通常不会从程序的第一条指令直接顺序执行到程序的最后一条指令结束,会根据处理事务的不同而具有不同的执行流程。程序的流程是由程序 的结构决定的。基本的程序结构有:程序基本结构汇编语言程序设计顺序结构分支结构循环结构子程序结构无分支、无循环、 无转移程序流程图表现为只有起始框、终止框、处理框,无判断框。【例】编制一个程序,求下列公式中的Z值,并将结果存放到RESU LT单元中:Z=(A+B)×10-500。设A、B的值分别存放在BUFA、BUFB单元中,运算结果不超过16位。算法:在 二进制整数中左移1位相当于乘2,右移1位相当于除2,所以可将(A+B)左移3位完成乘以8的操作,然后再与(A+B)左移1位(乘以2 )的结果相加得到(A+B)×10的计算。顺序结构程序——简单程序结构分析:这是一个简单的顺序结构程序,可以直接使用 汇编指令完成。数据结构:存储单元RESULT用来存放结果,BUFA、BUFB存放A、B的值,可用寄存器BX存放中间运算结果。程 序流程图…BUFA DW ?BUFB DW ?RESULT DW ?…MOV DX,BUFA ;DX=AAD D DX,BUFB ;DX=A+BMOV BX,DX ;BX=DX=A+BMOV CL,3 SAL DX,CL ;DX=(A+B)×8SAL BX,1 ;BS=(A+B)×2ADD DX,BX ;DX=(A+B)8+( A+B)2=(A+B)10SUB DX,500 ;DX=(A+B)8-500MOV RESULT, DXMOV AH,4CH ;DOS系统功能调用INT 21H ;返回操作系统编写程序【例】用查表法求整数X的平方值( 0≤x≤15的整数),将结果存入RESULT单元中。分析:用查表法求平方值,首先需要建一个用于存放各数平方值的表,以TA BLE表示表头,表中依次存放0~15的平方值,将待求数X放入AL寄存器,表的起始地址放入BX寄存器。使用XLAT查表指令可以将地址 BX+AL上的一个字节,即AL数值对应的平方值读入AL中。程序流程图编写程序DATA SEGMENTTABLE DB0,1,4,9,16,25,36,49,64,81,100, 121,144,16 9,196,225X DB9RESULTDB?DATA ENDSCODE S EGMENTASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,X MOV BX,OFFSETTABLE ;LEABX,TAB LE XLAT MOV RESULT,AL MOV AH,4CH INT 21H CODE ENDSENDSTART在实际程序设计中,很少有程序会从头到尾都是顺序执行的,绝大部分程序在执行过程中会 根据一些条件的判断决定不同的处理方式或程序流向,这就是分支的概念。程序的流向是由CS和IP中的值决定的,当程序的转移仅在同一段内 进行时,只需修改偏移地址IP的值;如果程序的转移是在不同段之间进行,则段基址CS和偏移地址IP均需要修改。一是分支前的条件判断; 二是根据判断结果进行转移。分支结构程序两要素Y=1当X>0(-128≤X≤127)0当X=0-1 当X<0【例】设Y为符号函数,编写其对应的分支程序。通常一条比较指令只能产生两路分支,因此要产生N路分支就需要N-1 条条件转移指令。使用比较指令实现程序分支 MOV AL,AA CMP AL,0 ;用比较指令进行判 断 JGE BIGR ;如果大于等于0则转移 MOVAL,-1 ;否则X<0,AL =-1 JMP STOPBIGR: JG NEXTl ;如果X>0转移到NEXT1 MOV AL,0 ;否则X=0,AL=0 JMP STOPNEXT1: MOVAL,1 ;X>0,则AL=1STOP: MOVBB,AL ;将AL值存到BB中 INT 20H ;返回 操作系统解:设X的值放在AA单元中,Y的值放在BB单元中。【例】已知X,Y,Z为三个无符号16位数,编程序求三者中最大值,并 将其送入MAX单元(设X,Y,Z三个数不等)。解:这是一个典型的分支程序,需要通过两次数据的比较进行分支,每次比较都选择较大的 数据,从而得到三个数的最大值。设X,Y,Z分别存放在存储单元XX,YY,ZZ,其流程图为:DATA SEGMENT XX DW ? YY DW ? ZZ DW ? MAX DW ?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0 PUSH AX MOV AX,XX ;读取第一个变量 CMP AX,YY ;与变量Y比较 JA NEXT ; X>Y则进行下一个比较 MOV AX,YYNEXT: CMP AX,ZZ ;较大值与Z比较 JA GOMAX ;较大值大于Z比较结束 MOV AX,ZZGOMAX: MOV MAX,AX R ETMAIN ENDPCODE ENDS END START 在内存的一个连续空间中,存放一系列分支程序的地址、跳转指令或 关键字,可以组成一个跳转表,利用这种表可以实现多分支的跳转功能。【例】某程序需要对若干同学的成绩进行评级,根据成绩高低分为不及格 、及格、中、良好、优秀五个等级,不同等级进行不同的操作。解:显然直接使用分支指令,五个等级需要进行4次判断,程序将十分复杂,而如 果使用跳转表来实现,则程序将变得简洁而清晰。设立一个跳转表,每个表项存放一个等级处理程序的地址,根据不同成绩转到不同表项对应的程序 即可。利用跳转表实现多重分支…………优秀,90~100Prog5BASE+8良好,80~89Prog4BASE +6中,70~79Prog3BASE+4及格,60~69Prog2BASE+2不及格,60以下Prog1BASE 建立跳转表从跳转表可以看出,通过对成绩整除10再减去5可得需要的表项,将表项×2则可得到相对于基地址BASE的偏移量 ,通过该偏移量就可以获得对应等级的程序入口。程序流程图DATA SEGMENTBASE DW PROG1,PR OG2,PROG3,PROG4,PROG5STUD DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,STUD ;读学生成绩 MOV AH,0 MOV CL,10 DIV CL ;成绩除以10求商 SUB AL,5 ;判断是否大于5 JA N EXT MOV AL,0 ;小于等于5则相对地址为0NEXT:SHL AL,1 ;大于5则相 对地址为AL2(用移位指令实现) MOV AH,0 MOV BX,OFFSETBAS E ;得到跳转表起始地址 ADD BX,AX ;BX中得到成绩对应跳转表项地址 MOV AX,[BX] ;将跳转表中的跳转地址放到AX JMP AXPROG1: … …CODE ENDSEND START返回DOS方法 MOV DX,DATA MOV DS,DX …… …… MOV AH,4CH INT 21H 1 PUSH DS MOV AX,0 PUSH AX …… …… RET 2 …… …… INT 20H3 |
|