资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,微机原理与接口技术,第六章 微型计算机的程序设计,6.1 程序设计步骤,6.2 简单程序,6.3 分支程序,6.4 循环程序,6.5 子程序,6.1 程序设计步骤,分析问题,建立数学模型,确定算法,绘制程序流程图,内存空间分配,编制程序与静态检查,程序调试,程序:计算机命令(语句)的有序集合。,汇编语言程序设计步骤:,开始,判断,处理,处理,结束,处理,Y,N,6.2 简单程序(1),例:将内存单元10050H的内容拆成两段,每段4位,分别存,入10051H(低4位)和10052H(高4位)单元。即,10051H和10052H单元的高4位都为0。,分析:,理解题意,假设10050H单元的内容是6CH,题意是把它分成06H和0CH,分别存入10051H和10052H单元中。,确定算法:,可以通过移位指令,也可以用逻辑与运算指令(与0FH)。,开始,初始化,用间接寻址取数AL,用逻辑与指令将该数与0FH,,得低4位存入10051H单元,再取出原始数AL,逻辑右移得高4位,存入10052H单元,暂停,绘制程序,流程图,6.2 简单程序(2),内存分配,内存地址 内容,10050H 原始数(6CH),10051H 原低4位(0CH),10052H 原高4位(06H),简单地画一个表,便于日后查看,编制程序,MOV AX,1000H,MOV DS,AX ;DS=1000H,MOV SI,50H ;源指针SI=50H,MOV AL,SI ;读10050H单元,AND AL,0FH ;AL高4位清0,MOV SI+1,AL,MOV AL,SI,MOV CL,4,SHR AL,CL ;高4位移到低4位,MOV SI+2,AL;存入10052H单元,静态检查程序是否有错,6.3 分支程序(1),条件满足?,语句系列,Y,N,条件满足?,语句系列1,语句系列2,Y,N,两种分支结构示意图,例:编一个程序。从外设71H取一个数M,判断其值是否在10和,20之间,即10M20。如果M20,则送0FFH给外设73H;,如果M10,则送00H给外设73H;如果10M20,,则送88H给外设73H。,分析,根据题意需要两次判断M的大小,根据判,断结果把00H或0FFH或88H输出到73H端口。,确定算法,可以使用低于JB和高于或等于转移指令JAE,画流程图,开始,输入71H外,设值AL,AL10?,AL20?,BL=88H,BL=0FFH,BL=00H,输出BL到,外设73H,暂停,LP1,LP2,LP3,Y,Y,IN AL,71H;71H端口数AL,CLC,CMP AL,10,JB LP1 ;小于10转LP1,CMP AL,20,JAE LP2 ;大于或等于20转LP2,MOV BL,88H,JMP LP3,MOV BL,00H,JMP LP3,MOV BL,0FFH,OUT 73H,BL ;将BL的内容输,HLT 出到端口73H,LP3:,LP1:,LP2:,MOV AL,BL,OUT 73H,AL,6.4 循环程序,开始,判断,循环体,结束处理,结束,初始化,循环控制,条件满足?,循环部分,N,条件满足?,循环部分,Y,先执行循环体后判断的结构,先判断后执行循环体的结构,循环程序举例,例:,求两个多字节数,之和。这两个数,在10050H开,始的单元中,,连续存放,,低位在小地,址一端,结果,放在两个数,之后。设这,两个多字节,数均为八个,字节长。,MOV AX,1000H,MOV DS,AX,MOV S1,50H,MOV DI,58H,MOV BX,60H,MOV CX,4,CLC,MOV AX,SI,ADC AX,DI,MOV BX,AX,PUSHF,ADD SI,2,ADD DI,2,ADD BX,2,POPF,LOOP AA,HLT,AA:,开始,CX=0?,取一个字AX,修改指针,SISI+2,DIDI+2,CXCX-1,暂停,初始化,求和AX=AX+DI+CF,N,MOV CX,176H ;循环374次,PUSHF,POPF,LOOP LP1 ;CX-1,CX0转LP,LP1:,HLT,MOV BX,1000,LP2:,DEC BX,JNZ LP2,HLT,例:设计一个软件延时程序,延时时间约1ms,循环次数=374次,延时时间,一次循环时间,1ms,21.40.125s,开始,CX=循环次数,压栈出栈操作,延时时间到?,暂停,N,PUSHF 10节拍,POPF 8节拍,LOOP 3.4节拍,21.4节拍,假设时钟为8M,开始,置数组首址BX,置数组长度CX,置数组无符号数最小值AX,数组字AX?,内容交换,修改数组指针,到100字?,存最大值,结束,Y,N,N,Y,例:,求无符号数组中的最大值。已知:,数组存放在20042H开始的单元,数组长度100,最大值送存20040H开始的单元。,START:MOV AX,2000H,MOV DS,AX,MOV BX,0042H,MOV AX,0,MOV CX,100,NEXT1:CMP AX,BX,JA NEXT ;AX高于BX转到NEXT,MOV AX,BX,NEXT:INC BX,INC BX,LOOP NEXT1,MOV 0040H,AX,HLT,循环次数已知(计数控制),必须采用寄存器间址,才能实现循环。,6.5 子程序,子程序:也叫过程,相对主程序而言,是一个子的程序段,,它能被主程序调用,也能被其它子程序调用,一般把有公用性、重复性或有相对独立性的程序设计成子程序,把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块(子程序)供其他程序使用。,子程序可以实现源程序的模块化,可简化源程序结构,提高编程效率。,主程序需要利用,CALL,指令调用子程序。,子程序需要利用,RET,指令返回主程序。,汇编语言中,子程序要用一对过程伪指令,PROC,和,ENDP,声明,格式如下:,过程名,PROC,NEAR/FAR,;,过程体,过程名,ENDP,NEAR,属性(段内近调用),FAR,属性(段间远调用),一、,子程序编写注意事项,子程序要利用过程定义伪指令声明。,子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡。,子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置,也可以放在主程序开始执行之前的位置。,处理好子程序与主程序间的参数传递问题。,提供必要的子程序说明信息。,例:,code segment,main proc far,.,call subr1,.,ret,main endp,subr1 proc near,.,ret,subr1 endp,code ends,主,程,序,段,子,程,序,段,code segment,main proc far,.,call subr1,.,ret,subr1 proc near,.,ret,subr1 endp,main endp,code ends,子,程,序,段,主,程,序,段,二、举例,例:,MY SEGMENT,ASSUME CS:MY,MAIN PROC FAR,START:PUSH DS,SUB AX,AX,PUSH AX,MOV CL,04,CALL,DP5,MOV BL,CL,CALL,DP5,ADD AL,BL,RET,MAIN ENDP,DP5 PROC NEAR,MOV AL,CL,SAL AL,1,SAL AL,1,ADD AL,CL,MOV CL,AL,RET,DP5 ENDP,MY ENDS,END START,?,例:累加数组中的元素。,主程序,data segment,ary dw 1,2,3,4,5,6,7,8,9,10,count dw 10,sum dw?,data ends,code segment,main proc far,assume cs:code,ds:data,start:,push ds,sub ax,ax,push ax,mov ax,data,mov ds,ax,call proadd,ret,main endp,proadd proc near,push ax,push cx,push si,lea si,ary,mov cx,count,xor ax,ax,next::add ax,si,add si,2,loop next,mov sum,ax,pop si,pop cx,pop ax,ret,proadd endp,code ends,end start,子程序,复习1、子程序的调用与返回(1),段内直接调用与返回,格式:CALL 过程名,功能:调用当前段内的子程序,操作:SPSP2,SPIP,IPIP+disp,子程序入口地址与当前地址的差值,格式:RET,操作:IP SP,SP SP+2,段内间接调用与返回,格式:CALL OPRD,操作:SPSP2,SPIP,IP(OPRD),格式:RET,操作:IP SP,SP SP+2,16位通用寄存器或字存储器,段间直接调用与返回,格式:CALL 过程名,功能:调用其它代码段中的子程序,操作:SPSP-2,SPCS,SPSP-2,SPIP,IP过程入口地址的偏移量,CS过程入口地址的段值,远过程,复习1、子程序的调用与返回(2),格式:RET,操作:IP SP,SP SP+2,CSSP,SPSP+2,复习1、子程序的调用与返回(3),段间间接调用与返回,格式:CALL OPRD,操作:SPSP-2,SPCS,SPSP-2,SPIP,IP(OPRD低),CS(OPRD高),格式:RET,操作:IP SP,SP SP+2,CSSP,SPSP+2,双字存储器操作数,2、子程序设计与应用应注意的问题,现场保护与恢复,子程序中要保护该程序中要使用的寄存器,返回时,恢复现场。后入栈的要先弹出。,MOV CX,176H ;循环374次,PUSHF,POPF,LOOP LP1 ;CX-1,CX0转LP,HLT,LP1:,例:,DELAYIS,:PUSHF,PUSH CX,POP CX,POPF,RET,后进先出,参数传递必须设计好子程序中用到了哪些寄存器或,存储单元。哪些是需要调用程序提供的,,哪些是结果提供给调用程序的。,子程序说明一个子程序,可以被其它程序调用,必须,提供一些说明。如:,程序名、程序的功能、占用的寄存器或,存储单元、入口及出口参数、嵌套了哪,些子程序。,2、子程序设计与应用应注意的问题,子程序设计举例:,找出一个数据块中的最大数,数据块长度在(2001H)单元,数据块从(2002H)单元开始存放,把找出的最大值放到(2000H)单元,,假设数据块中的数是无符号的 8 位数,开始,初始,化,AL SI?,SISI+1,CX=0?,ALSI,AL2000H,暂停,N,N,SI=2001H,循环次数CL=SI,最大值初值AL=00,SI+1指向数据块,MOV SI,2001H,MOV CL,SI,INC SI,MOV AL,00,MOV CH,00,CLC,CMP AL,SI,JC LESS,JMP NLESS,MOV AL,SI,INC SI,LOOP NEXT,MOV 2000H,AL,HLT,NEXT:,LESS:,NLESS:,MAX PROC NEAR,PUSHF,PUSH AX,PUSH CX,PUSH SI,POP SI,POP CX,POP AX,POPF,RET,MAX ENDP,入口信息:2002H单元存放数据,2001H单元存放数据个数,出口信息:最大值在2000H单元,6.6 查表程序,STAR:MOV BX,2000H,MOV AL,5,XLAT,HLT,执行后:AL=19H,BX+AL,01H,04H,09H,10H,19H,24H,31H,40H,51H,64H,2001H,2000H,00H,MOV AH,0,ADD BX,AX,MOV AL,BX,DATA SEGMENT,TABL
展开阅读全文