380 likes | 524 Views
第四章 汇编语言程序设计 §4-1 汇编语言程序设计基础 §4-2 伪指令 §4-3 典型应用程序设计举例. §4-1 汇编语言程序设计基础 返回 一、汇编语言程序设计步骤 用汇编语言编程时,编程者可以直接操作到机器内部的寄存器及存储单元,能把处理过程刻画得非常具体。因而通过优化能编制出高效率的程序,既可节省存储空间又可提高程序执行的速度。因此,在实时控制的场合下通常采用汇编语言进行程序设计。微型机的监控程序多采用汇编语言编写。对于单片机应用系统,通常都用汇编语言编写程序。用汇编语言编制程序的过程,称为汇编语言程序设计。
E N D
第四章 汇编语言程序设计 §4-1 汇编语言程序设计基础 §4-2 伪指令 §4-3 典型应用程序设计举例
§4-1 汇编语言程序设计基础 返回 • 一、汇编语言程序设计步骤 • 用汇编语言编程时,编程者可以直接操作到机器内部的寄存器及存储单元,能把处理过程刻画得非常具体。因而通过优化能编制出高效率的程序,既可节省存储空间又可提高程序执行的速度。因此,在实时控制的场合下通常采用汇编语言进行程序设计。微型机的监控程序多采用汇编语言编写。对于单片机应用系统,通常都用汇编语言编写程序。用汇编语言编制程序的过程,称为汇编语言程序设计。 • 通常,汇编语言程序设计的步骤如下: • 1、 建立数学模型 • 建立数学模型就是根据设计任务或将控制对象的物理过程归纳、抽象为数学表达式。 • 2、 选择适当的算法 • 一个数学表达式,往往可用不同的算法实现,此时应结合所用的机器的指令系统,对不同的算法进行分析比较,选择一种最佳算法(即实现此算法的程序所占内存少且执行速度快,但是两者往往是相互矛盾的,应根据具体情况进行选择)。
3、 程序结构的设计 • 程序结构设计是把所采用的算法转化为汇编语言程序的准备阶段。如果课题较小且算法简单,这一步骤可以省掉,直接编写程序,如果是大型课题,由于情况复杂,所以需要进行程序结构设计。它可以分模块化程序设计、结构程序设计及自顶向下设计等。 • 4、 编制汇编语言程序的调试 • 根据确定的算法及所选用的程序结构就可以绘制流程图(如算法简单,这一步骤可省略),根据流程图并结合所选用的指令系统就可写出相应的汇编语言源程序。 • 5、 汇编语言程序的调试 • 当一个汇编语言程序编好后必须进行调试,因为所编制的程序难免有错误并且程序需要优化。
整个汇编程序设计的流程见图4-1: • 图4-1 汇编语言程序设计流程图
二、编制程序流程图 • 1、程序流程图的作用 • 由于流程图采用图解表示法,因此它能直观形象地表示各部分的逻辑关系及程序结构,利用流程图能方便地发现和分析程序算法存在的错误。另外,它便于掌握和进行交流。所以,它是程序设计的重要工具。 • 2、程序流程图的组成 • 程序流程图是用几何图形(方框和圆框),流线及文字说明来描述计算过程的框图。它不但能形象地描述程序执行的过程而且清楚地表达程序结构的内在联系。流程中所采用的各种常用符号如下: • 1)端点框 • 如图4-2(1)所示,表示程序的开始或结束。 2)流程线 • 如图4-2(2)所示,表示程序执行的流向。 • 3)处理框 • 如图4-2(3)所示,表示一种处理功能或过程。
4)判断框 • 如图4-2(4)所示,用于批示一个判定点,从这点开如产生分支。 • 5)连接框 • 如图4-2(5)所示,表示流程中止而并非流程结束。通常用于连接 同一而的流程。以避免流程线的交叉;也可用于连接不同页上的流 程,注意连接处的连接框的标识符要相同。 • 6)子程序框 • 如图4-2(6)所示,表示调用子程序。在该框内填入相应的子程序 名称或入口地址。
§4-2 伪指令及汇编返回 • 一、伪指令 • “伪指令”是用于告诉汇编程序(汇编程序是一种翻译程序,将用汇编语言写的程序翻译成机器程序语言程序)如何进行汇编的指令,它既不控制机器的操作也不能被汇编成机器代码(汇编语言的指令和机器语言的指令有一一对应的关系),只能被汇编程序所识别并指导如何进行,故称为“伪指令”。MCS-51系列单片机的常用伪指令如下: • 1、起始地址伪指令ORG(Origin) • 格式: [标号:] ORG 16位地址 • 功能:用于规定目标程序段或数据块的起始地址。 • 2、汇编结束伪指令END • 格式:[标号:] END • 功能:END是汇编语言源程序的汇编结束标志,在它后面所写的指令均不处理。在一个程序中只能出见一条END语句,而且必须安排在源程序的末尾。
3、赋值伪指令EQU • 格式:字符名称 EQU 数或汇编符号 • 功能:将一个数或特定的汇编符号赋予规定的字符名称。先定义后使用。 • 4、定义字节伪指令DB • 格式:[标号:] DB 8位(二进制)数据表 • 功能:定义程序存储器从标号开始的连续单元,用来存放常数、字符和表格。 • 5、定义字伪指令DW • 格式:[标号:] DW 16位(二进制)数据表 • 功能:同DB,不同的是为16位数据。 • 由于一个字长为16位,故要占据两个存储单。在MCS-51单片机系统中,16位数据的高8位存入低地址单元,低8位存入高地址单元。
6、数据地址赋值伪指令DATA • 格式:字符名称 DATA 表达式 • 功能:将数据地址或代码地址赋予规定的字符名称 • DATA伪指令的功能和EQU伪指令,但DATA伪指令所定义的符号可先使用后定义,在程序它常用来定义数据地址。该语句一般放在程序的开头或末尾。 • 7、定义空间伪指令DS • 格式:DS 表达式 • 功能:从指定的地址单元开始,保留由表达式指定的若干字节空间作为备用空间。 • 注意:对于MCS-51系列单片机,DB、DW、DS伪指令只能用于程序存储器而不能用于数据存储器。 • 8、位地址赋值伪指令BIT • 格式:字符名称 BIT 位地址 • 功能:把位地址赋予规定的字符名称,常用于位处理的程序中。
二、汇编程序的汇编过程 • 用汇编语言编写的源程序必须通过汇编程序的汇编才能将源程序转换成相应的目标程序。 • 大多数微型机的汇编程序是两次扫描汇编程序。在汇编程序中要借助于一些表格才能实现汇编。这些表格是设置在汇编程序中。在汇编时对它们进行检索和查询。第一次扫描是检查语法错误并确定符号名字,在扫描过程中建立该源程序使用的全部符号名字。在符号表中,每一个符号名字后面跟着一个对应的值(或为存储单元地址或为数)。第二次扫描是在第一次扫描所得到符号名字表的基础上将符号地址转换在真地址(称为代真);种用操作码表将助记符转换成相应的目标操作码。
简单的计算机系统中,常常不配备汇编程序,为了运行汇编语言程序可进行人工汇编。由程序员根据指令表一条一条地将汇编语言程序的语句翻译成机器代码指令,最后得到可运行的目标程序。在人工汇编时同样采用两次汇编方法:第一次汇编确定各条指令(第一字节)的地址并翻译出各条指令的机器码,对于程序中出现的各种标号暂不处理,仍用原来的符号,而对其中有明确定义者,则用其定义值来代替;第二次汇编进行标号的“代真”,即求出标号所代表的具体地址或者地址偏移量,经过两次汇编可将源程序转换成相应的目标程序。简单的计算机系统中,常常不配备汇编程序,为了运行汇编语言程序可进行人工汇编。由程序员根据指令表一条一条地将汇编语言程序的语句翻译成机器代码指令,最后得到可运行的目标程序。在人工汇编时同样采用两次汇编方法:第一次汇编确定各条指令(第一字节)的地址并翻译出各条指令的机器码,对于程序中出现的各种标号暂不处理,仍用原来的符号,而对其中有明确定义者,则用其定义值来代替;第二次汇编进行标号的“代真”,即求出标号所代表的具体地址或者地址偏移量,经过两次汇编可将源程序转换成相应的目标程序。
§4-3 典型应用程序的设计返回 • 汇编语言是面向机器的语言,汇编语言程序设计与所用的机器、机器所采用的微处理器的内部结构都有密切的关系,单片机的汇编语言程序设计也是如此,必须充分了解所使用机器的“硬件环境”,才能着手进行汇编语言程序设计。特别是编制I/0接口程序时还需了解接口电路、机器及外设的外特性例如:输入、输出信号、负载能力等。另外,对于同一个问题往往编制出不同的程序,那么如何判断一程序的优劣呢?通常从三个方面来衡量: • 其一、该程序所占用的存储空间,以少为好; • 其二、程序运行的时间,以短为好; • 其三、程序的编制、调试及排错所需时间,以短为好。 • 除此以外,还要求程序清晰易读以及易于移植等。 • 为了设计一个高质量的程序,必须掌握程序设计的一般方法。在汇编语言程序设计中,普通采用结构化程序设计方法。这种设计方法只有一个入口和出口(见图4-3),整个程序也只有一个入口和出口。结构程序设计的特点是程序的结构清晰,易于读写,易于验证,可靠性高,一面主要介绍结构化程序设计中的三种基本的程序设计方法。
一、简单程序的设计 • 例4-1已知两个压缩BCD码分别放在内部RAM的 • 31H30H和33H 32H等4个单元中,试编程求和,结果存入 • R4R3R2中。 • 分析:流程如右图所示: • 程序如下: • ORG 0000H • LJMP MAIN • ORG 0040H • MAIN: MOV A, 30H • ADD A, 32H • DA A • MOV R2,A • MOV A,31H • ADDC A,33H • DA A
MOV R3,A • CLR A • MOV ACC.0,C • MOV R4, A • HERE: SJMP HERE • END • 例4-2利用查表指令将内部RAM中20H单元的压缩BCD码拆开,转换成相应的ASCII码,存入21H、22H中,高位存在22H。 • 分析:控制流程图(略),程序如下: • START: MOV DPTR,#TABLE • MOV A, 20H • ANL A, #0FH • MOVC A, @A+DPTR • MOV 21H, A • MOV A, 20H • ANL A, #0F0H • SWAP A • MOVC A, @A+DPTR
MOV 22H, A • SJMP $ • TABLE: DB 30H,31H,32H,33H,34H DB 35H,36H,37H,38H,39H • 二 、分支程序设计 • 1、单分支程序 • 单分支结构程序使用转移指令实现,即根据条件对程序的执行进行判断,满足条件是转移执行,否则按顺序执行。 • 在MCS-51指令系统中条件转移指令有: • (1)判A转移指令JZ、JNZ; • (2)判位转移指令JB、JNB、JBC、JC、JNC; • (3)比较转移指令CJNE; • (4)减1不为0转移指令DJNZ;
例4-3假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1、ST2单元中分别存放着两个8位无符号数,要求找出其中的大数并存入ST3单元。例4-3假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1、ST2单元中分别存放着两个8位无符号数,要求找出其中的大数并存入ST3单元。 • 分析:两个无符号数的大小比较可利用两数相减是否有借位来判断,流程图和程序如下所示: START:CLR C • MOV DPTR,#ST1 • MOVX A, @DPTR • MOV R7, A • INC DPTR • MOVX A, @DPTR • SUBB A, R7 • JC BIG1 • MOVX A, @DPTR • SJMP BIG2 • BIG1: XCH A, R7 • BIG2: INC DPTR • MOVX @DPTR,A • SJMP $
2、多分支程序 • (1)嵌套分支结构 • 例4-4 设变量X存放于30H单元,函数值Y存放 • 31H单元。试按照式: • 1 X>0 • Y= 0 X=0 的要求给Y赋值 • -1 X<0 • 分析:X是有符号数,判断符号位是0还是1可利用JB或JNB指令。 • 判断X是否等于0则直接可以使用累加器A的判0指令。流 • 程、程序如下页:
START: MOV A,30H JZ OVER • JNB ACC.7,LAB1 • MOV A, #0FFH • SJMP OVER • LAB1: MOV A, #1 • OVER: MOV 31H, A • SJMP $
(2)多重分支结构 • 利用MCS-51单片机的散转指令JMP @A+DPTR,可方便地实现多重分支控制,因此,又称为散转程序。假定多路分支的最大序号为n,则分支的结构如图所示。
例4-5根据条件0、1、2 …、n,分别转向处理程序PRG0、 • PRG1、…、PRGn,条件K设在R2中。 • START: MOV DPRT, #TABLE • MOV A, R2 • ADD A, R2 • JNC NEXT • INC DPH • NEXT: JMP @A+DPTR • TABLE: AJMP PRG0 • … … • AJMP PRGn • PRG0: … • … … • PRGn: …
三、循环程序设计 • 1、循环程序的结构 • 循环程序包括以下四个部分: • 置循环初值 • 循环体 • 循环控制变量修改 • 循环终止控制 • 常用于循环控制的指令有: • DJNZ、CJNE、JC、JNC • 等控制类指令。
2、单循环 • 终止循环控制采用计数的方法,即用一个寄存器作为循环次数计数器,每次循环后计数加1或减1,达到终止值后退出循环。 • 例4-6计算50个8位二进制数(单字节)之和。 • 要求:50个数存放在30H开头的内部RAM中,和放在R6R7中。 • 分析:采用DJNZ循环体的流程框图如下页所示,在参考程序中,R0为数据地址指针,R2为减法循环计数器。 • 在使用DJNZ控制时,循环计数器初值不能为0,当为0时,第一次进入循环执行到DJNZ时,减1使R2变为FFH,循环次数成了256,显然不合题意。 • START: MOV R6, #0 • MOV R7, #0 • MOV R2, #50 • MOV R0, #30H • LOOP: MOV A, R7 • ADD A, @R0
MOV R7, A • CLR A • ADDC A, R6 • MOV R6, A • INC R0 • DJNZ R2, LOOP • SJMP $ • 其流程图如右图所示。
3、多重循环 • 如果在一个循环程序中嵌套了其他的循环程序,称为多重循环程序。在用软件实现延时时显得特别有用。 例4-7设计1秒延时子程序,假设fosc=12MHz。 分析:软件延时与指令的执行时间关系密切,在使用12MHz晶振时,一个机器周期的时间为1us,执行一条DJNZ指令的时间为2us,我们可以采用三重循环的方法写出延时1秒的子程序流程、程序如下所示: • DELAY: MOV R7, #10; • DL3: MOV R6, #200 ; • DL2: MOV R5, #250 ; • DL1: DJNZ R5, DL1 ; • DJNZ R6, DL2 ; • DJNZ R7, DL3 ; • RET
4、按条件转移控制的循环 • 例4-8把内部RAM中从ST1地址开始存放的数据传送到以ST2开始的存储区中,数据块长度未知,但已知数据块的最后一个字节内容为00H,而其它字节均不为0。并设源地址与目的地址空间不重复。 • 分析:显然,我们可以利用判断每次传送的内容是否为 0 这一条件来控制循环。也可用CJNE来比较与0是否相等设计。利用判A转移控制的循环流程图如下图所示
其程序为: • START: MOV R0, #ST1 • MOV R1, #ST2 • LOOP: MOV A, @R0 • JZ ENT • MOV @R1,A • INC R0 • INC R1 • SJMP LOOP • ENT: RET
四、查表程序设计 • 用于查表的指令有两条: • MOVC A,@A+PC; • MOVC A,@A+DPTR; • 当使用DPTR作为基址寄存器时查表比较简单,查表的步骤分三步 • 1)基址(表格首地址)送DPTR数据指针; • 2)变址值(在表中的位置是第几项)送累加器A; • 3)执行查表指令MOVC A,@A+DPTR,进行读数,查表结果送回累加器A。 • 当使用PC作为基址寄存器时,由于PC本身是一个程序计数器,与指令的存放地址有关,查表时其操作有所不同。查表的步骤也分三步: • 1)变址值(在表中的位置是第几项)送累加器A; • 2)偏移量(查表指令的下一条指令的首地址到表 格首地址之间的字节数)+ A → A;(修正) • 3)执行查表指令MOVC A,@A+PC。 • 例4-9二位十六进制数与ASCII码的转换程序。设数值在R2中,结果低位存在R2中,高位存在R3中。 • 分析:对于2位16进制数必须进行2次查表,因此,取数后通过屏蔽的方法来实现高低位分开。
1、利用DPTR作基址的参考程序如下 • HEXASC: MOV DPTR, #TABLE • MOV A, R2 • ANL A, #0FH MOVC A, @A+DPTR ;查表 • XCH R2, A • ANL A, #0F0H SWAP A • MOVC A, @A+DPTR ;查表 • MOV R3, A RET • TABLE: DB 30H,31H,32H,33H,34H ;ASCII表 • DB 35H,36H,37H,38H,39H • DB 41H,42H,43H,44H,45H,46H
2、利用PC作基址的参考程序如下: • HEXASC: MOV A, R2 • ANL A, #0FH ADD A, #9 • MOVC A, @A+PC ;查表 • XCH R2, A ANL A, #0F0H • SWAP A • ADD A, #2 • MOVC A, @A+PC ;查表 • MOV R3, A RET • TABLE: DB “0”,“1”,…,“F” ;ASCII表
例4-10 利用查表指令,根据R2的分支序号找到对应的转向入口地址送DPTR,清ACC后,执行散转指令JMP @A+DPTR,转向对应的分支处理,假定分支处理程序在ROM 64KB的范围内分布。 • 程序如下: • ORG 1000H • START: MOV DPTR, #TAB • MOV A, R2 • ADD A, R2 • JNC ST1 • INC DPH • ST1: MOV R3, A • MOVC A, @A+DPTR ;查表 • XCH A, R3 • INC A
MOVC A, @A+DPTR • MOV DPL,A • MOV DPH,R3 • CLRA • JMP @A+DPTR • TAB: DW PRG0 • DW PRG1 • … …
五、模拟组合逻辑的程序设计 • 在测控系统中单片机能够充分发挥它的长处。在MCS-51指令系统中具有位操作指令。位操作指令的一个典型应用就是模拟组合逻辑电路(逻辑仿真)。在进行逻辑仿真之前,必须把逻辑图或真值表转化为相应的布尔表达式;再进行化简,以优化仿真程序。用软件模拟组合逻辑电路的优点就是成本低、灵活性好,但输出与输入之间有一定的时间延迟。 • 例4-11 试用软件模拟图4-4所示的组合逻辑电路的功能 • 分析:无论组合逻辑电路的复杂程序如何,当 • 用软件模拟其功能时,可以以每个逻辑门为单位逐 • 级进行模拟。这样编程规律较强而且不容易出错。 • 本题的解是用软件实现 • 的逻辑功能。逻辑式中的Xi为输入变量, • 在实际应用中它们可以是单片机I/O口线的状态 • 或是SFR中的某些控制位,也可以是用户在片内RAM中定义的某些位,在使用它们之前必须先定义。否则程序不能正常运行。相应的程序如下:
ORG 1000H • X0 BIT 30H • X1 BIT 31H • X2 BIT 32H • X3 BIT 33H • X4 BIT 34H • X5 BIT 35H • X6 BIT 36H • MOV C,X2 • ORL C,/X1 • ANL C,X0 • MOV F,C • MOV C,X4 • ANL C,/X3
MOV E,C • MOV C,X5 • ORL C,X6 • ANL C,/E • ORL C,F • CPL C • MOV F,C • END。
本章小结 • 1、程序设计基本概念 • 1)标号、操作码、操作数、注解 • 2)伪指令:ORG、DB、DW • 3)程序状态字PSW • 2、简单程序设计、循环程序设计、分支程序设计、查表程序设计、应用程序设计。 • 重点:汇编程序结构、控制流程设计,汇编程序阅读、设计,应用程序设计。 • 难点:汇编程序结构、控制流程,应用程序设计。