320 likes | 466 Views
第四章 汇编语言实用程序设计. 教学目标. 掌握程序的编辑和汇编方法 掌握伪指令的使用方法 掌握汇编程序的三种基本结构及设计程序的基本方法 具备常用典型实用程序设计能力 。. §4.1 汇编语言源程序的编辑和汇编 §4.2 实用程序举例. 教学内容. §4.1 汇编语言源程序的编辑和汇编. §4.1.1 源程序编辑 §4.1.2 源程序的汇编 §4.1.3 伪指令. §4.1.1 源程序编辑. 在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软件。. §4.1.2 源程序的汇编.
E N D
教学目标 • 掌握程序的编辑和汇编方法 • 掌握伪指令的使用方法 • 掌握汇编程序的三种基本结构及设计程序的基本方法 • 具备常用典型实用程序设计能力。
§4.1汇编语言源程序的编辑和汇编 §4.2 实用程序举例 教学内容
§4.1 汇编语言源程序的编辑和汇编 §4.1.1 源程序编辑 §4.1.2 源程序的汇编 §4.1.3 伪指令
§4.1.1 源程序编辑 • 在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软件。
§4.1.2 源程序的汇编 • 汇编:将汇编语言源程序转换为机器码表示的目标程序的过程。对单片机有: 一、手工汇编 二、机器汇编 三、反汇编
一、手工汇编 • 通过手工方式查指令编码表,逐个把助记符指令“翻译”成机器码,然后把得到的机器码程序键入单片机,进行调试和运行。 • 手工汇编的缺点: 1、偏移量的计算容易出错。 2、程序的修改会引起后面指令地址的变化,转移指令的偏移量也要重新计算。
二、机器汇编 • 机器汇编是在计算机上使用交叉汇编程序进行源程序的汇编。汇编工作由机器自动完成,最后得到以机器码表示的目标程序。
三、反汇编 • 将二进制机器语言程序翻译成汇编语言程序的过程称反汇编。 • 汇编和反汇编的过程如图4-3所示。
汇编(汇编程序) 源程序 (汇编语言) 目标码 (机器语言) 反汇编(汇编程序) 图4-3 汇编和反汇编过程
§4.1.3 伪指令 • 伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。
ORG 汇编起始命令 • 格式:ORG 16位地址 • 功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。例如: ORG 2000H START:MOV A,#64H ┇ • 规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。
END 汇编结束指令 • 格式:END • 功能:通知汇编程序结束汇编,在END之后所有的汇编指令均不予以处理。
EQU 赋值命令 • 格式:字符名称 EQU 项(数或汇编符号)。 • 功能:把“项”赋给“字符名称”。 • 注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。EQU赋值过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是8位的,也可以是16位的。 • 例如:
EQU 赋值命令 例1: AA EQU R1 MOV A,AA;AA代表工作寄存器R1 例2: A10 EQU 10 DELY EQU 07EBH MOV A,A10;A10作为片内的一个直接地址 LCALL DELY;DELY作为一个16位子程序的入口地址
DATA 数据地址赋值命令 • 格式:字符名称 DATA 表达式 • 功能:与EQU类似,但有以下差别: • 1、EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。 • 2、用EQU伪指令可以把一个汇编符号赋给一个名字,而DATA只能把数据赋给字符名。 • 3、DATA语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。DATA伪指令在程序中用来定义数据地址。
DB 定义字节命令 • 格式:DB(项或项表) • 功能:通知汇编程序从当前ROM地址开始,保留一个字或字节串的存储单元,并存入DB后的数据。 • 注意:项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的ASCII字符串。 • 例如:
DB 定义字节命令 ORG 2000H DB 0A3H LIST:DB 26H,03H STR:DB ‘ABC’ ┇ 经汇编后(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H, (2004H)=42H, (2005H)=43H,(41H,42H,43H分别为A,B,C的ASCII码)
DW 定义字命令 • 格式:DW 16位数据项或项表 • 功能:把DW后的16位数据项或项表从当前地址连续存放。每项数值为16位二进制数,高8位先放,低8位后存放。DW用于定义一个地址表。 • 例如:
DW 定义字命令 ORG 1500H TABLE:DW 7234H,8AH,10H ┇ 经汇编后(1500H)=72H, (1501H)=34H, (1502H)=00H, (1503H)=8AH, (1504H)=00H, (1505H)=10H,
DS 定义存储空间命令 • 格式:DS 表达式 • 功能:在汇编时,从指定地址开始保留DS之后表达式的值所规定的存储单元以备后用。 • 例如: ORG 1000H DS 08H DB 30H,8AH 汇编后,从1000H保留8个单元,然后从1008H按DB命令给内存赋值,即(1008H)=30H (1009H)=8AH
BIT 位地址符号命令 • 格式:字符名 BIT 位地址 • 功能:把BIT后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字符名是必须的。 • 例如: • A1 BIT P1.0 • A2 BIT 02H • 汇编后,P1口第0位的位地址90H就赋给了A1,而A2的值则为02H。
4.2 实用程序举例 • 延时程序 • 代码转换 • 排序
延时程序 编写一段延时程序 ORG 2000H ;周期数×执行次数 MT EQU 30H MOV R0,#MT ;1×1 DL:NOP ;1×MT NOP ;1×MT DJNZ R0,DL ;2×MT
延时程序 该程序的延时时间与系统所用的晶振和程序中每条指令的机器周期及其执行次数MT有关。设系统晶振为12MHz,则可知一个机器周期为: T=1s/(12×106 )×12=1us 延时时间=T×(1×1+1×MT+1×MT+2×MT)=1us×(1+MT+MT+2MT) (式1) 应用时给出需要的延时时间,就可求出MT值。例如用上例完成1ms延时,根据式1可知,MT=250=0FAH,将0FAH代入程序循环次数MT中,就可完成1MS的延时程序设计。
延时程序 用双重循环完成延时程序(可增加延时时间) MT1 EQU 30H MT2 EQU 30H MOV R0,#MT1 ;1×1 DL1:MOV R1,#MT2 ;1×MT1 DL2:NOP ;1×MT2×MT1 NOP ;1×MT2×MT1 DJNZ R1,DL2 ;2×MT2×MT1 DJNZ R0,DL1 ;2×MT1
延时程序 设晶振仍为12MHz,则上面程序的执行时间T为: T=0.1us×(1+1×MT1+1×MT2×MT1+1×MT2×MT1+2×MT2×MT1+2×MT1) (式4-2) 应用时,可根据所需的延时时间,先选定常数MT2 如取它的最大值FFH,再根据式
代码转换 • 已知20H单元存放一个二进制数,编程将它转换为BCD数,百位送入FIRST单元的低四位,十位和个位分别送入SECOND单元的高四位和低四位。 本题只需将20H单元中内容除以100,得到的商就是百位BCD数,然后用余数除以10,其结果中,商为十位BCD数,余数为个位BCD数。
代码转换 FIRST DATA 30H SECOND DATA 31H MOV A,20H ;被除数送A MOV B,#64H ;除数100送B DIV AB ;A除以B MOV FIRST,A ;百位BCD数送FIRST MOV A,B ;余数送A MOV B,#0AH ;除数10送B DIV AB ;A除以B SWAP A ;十位BCD数送高四位 ORL A,B ;十位和个位BCD数组合成一个字节 MOV SECOND,A ;送入SECOND单元 SJMP $ ;结束
排序 • 将片内RAM 30H开始的连续16个单元的数据按从小到大的顺序排序。 • 此题采用的是冒泡排序法.即对这16个数据组成的数据串,依次将相邻两数分别进行比较,若后面的数小于前面的数,则比较的相邻两数互换,且置位地址单元7FH为1。若这组数据比较完后,相邻两数有交换(即交换标志位7FH为1),则再重新进行两两比较,直到16个数已从小到大排序,相邻两数比较后不再交换为止。交换标志位7FH用来控制是否再需要重新两两比较。
SORT: MOV R1,#30H ;指向数据块首地址 MOV R7,#10H ;数据块长度送R7 CLR 7FH ;交换标志位清零 DEC R7 ;块长减1为比较次数 LOOP1:MOV A,@R1 ;取相邻两数中的前一个数 MOV 20H,A INC R1 MOV A,@R1 ;取相邻两数中后一个数 CJNE A,20H,LOOP ;相邻两数比较 LOOP: JC NEXT ;前者小于后者转至NEXT XCH A,20H ;前者大于后者,相邻两数互换 MOV @R1,A DEC R1 MOV @R1,20H INC R1 ;恢复数据块指针 SETB 7FH ;置“1”标志位 NEXT:DJNZ R7,LOOP1 ;所有相邻两数未比较完,转LOOP1 JB 7FH, SORT ;交换标志位为1,转SORT RET