1、第3章 概 述 MCS-51单片机的编程语言可以是汇编语言也可以是高级语言(如C语言),高级语言编程快捷,但程序长,占用存储空间大,执行慢;汇编语言产生的目标程序简短,占用存储空间小,执行快,能充分发挥计算机的硬件功能。无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)单片机才能执行。,支持写入单片机或仿真调试的目标程序有两种文件格式: BIN文件和 HEX文件, BIN文件是由编译器生成的二进制文件,是程序的机器码, HEX文件是由INTEL公司定义的一种格式,这种格式包括地址、数据和校验码,并用ASCII码来存储,可供显示和打印。HEX文件需通过符号转换程序OHS51进行转换两种语言的操作过程见图3-1。,连接/定位器 L51,汇编语言 源程序,汇编器A51,符号转换程序OHS51,绝对地址目标程序 .BIN,C语言程序,浮动地址目标程序,编译器C51,HEX,图 3-1 两种语言源程序转换成目标程序,汇编: 将汇编语言源程序转换成机器语言目标程序的过程称为汇编。(翻译) 汇编程序: 能将汇编语言源程序转换成机器语言目标程序的系统软件称为汇编程序。 (翻译官) 汇编语
2、言源程序:用户用汇编语言助记符编的应用程序。,汇编(编译)的方法有两种: 1.手工汇编: 人工查指令表,查出程序中每条指令对应的机器代码。早期的计算机使用。,2.机器汇编 用计算机中的汇编程序对用户源程序进行汇编。 用机器汇编要提供给汇编一些信息,遵循汇编程序的一些约定。这些由伪指令指定。 目前很多公司将编辑器、汇编器、编译器、连接/定位器、符号转换程序做成集成软件包,用户进入该集成环境,编辑好程序后,只需点击相应菜单就可以完成上述的各步,如WAVE、KEIL 。 WAVE 、KEIL集成软件的使用见教材附录。,汇编语言源程序设计步骤,1.确定方案和计算方法 2.了解应用系统的硬件配置、性能指标。 3.建立系统数学模型,确定控制算法和操作步骤。 4.画程序流程图, 确定程序的流向。 5. 编制源程序。 (1)合理分配存储器单元和了解I/O接口地址。 (2)按功能设计程序,明确各程序之间的相互关系。 (3)用注释行说明程序,便于阅读和修改调试和修改。,3.2 伪 指 令 常用伪指令及功能:,1. 起始指令 ORG nn 功能:定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn
3、为起始地址,连续存放在程序存储器中。 指令地址 机器码 源程序 ORG 2000H 2000H 78 30 MAIN: MOV R0,#30H 2002H E6 MOV A,R0 ,ORG 3000H 3000H 23 TAB: DB 23H,100,A 3001H 64 3002H 41,2.字节定义 标号: DB(字节常数,或字符或表达式) 功能:指示在程序存储器中以标号 为起始地址的单元里存放的数为 字节数据(八位二进制数)。 例如 LN:DB 32 ,C,25H,-1 ;LNLN+2 地址单元依次存放 20H , 43H , 25H ,FFH,3. 字定义 标号:DW (字常数或表达式) 作用:指示在程序存储器中以标号为 起始地址的单元里存放的数为字数据 (即16位的二进制数), 例如:GH :DW 1234H,5678H,08,5. 等值指令 标号 EQU(数值表达式) 表示EQU两边的量等值,用于为标号或标识符赋值。 例如: X1 EQU 2000H X2 EQU 0FH MAIN: MOV DPTR,#X1 ; DPTR=2000H ADD A,#X2 ; A=A+0FH
4、,4保留字节 标号:DS (数值表达式) 作用: 指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。 例如 L1:DS 32 ; 从L1地址开始保留32个存储单元。,6. 位定义 标号 BIT 位地址 作用: 同EQU指令,不过定义的是位操作地址。 例如 AIC BIT P1.1。,7. 汇编结束 END 作用: 指示源程序段结束。 END指令放在程序的最后。 A51汇编程序还有一些其它的伪指令,列在教材表3-1中,以备查阅。,例3-1 编程将外部数据存储器的000EH和000FH单元的内容相换。 分析: 外部数据存储器的数据操作只能用MOVX指令,且只能和A之间传送,因此必须用一个中间环节作暂存,设用20H单元。用R0、R1指示两单元的低八位地址,高八位地址由P2指示。编程过程如下:,常用程序结构 顺序程序、分支程序、循环程序、子程序,3.3 顺序程序设计 顺序结构是按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止。,ORG 0000H MOV P2, #0H ;送地址高八位至P2口 MOV R0, #0EH ;R0= 0EH MOV
5、 R1, #0FH ;R1=OFH MOVX A, R0 ;A=(000EH) MOV 20H, A ;(20H)=(000EH) MOVX A, R1 ;A=(000FH) XCH A, 20H ; A=(000EH),(20H)=(000FH) MOVX R1, A MOV A, 20H MOVX R0, A ;交换后的数送各单元 SJMP $ END,ORG 0000H MOV A,R4 JB ACC.7, CPLL ;判符号位 SJMP $ ;正数的补码原码 CPLL: MOV A,R5 ;取低字节 CPL A ADD A,#1 ;低字节变补 MOV R5,A MOV A,R4 ;取高字节 CPL A ADDC A,#0 ;高字节变补 ORL A, #80H ; 恢复负号 MOV R4,A SJMP $,例3-2:将R4R5双字节有符号数求补码,结果送原单元的程序。,例3-3 分解压缩式BCD码,使其成为非压缩式BCD码。,05,06,ORG 0000H MOV R0,#40H ;设指针 MOV A,R0 ;取一个字节 MOV R2,A ;暂存 ANL A,#0FH ;清0高半
6、字节 INC R0 MOV R0,A ;保存数据个位 MOV A,R2 SWAP A ;十位换到低半字节 ANL A,#0FH INC R0 MOV R0,A ;保存数据十位 SJMP $,例3-5 设变量放在片内RAM的20H单元,其值为00H05H 之间,要求编查表程序,查出变量的平方值, 并放入片内RAM的21H单元。,分析 :在程序存储器安排一张平方表,首地址为TAB,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,A+DPTR,即可求得。 表中数据用BCD码存放合乎人们的习惯. ORG 0000H MOV DPTR, #TAB MOV A, 20H MOVC A, A+DPTR ;查表 MOV 21H,A SJMP $ TAB2: DB 00H,01H,04H,09H,16H,25H END,ORG 0000H MOV A,R2 JNB ACC.7,N ;为正数? CPL A ;负数变补 INC A MOV R2,A N: SJMP $ ;结束,3.4 分支程序的设计 由条件转移指令构成程序判断框部分,形成分支结构,3.4.1 单分支程序 一个判断决策框,两种分
7、支结构图。,例1 求8位有符号数的绝对值。 方法:正数不变,负数变补,3G因重复使用,先暂存在R2。流程见左, 程序如下:,例2 用单片机加重力传感器作磅秤,秤出重量后算出行李运费价格,其秤出的重量以10kg为1个计价单位G , G已存入40H单元。 计价方法为50kg以内按3元, 50kg以上分段计价: 50kg按3元计价, 超过部分按2元计价。 由此列出算式:,ORG 0100H FRT: MOV A,40H ;取行李重量计价单位G MOV R3,A MOV B,#03H ;运费M=G3 MUL AB MOV R2,A ;暂存3G MOV A,R3 ;取回G CJNE A,#05H,L1 ;G 5 ? SJMP WETC L1: JC WETC ;是,转至WETC SUBB A,#05H ;否则 M=3G+2(G-5) RLC A ADD A,R2 MOV R2 ,A WETC:MOV 41H,R2 ;存运费 M RET,3.4.2 多分支程序(散转程序),有一类分支程序,它根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。,多分支散转程序的设计 这类程序通常
8、利用JMP A+DPTR间接转移指令实现转移。有如下两种设计方法: 1. 查转移地址表: 将转移地址列成表格,将表格的内容作转移的目标地址。 2. 查转移指令表: 将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行,下面用两个例子说明。,1. 利用转移地址表实现转移 例3-7 根据R3的内容转向对应的程序,R3的内容为0n,处理程序的入口符号地址分别为PR0PRn (n128)。 分析:将PR0PRn入口地址列在表格中,每一项占两个单元,PRn在表中的偏移量为2n,因此将R3的内容乘2即得PRn在表中的偏移地址,从偏移地址2n和2n+1两个单元分别取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零)即转移到PRn入口执行。 这里设PR0-PRn地址 PR0 EQU 0110H ;用伪指令定义PRn的具体地址 PR1 EQU 0220H PR2 EQU 0330H,ORG 0000H MOV A,R3 ;R3A ADD A, ACC ;A*2 MOV DPTR,#TAB PUSH ACC MOVC A,A+DPTR ;取地址表中高字
9、节 MOV B,A ;暂存于B INC DPL POP ACC MOVC A,A+DPTR ;取地址表中低字节 MOV DPL,A MOV DPH,B ;DPTR为表中地址 CLR A ;A=0 JMP A+DPTR ;转移 TAB:DW PR0,PR1,PR2,PRn ;转移地址表 END,TAB,TAB+2,DPH DPL,例如 R3=1的操作,02,20,例2:通过查转移指令表实现多分支程序转移举例。 由40H单元中动态运行结果值来选择分支程序 (40H)0,转处理程序0 (40H)1,转处理程序1 (40H)n,转处理程序n 其程序段如下: START:MOV DPTR,ADDR16 ;多分支转移指令表首址送 ;DPTR MOV A,40H ;40H单元内容送A CLR C ;清CY RLC A ;A内容左移一位 JNC TABLE ;若CY0转TABEL INC DPH ;若CYl,DPH内容十1 TABEL: JMP A十DPTR ;多分支转移 ADDR16:AJMP LOOP0 ;转分支程序0 AJMP LOOP1 ;转分支程序1 AJMP LOOPn ;转分支程序n,2. 利用转移指令表实现转移,3.5 循环程序,典型循环程序包含四部分:初始化部分、循环处理部分、循环控制部分和循环修改部分。下面分别介绍这四个组成部分。 1) 初始化部分:设置循环开始
《汇编程序设计课件》由会员F****n分享,可在线阅读,更多相关《汇编程序设计课件》请在金锄头文库上搜索。