2013教科版选修1《程序设计的基本方法》课件.ppt
5.6 汇编语言程序设计的基本方法,通常,编制一个汇编语言源程序应按如下步骤进行:明确任务,确定算法。绘制流程图(包括确定内存单元和分配寄存器)。根据流程图编写汇编语言程序。上机调试程序。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。,5.6.1 顺序程序设计,顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1,S1,S2,S3,开始,结束,例1求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下:DATA SEGMENTX DB 8CHY DB 64H;赋予初值ZDB?;分配存储空间DATA ENDSSTACKSEGMENTDW 20H DUP(0);给堆栈段分配一个TOPLABLE WORD;据区共32个字,每个STACKENDS;字的内容均为0,CODESEGMENTMAINPROC FAR;定义子程序名为MAIN,类型FAR ASSUME CS:CODE;把段寄存器和 ASSUME DS:DATA;段名对应起来 ASSUME SS:STACKSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATA;给数据段赋初值MOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOP,MOV AL,XADD AL,Y;两数低字节相加结果送ALMOV AH,0ADC AH,0;两数高字节带进位相加SHR AX,1MOV Z,ALRETMAINENDPCODEENDSEND START,例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。DATA SEGMENTW DW 268X DW 73Y DW 48Z DW 85DATA ENDSSTACK SEGMENT DW 100 DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,X;计算X*Y IMUL Y MOV CX,AX;用CX存储结果低位MOV BX,DX;用BX存储结果高位 MOV AX,Z;计算X*Y+Z,CWD ADD CX,AX ADC BX,DX SUB CX,100 SBB BX,0 MOV AX,W CWD SUB AX,CX SBB DX,BX IDIV W MOV AH,4CH INT 21H CODE ENDS END START,例3 把非压缩十进制数DAT1转换为压缩十进制数。STACK 64H DATA DAT1 DW 0908H;非压缩十进制数0908H CODE BEGIN:MOV AX,DATA MOV DS,AX MOV AX,DAT1;AX0908H MOV CL,4;CL 4 SAL AH,CL;09字节左移4位,AH=90H ROL AX,CL;9008H字循环左移4位,AX=0089H ROL AL,CL;89字节循环左移4位,AL=98H MOV BYTE PTR DAT1,AL;DAT198H,压缩十进制数98H MOV AH,4CH;返回DOS INT 21H END BEGIN,返 回,5.6.2 分支程序设计,分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示:分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。IP受标志位的影响而跳变,影响标志的指令CMP、TEST、JXX,条件,S1,S2,条件,S,S1,S2,Sn,条件,N,N,Y,Y,两路分支程序设计,例4用比较指令和条件转移指令实现两路分支的程序段。MOV AX,M;假定M和N为有符号数 MOV BX,N CMP AX,BX;比较 M和N的大小,影响标志位,准备条件 JG NEXT;MN时转移,注意若M、N为无符号数时用JA指令;分支程序2 JMP DONE NEXT:;分支程序1 DONE:RET,例5 现有一符号函数:1 当X0时Y=0 当X=0时-1 当X0时假定X为-25,且存放在VARX单元中,函数值Y存放在VARY单元,试编写程序根据X的值确定函数Y的值。根据题意画出流程图如下:,实现符号函数程序的流程图,开始,ALX,AL0?,Y-1,结束,AL0,Y1,Y0,Y,Y,N,N,编写程序如下:DSEGSEGMENTVARXDB-25VARYDB?DSEGENDSCSEGSEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV AL,VARXCMP AL,0JGE NEXTMOV AL,-1JMP HALT,NEXT:JE HALTMOV AL,1HALT:MOV VARY,AL MOV AH,4CHINT 21HCODEENDSEND START,例 6 已知X是单字节带符号数,请设计计算下列表达式的程序。Y=,例 6 已知X是单字节带符号数,请设计计算下列表达式的程序。Y=程序如下:DATA SEGMENT X DB?Y DB?DATA ENDSCODE SEGMENT;代码段START:PROC FARASSUME CS:CODE,DS:DATA MOV AX,0,MOV AX,DATA;初始化DS MOV DS,AX MOV AL,X;取数X CMP AL,0;准备条件 JNS PLUS;X0则转移 NEG AL;X0则求补 JMP DONEPLUS:ADD AL,20;X0时,X+20DONE:MOV Y,AL;计算结果送Y RET;返回START ENDPCODE ENDS END START;汇编结束,分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。例:设内存中有三个互不相等的无符号字数据,分别是放在ARG开始的字单元,编制程序将其中最大值存入MAX单元。分析:求三个无符号数中的最大值,只要把三个数据两两比较,用JA/JNB/JNA/JC等指令就可判断两数的大小,从而选出其中最大值。源程序如下:SSEG SEGMENT STACK STK DB 20 DUP(0)SSEG ENDS,DSEG SEGMENTARG DW 7138H,84A6H,29EHMAX DW?DESG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEGFMAX:MOV AX,DSEG MOV DS,AX MOV SS,AX MOV SP,SIZE STK LEA SI,ARG MOV AX,SI MOV BX,SI+2 CMP AX,BX,JAE FMAX1MOV AX,BXFMAX1:CMP AX,SI+4JAE FMAX2 MOV AX,SI+4FMAX2:MOV MAX,AXMOV AH,4CHINT 21HCSEG ENDS END FMAX,循环结构程序设计,循环程序一般由四个部分组成:(1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。(2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。(3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。(4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。,例题,例7 把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。,例题,例4-26 把从BUF单元开始的80个16位无符号数按从大到小的顺序排列。,DSEG SEGMENT BUF DW 80 DUP(?)DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX LEA DI,MEM MOV BL,79 LOOP1:MOV SI,DI MOV CL,BL,LOOP2:MOV AX,SI ADD SI,2 CMP AX,SI JNC NEXT MOV DX,SI MOV SI-2,DX MOV SI,AX NEXT:DEC CL JNZ LOOP2 DEC BL JNZ LOOP1MOV AH,4CH INT 21H CSEG ENDS END START,