资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章,汇编语言程序设计,4-1,汇编程序的约定,4-2,程序设计步骤,4-3,直线程序,4-4,分支程序,4-5,循环程序,4-6,子程序,4-8,编程举例,4-7,算数运算,4-1,汇编程序约定,汇编语言程序:,用汇编语言编写的、,完成特定功能的指令序列。,汇编程序:,能将汇编语言,源程序,转换成机器语言,目标,程序的系统软件。,汇编语言程序到机器语言程序的转换过程称为汇编。,1.,手工汇编,:人工查指令表汇编。用于设计短小程序或调试程序的场合。,2,.,机器汇编,:用汇编程序进行汇编,。,源程序使用机器汇编要考虑汇编程序的约定,1,),按指令格式和语法规则编写程序。,常数的表示:,十进制数:20,十六进制数:87,H,0F0H,二进制数:01011001,B,字符:,H,字符串:“,Hello”,。,2,),使用伪指令提供汇编信息,。,汇编的主要任务:,1)确定程序中每条汇编语言指令的指令机器码。,2)确定每条指令在存储器中的存放地址。,3)提供错误信息。,4)提供目标执行文件(*.,OBJ,/*.,HEX),和列表文件(*.,LST)。,一.,汇编语言指令类型,1.,机器指令,:,指令系统中的全部指令,每条指令有对应的机器代码。,2,.,伪指令,:,汇编控制指令,仅提供汇编信息,没有指令代码。,一.,汇编语言指令类型,3,.,宏指令,:,宏汇编功能:将需要多次反复执行的程序段定义成一个宏指令名(宏定义),编程时,可在程序中使用宏指令名来替代一段程序(宏调用)。,宏定义过程,:,宏指令名,MACRO,形式参数,;定义程序段,ENDM,宏调用过程:,宏指令名 实际参数,宏指令名 实际参数,二,汇编控制指令(伪指令),伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令,不同汇编程序允许的伪指令并不相同,但一些基本的伪指令在大部份汇编程序中都能使用,汇编控制指令(伪指令),常用伪指令及其功能:,1.,ORG,起始地址指令:指明程序和数据块起始地址。,指令地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN:MOV R0,#30H,2002H E6MOV A,R0,ORG 3000H,3000H 23DB 23H,100,A,3001H 64,3002H41,2.,DB,定义字节型常数指令。例:,DB 12H,100,A,例如:,ORG,2000H,TAB1,:,DB,01H,,,04H,,,08H,,,10H,以上伪指令汇编后从,2000H,单元开始定义(存放),4,个字节数据(平方表):,(,2000H,),01H,,(,2001H,),04H,,(,2002H,),09H,,(,2003H,),10H,。,3.,DW,定义字型常数指令。,例:,DW 1234H,5678H,例如:,ORG,2100H,TAB2,:,DW 1067H,,,1000H,,,100,汇编后:(,2100H,),10H,,(,2101H,),67H,,,(,2102H,),10H,,(,2103H,),00H,,,(,2104H,),00H,,(,2105H,),64H,。,4.,EQU,等值。为标号或标识符赋值。,X1 EQU 2000HX2 EQU 0FH MAIN:MOV DPTR,#X1 ADD A,#X2,5.,END,结束汇编指令。,例:,START:,END START,判断框,连接点,图,:,常用流程图符号,美国国家标准化协会,ANSI,(,American National Standard Institute,)设定了一些常用的流程图符号如图所示:,起止框,或,流程线,输入输出框,处理框,4-2,汇编语言程序设计步骤,一.确定方案和计算方法,二.了解应用系统的硬件配置、性能指标。,三.建立系统数学模型,确定控制算法和操作步骤。,四.画程序流程图,表示程序结构和程序功能,五.编制源程序,1.合理分配存储器单元和了解,I/O,接口地址。,2.按功能设计程序,明确各程序之间的相互关系。,3.用注释行说明程序,便于阅读和修改调试和修改。,开始,1,Y,N,?,常用程序结构,:,直线程序、分支程序、循环程序、子程序,4-3,直线程序,直线程序又称简单程序,程序走向只有一条路径。,双字节变补程序(设数据在,R4R5,中):,MOV A,R5;,取低字节,CPL A,ADD A,#1;,低字节变补,MOV R5,A,MOV A,R4;,取高字节,CPL A,ADDC A,#0;,高字节变补,MOV R4,A,例4-3-4,压缩式,BCD,码分解成为单字节,BCD,码。,MOV R0,#40H;,设指针,MOV A,R0;,取一个字节,MOV R2,A;,暂存,ANL A,#0FH;,清0高半字节,INC R0,MOV R0,A ;,保存数据个位,MOV A,R2,SWAP A ;,十位换到低半字节,ANL A,#0FH,INC R0,MOV R0,A;,保存数据十位,十 个,4-4,分支程序,由条件转移指令构成程序判断框部分,形成程序分支结构。,4-4-2单重分支程序,一个判断决策框,程序有两条出路。,两种分支结构:,条件满足?,N,影响条件,Y,处理段,条件满足?,N,影响条件,Y,处理1,处理2,例 求,R2,中补码绝对值,正数不变,负数变补。,MOV A,R2,JNB ACC.7,NEXT;,为正数?,CPL A ;,负数变补,INC A,MOV R2,A,NEXT:SJMP NEXT ;,结束,例题行李计价:当,G5,,,M=G3;,当,G5,,,M=G3+(G-5)(5-3),FRT:MOV A,40H;,取行李重量,G,MOV R3,A,;,G,暂存,R3,中,MOV B,#03H,;,M=G3,MUL AB,MOV R2,A,;暂存3,G,到,R2,MOV A,R3,;取回,G,CJNE A,#05H,L1,;,G5?,SJMP WETC,L1:JC WETC,;是,转至,WETC,SUBB A,#05H,;否则,M=3G+2(G-5),RLC A,ADD A,R2,SJMP LOOP,WETC:MOV A,R2,;,3G,到,A,LOOP:MOV 41H,A,;存结果,M,到,41H,RET,设重量存在,40H,中,4-4-3 多重分支程序,一多次使用条件转移指令,,形成两个以上判断框。,例 求符号函数,Y=SGN(X),+1 当,X0,SGN(X)=0,当,X=0,-1,当,X0,X0?,Y,取,X,N,Y=0,Y=+1,开始,Y=1,X0?,N,Y,保存,Y,结束,图4-4-4求符号函数流程图,SYMB:MOV A,40H,;,取,X,JZ STOR,;X=0,Y=X,JB ACC7,MINUS,;X0,跳转,MOV A,#1,;X0,Y=+1,SJMP STOR,MINUS:MOV A,#0FFH,;X0,Y=-1,补码,STOR:MOV 41H,A,;,保存,Y,RET,设,X,存在,40H,中,结果,Y,存在,41H,二按分支号转移,如:分支号=0,程序转移到,ADDR0,处;当分支号=1,程序转移到,ADDR1,处;。,(1)用地址表法。设分支号已存入,A。,MTJS:MOV DPTR,#TAB,;,取表首地址,CLR C,;,分支号2,RLC A,MOV R2,A,MOVC A,A+DPTR,;,取分支地址低位,PUSH ACC,;,入栈保存,MOV A,R2,INC A,MOVC A,A+DPTR,;,取分支地址高位,PUSH ACC,;,入栈保存,RET,;,分支地址,PC,,转移,TAB:DW ADDR0,;,分支地址表,DW ADDR1,ADDR0:,;,程序段0 ,A=?,0,处理一,处理二,处理,1,n,4-5,循环程序,包含多次重复执行的程序段,循环结构使程序紧凑。,4-5-1循环程序的构成,循环控制?,循环工作,循环结束,循环初始化,Y,N,各个环节任务:,一,初始化部分,循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。,二,循环体,循环工作部分:,需多次重复处理的工作。,循环控制部分:,1.修改指针和循环控制变量。,2.检测循环条件:满足循环条件,继续循环,否则退出循环。,三.,结束部分,处理和保存循环结果。,允许0次循环的循环结构:在循环工作之前检测循环条件。,4-5-2 单重循环,简单循环结构:循环体中不套循环。,定时,例:试计算下列程序段执行时间。,程序,指令执行周期,MOV R7,,,#64H,1T,LOOP,:,NOP,1T,NOP,1T,DJNZ R7,,,LOOP,2T,解:上述程序显然属于循环程序,其算法结构如图所示。循环次数,100,次,根据每条指令的执行周期可得每次循环消耗,1+1+2=4,(机器周期),加上第一条指令,整个程序段共计消耗时间为(,4100+1,),T=401T,,当晶振频率为,6MHZ,时,,T=2s,,故上述程序实际消耗,802s,。,SUM:MOVR0,#42H;,设指针,MOVA,R0,MOVR2,A ;,循环计数器,n,CLRA ;,结果单元清0,MOVR3,A,;进位数据存,R3,ADD1:INCR0 ;,修改数据指针,ADDA,R0 ;,累加,JNC NEXT ;,无进位转,NEXT,INCR3 ;,有进位,高字节加1,NEXT:DJNZ R2,ADD1;,循环控制:数据是否加完?,MOV40H,A ;,循环结束,保存结果,MOV41H,R3,RET,例:求,n,个单字节数据的,累加和,.,设数据串在43,H,起始的单元,数据串长度在42,H,单元,,累加和,不超过2个字节,存在,40H,和,41H,中。,例 比较两个数据串是否完全相等,若完全相等,,A=0;,否则,A=FFH。,PMT:MOVR2,A,;,设数串长度,CHC:MOVA,R0,;,各取数串中的一个数,MOV42H,R1,CJNE A,42H,NOM,;,是否相等?不相等转移,INCR0,;,相等,修改指针,INCR1,DJNZ R2,CHC,;,全部比较完?,MOVA,#0,;,完全相等,SJMP PEND,NOM:MOVA,#0FFH,;,不完全相等,PEND:RET,4-5-3,多重循环,循环体中套循环结构。以双重循环使用较多。,软件延时程序。用循环程序将指令重复多次执行,实现软件延时。,试计算延时程序的执行时间。,源程序指令周期(,M),指令执行次数,DELAY:MOV R6,#64H1,I1:MOV R7,#0FFH1,I2:DJNZ R7,I22,DJNZ R6,I12,RET2,延时时间计算:(设时钟,f=12MHz,,,M=1s),t=(11+1100+2100255+2100+21)M=51.3 ms,1,100,100,255,100,1,习题:,试计算延时程序的执行时间。,源程序指令周期(,M),指令执行次数,DELAY:MOV R6,#1001,D1:MOV R7,#101,D2:NOP1,DJNZ R7,D22,DJNZ R6,D12,RET2,计算延时程序的执行时间(设时钟,f=6MHz),。,4-6,子程序,子程序:能完成某项特定功能的独立程序段,可被反复调用。,4-6-1 子程序设计,一子程序入口用标号作为,子程序名,。,二调用子程序之前设置好,堆栈,。,三用,返回指令,RET,结束子程序,并保 证堆栈栈顶为调用程序的返回地址。,四.子程序嵌套须考虑堆栈容量。,五.提供足够的调用信息:,如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,4-6-4 子程序的类型,按子程序与主程序之间传递参数的方式分类。,入口参数:调用子程序之前,需要传给子程序的参数。,出口参数:子程序送回调用程序的结果参数。,选用不同
展开阅读全文