第4章80C51的汇编语言程序设计
ORL A,R1 INC DPTR MOVX @DPTR,A SJMP $ END
2013-7-26
23
例、试编写程序,将R1中的低4位数与R2中的高4 位数合并成一个8位数,并将其存放在R1中
MOV ANL MOV MOV ANL ORL A, R1 A,#0FH R1,A A,R2 A,#0F0H A,R1 ORG 0000H MOV R1,#10H MOV 30H,R1 MOV R1,#30H MOV R2,#56H MOV A,R2 XCHD A,@R1 SJMP $ END
4AH 大端模式
ORG 1400H DATA1:DW 324AH,3CH … …
2013-7-26
15
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式 LEN SUM BLOCK EQU EQU EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV 10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
30H 80H 31H 28H 32H 01H
8位二进制数表示的十进制数范围为0~255(00H~ FFH),转换后为3位十进制数,用两个字节存放。 2)解题思路 先除以100,得百位,余数再除以10得十位余数为个位 取数÷100 商为百位 余数÷10
商为十位 余数为个位
2、源程序
ORG 0000H MOV A,30H MOV B,#64H DIV AB MOV 32H,A ;取数 ;64H=100 ;÷100,A商B余 ;存百位
2013-7-26
7
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“-”、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
符号名可代表: 地址 常数 段名 字符串 寄存器名 位名 比较:标号只能是地址
2013-7-26 16
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 P1.0 0D7H ;将P1.0的位地址赋给符号名ST ;将位地址为D7H的位定义为符号名 如: ST BIT CF BIT
6
2013-7-26
ORG 0000H LJMP MAIN ORG 0040H MAIN:MOV A,#0FEH LOOP:MOV P2,A LCALL D_1s RL A AJMP LOOP
D_1s:MOV R6,#100 D10ms:MOV R5,#40 DL:MOV R4,#123 NOP DJNZ R4,$ DJNZ R5,DL DJNZ R6,D10ms RET END
伪指令主要用于指定源程序存放地址、定义符号、指定 数据存储区、汇编结束等。
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
起始地址设定伪指令ORG
ORG 8000H 表达式通常为十六进制地址,例: START:MOV A,#30H ORG可多次使用,但地址值的顺序要由小到大 … …
2013-7-26 14
0AH
12H
定义字数据表伪指令DW
[标号:] DW 字数据表 该指令是用于定义字,将项或项表中 1402H 00H 的一个字(即两个字节)的字符串数据 存入标号开始的连续单元中。项或项表 1403H 3CH 之间用逗号隔开。使用方法与DB类同。
1400H 1401H 32H
分支程序的结构特点: 根据条件的成立与否执行不同的程序段,程序有
两个或两个以上分支。
例如: 根据P1.0的值决定 执行不同的操作 分为:
二分支 三分支 散转,分支很多 P1.0=0? Y 点亮所有8个灯 8个灯交叉点亮
N
例: 从P1口输入一个数,若为正则存入30H单元,若为 负则将其取反后存入30H单元。
9
2013-7-26
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ
调试目标文件 (绝对地址) 无扩展名
可烧写 目标文件 .HEX
.LST
连接器 BL51.EXE
转换器 OH51.EXE
编译器 C51.EXE .M51
写入芯片 仿真调试
用BIT定义的“符号名”一经定义便不能重 新定义和改变
2013-7-26
17
4.3 基本程序结构
4.3.1 顺序程序
(无分支、无循环)
开始
【例4-1】片内RAM的21H单
元存放一个十进制数据十 位的ASCII码,22H单元存 放该数据个位的ASCII码。 编写程序将该数据转换成
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
指令助记符
是指令功能的英文缩写。
2013-7-26 8
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
ORG可多次使用,但地址值不能重叠 MOV DPTR,STRT 标号为符号地址其值为8000H
12
ORG
表达式
2013-7-26
ORG START:MOV MOV ORG MOV
8000H A,#30H R2,#20H 8001H A,#40H
结束汇编伪指令END END
该伪指令位于源程序的最后一行。
;查表求平方
;存平方值
TAB:DB 0,1,4,9,16
DB 25,36,49,64,81 ;0~9的平方 END
例
二翻十 8位二进制数转换成十进制数(BCD码) 设二进制数在30H单元,转换后的十进制数存入31H
和32H单元(设个位十位在31H,百位在32H中)
解: 1、确定算法
1)背景知识
80H = 128
C源文件 .C
.LST
库文件 .LIB
映像文件
2013-7-26
10
MCS-51单片机汇编语言,包含两类不同性质的指令。 (1)基本指令(指令性语句):即指令系统中的指令。它们 都是机器能够执行的指令,每一条指令都有对应的机器码。 源程序的主要功能都是由指令性语句完成。
(2)伪指令(指示性语句):汇编时用于控制汇编的指令。 它们都是机器不执行的指令,无机器码。
30H 80H 31H 28H 32H 01H
MOV A,B
MOV B,#0AH DIV ADD AB A,B
;余数→A
;0AH=10 ;÷10,A商B余
SWAP A
MOV 31H,A SJMP $ END
;交换到高四位
;拼成压缩BCD码 ;存个和十位
还有除10取余法
4.3.2 分支程序
(单分支、双分支、多分支)
工作任务符号 程序连接符号
循环扫描、处理
程序流向符号 程序流向符号
2013-7-26
4
4.1.2 程序编制的方法
对上述51单片机指令系统,要认清以下几点: 1)指令按用户规定排列形成程序,顺序存放在ROM中
2)每条指令的机器码占若干字节,一旦存放就有确定的
地址 3)PC实时指向该地址,使CPU按用户所编程序顺序执 行指令 4)跳转就是把新的目的地址送给PC
2、源程序
TAB +A (TAB+A)
ROM 0 1 4 9 16 ┇ 0的平方 1的平方 2的平方 3的平方 4的平方 ┇ 30H 31H 4
A
16
ORG 0000H
MOV A,30H MOV DPTR,#TAB
;ห้องสมุดไป่ตู้数bA ;表首地址送DPTR
MOVC A,@A+DPTR
MOV 31H,A SJMP $
2013-7-26
13
定义字节数据表伪指令DB
[标号:] DB 字节数据表
1000H 1001H
FEH
FCH
FAH 08H
该指令的功能是用于定义字节,将项或 项表中的一个字节或字符串数据存入标号 开始的连续单元中。项与项之间用逗号隔 开,项或项表若用英文单引号’’括起来 时表示为ASCII码字符串。 如: ORG 1000H DB -2,-4,-6,8,10,18 DB ‘how are you’ DB ‘4’, ‘ 6’
19
拆字程序 例: 设30H单元内容为56H,将高低四位拆开存放 在40H,和41H MOV A,30H ;取数 40H 06H ANL A,#0FH ;屏蔽高4位 41H 05H MOV 40H,A ;存低4位 42H MOV A,30H ;再取 ANL A,#0F0H ;屏蔽低4位 SWAP A ;高低4位交换 MOV 41H,A ;存高4位 与操作: 01010110B 00000110B 56H 06H
例、试编写程序,完成两个16位数的减法:7F4DH- 2B4EH,结果存入内部RAM的30H和31H单元,30H 单元存差的高8位,31H单元存差的低8位。 CLR CY MOV A,#4DH SUBB A ,#4EH MOV 31H,A ;保存低字节相减结果 MOV A,#7FH SUBB A,#2BH MOV 30H,A ;保存高字节相减结果
2013-7-26
24
例
查表法求平方值
a=b2,设b是0~9之间的一个数,存放在30H单元, 用查表法求平方值a存入31H单元。
80C51单片机的程序设计(完整版)
第四章 80C51单片微机的程序设计 单片微机的程序设计
4.1概述 概述
4.1.1 汇编语言格式
1. 计算机语言 计算机语言——机器语言、汇编语言与高级语言 机器语言、 机器语言 程序就是为计算某一算式或完成某一工作的若干指令的有序 集合。计算机的全部工作概括起来, 集合。计算机的全部工作概括起来,就是执行这一指令序列的 过程。这一指令序列称为程序。为计算机准备这一指令前的过 过程。这一指令序列称为程序。 程称为程序设计。目前, 程称为程序设计。目前,可用于程序设计的语言基本上可分为 三种:机器语言、汇编语言和高级语言。 三种:机器语言、汇编语言和高级语言。 ⑴ 机器语言 在计算机中,所有的数符都是用二进制代码来表示的, 在计算机中,所有的数符都是用二进制代码来表示的,指令 也是用二进制代码来表示。这种用二进制代码表示的指令系统 也是用二进制代码来表示。 称为机器语言系统,简称为机器语言。 称为机器语言系统,简称为机器语言。直接用机器语言编写的 程序称为手编程序或机器语言程序。 程序称为手编程序或机器语言程序。
两种语句都由四个部分组成。其中每一部分称为域也称为字段, 两种语句都由四个部分组成。其中每一部分称为域也称为字段, 各字段之间用一个空格或字段定界符分隔, 各字段之间用一个空格或字段定界符分隔,常用的字段定界符有 冒号“ ”“逗号 逗号“ 和分号“ 冒号“:”“逗号“,”和分号“;”。其中方括号括起来的是 可选择部分。 可选择部分。
标号(也称为名字 标号 也称为名字) 域: 也称为名字 用来说明指令的地址。标号可以作为LJMP、AJMP、 用来说明指令的地址。标号可以作为 、 、 LCALL及ACALL等指令的操作数。 等指令的操作数。 及 等指令的操作数 • 在指令语句中,标号位于一个语句的开头位置,由字母和数 在指令语句中,标号位于一个语句的开头位置, 符组成, 字母打头,冒号“ 结束。 符组成 , 字母打头 , 冒号 “ : ” 结束 。 在 80C51单片微机的汇编 单片微机的汇编 语言中,标号中的字符个数一般不超过8个 若超过8个 语言中,标号中的字符个数一般不超过 个,若超过 个,则以前 面的8个为有效 后面字符不起作用。 个为有效, 面的 个为有效,后面字符不起作用。 • 不能使用本汇编语言中已经定义了的符号作标号, 不能使用本汇编语言中已经定义了的符号作标号,比如指令 助记符(如 及寄存器符号名称(如 助记符 如ADD) 、伪指令 (如END) 及寄存器符号名称 如PC) 。 如 • 一条语句可以有标号,也可以没有标号, 一条语句可以有标号,也可以没有标号,标号的有无取决于 程序中的其它语句是否需要访问该条语句。 程序中的其它语句是否需要访问该条语句。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。
第4章 80C51单片机汇编语言程序设计
Chapter 4 Program Design of Assemble Language主讲教师:黄英Contents:4.1 Introduction of Assemble Language (2)4.1.1 Features (2)4.1.2 Format (2)4.2 Basic structures (2)4.2.1 Sequential program (2)4.2.2 Branching program (2)4.2.2.1 Single branching program (2)4.2.2.2. Multi-branching program (3)1.By using some CJNE instructions (3)2.By using “address table” (4)3.By using “jump instruction table” (4)4.By using stack operation (5)4.2.3 Circular Structure (5)4.3 Delay time Program (6)4.3.1 Single-cycle delay time program (6)4.3.2 Long delay time program (Multi-cycle) (6)4.3.3 Adjusting delay time range (6)4.3.4 Get different timing with basic delay program (6)4.4 Pseudoinstruction (7)4.5 How to edit and assemble the source program (7)4.1 Introduction of Assemble Language4.1.1 Features1. P roduces the optimized program.2. P rogrammer must be familiar with hardware. 3. M anage and control hardware directly . 4. N ot universal, can ’t be transplanted.4.1.2 Format (Detailed information: P77)[<Label>]: <opcode> [<operand>]; [<note>]4.2 Basic structures3 types:✧ Sequential Structure ✧ Branching Structure ✧ Circular Structure4.2.1 Sequential programFor example: 3-byte unsigned constants addition4.2.2 Branching program4.2.2.1 Single branching program·Using jump instructions :P67-68: JZ, JNZ, CJNE, DJNZ (条件转移指令) P73-74: JC, JNC, JB, JNB, JBC (位控制转移指令)Assumed that: 50H~52H cells of internal RAM have three augends respectively (beginning with high bytes ), 53H~55H cells of internal RAM have three addends respectively (beginning with high bytes ).Requirement: Design a program to put the additionresult into 50H~52H cells (beginning with high bytes ), and the carry bit into 20H bit of bit addressable area .MOV R0, #52H MOV R1, #55H ① MOV A, @R0ADD A, @R1 MOV @R0, A DEC R0 DEC R1② MOV A, @R0 ADDC A, @R1MOV @R0, ADECR0 (50H/51H/52H )= 11H/22H/33H DEC R1 (53H/54H/55H )= 77H/88H/99H ③ MOV A, @R0ADDC A, @R1 112233H MOV @R0, A + 778899H CLR AADDC A, #00H ? ④ MOV R0, #20H ?MOV @R0, A ?For example: Compare the valuesSTAR T: CLR C; clear the carry bitMOV DPTR, #ST1 ; set the data pointer MOV X A, @DPTRMOV R2, A ; put the 1stconstant into R2INC DPTR MOV X A, @DPTR ; put the 2st constant into ASUBB A, R2 ; A = A – R2= 2st - 1stJNC BIG1 ; if no carry, then the 2st constant is bigger . XCH A, R2 ; else 1st constant is bigger , and put into A BIG0: INC DPTR ; let DPTR points to the result cell. MOVX @DPTR, A ; save the bigger constant. RETBIG1: MOV X A, @DPTR ; put the 2st constant into ASJMP BIG04.2.2.2. Multi-branching program· Instruction Set has no multi-branching instruction. · 4 methods to realize multi-branching:1.By using some CJNE instructions 2.By using “address table ”3.By using “jump instruction table ” 4.By using stack operation1.By using some CJNE instructionsCJNEA, #data, rel ; put the branching number into A.For example: temperature control systemCJNE A, 55H, LOOP1 ; if T a ≠T55(upper value limit ),then j ump to LOOP1 AJMP FH ; T a =T55,j ump to main program FH (返回) LOOP1: JNC JW ; if CY ≠0,T a >T55, then j ump to JW (降温)CJNE A, 54H, LOOP2 ; if T a ≠T54(low er value limit ),then j ump to LOOP2 AJMP FH ; T a =T54,j ump to main program (FH ) LOOP2: JC SW ; if CY =1,T a <T54, then j ump to SW (升温)FH: RETAssumed that: There are three continuous cells (ST1, ST2, ST3)in the externalRAM where ST1 and ST2 have 8-bit unsigned binary constants respectively .Requirement: Design a program to find the bigger constant , and put it into ST3 cell.Assumed that: There is a temperature control system, which current temperature value (Ta ) is saved in A . The lower value limit (T54)of temperature control is saved in the internal RAM cell 54H , The upper value limit (T55)of temperature control is saved in the internal RAM cell 55H .Requirement: Design a program to control temperature under the conditions: If Ta > T55, then executes the temperature-down processing subprogram (JW ); If Ta < T54, then executes the temperature-up processing subprogram (SW ); If T55≥Ta ≥T54, then returns to the main program (FH ).2.By using “offset address table ”Step:(1)Set up a “offset address table ”(2)Using instruction: JMP @A+DPTRwhere: Offset table base address → DPTR Offset → A (offset value =BR0/BR1/BR2/BR3 - BRTAB )R3: 00, 01, 02, 03 MOV A, R3 ; put the branching number into AMOV DPTR, # BRT AB ; let DPTR point to base address of offset table MOVC A, @A+DPTR ; fetch the offset v alue.JMP @A+DPTR ; j ump to the corresponding subroutine. (A is offset value, DPTR is the address of BRT AB ); PC = A+DPTR BRT AB: DBBR0_BRTAB ; offset value of BR0 DB BR1_BRTAB ; offset value of BR1 DB BR2_BRTAB ; offset value of BR2 DBBR3_BRTAB; offset value of BR3BR0: MOV A, @R0 ; 00 ; fetch data from internal RAM to A (R0 saves low 8-bit address ) SJMP DONE ; stopBR1: MOV X A, @R0; 01; fetch data from ext ernal RA M (low er 256B )to A (R0 saves low 8-bit address ) SJMP DONE; stopBR2: MOV A, R1; 02; put high address into A < 4K = 212 = 24·28 > (R1 saves high 8-bit address ) ANL A, #0FH ; fetch low 4-bit from high address, and clear high 4-bit. ANL P2, #0F0H ; fetch high 4-bit from P2 port, and clear low 4-bit of P2 ORL P2, A ; not change high 4-bit of P2, and send low 4-bit of P2MOV X A, @R0 ; fetch data from external RAM (4KB )to A (R0 sav es low 8-bit address )SJMP DONE; stopBR3: MOV DPL, R0; 03; put low 8-bit address of ext ernal RA M to DPL MOV DPH, R1 ; put high 8-bit address of external RAM to DPHMOV X A, @DPTR; fetch data from external RAM (64KB )to A DONE : SJMP $; stop3.By using “jump instruction table ” For example:R3: 00, 01, 02, 03, … MOV A, R3 ; put the branching number into A RL A ; A = branching number × 2 MOV DPTR, # BRT AB ; let DPTR point to base address of offset table JMP @A+DPTR ; j ump to the corresponding subroutine, PC = A+DPTR BRT AB: AJMP ROUT0 ; j ump to ROUT0 AJMP ROUT1 ; j ump to ROUT1 AJMP ROUT2 ; j ump to ROUT2AJMP ROUT3 ; j ump to ROUT3 … AJMP ROUTn ; j ump to ROUTnWhy “RL A ” ?When R3 = 00, need j ump to BRT AB + 0, so A = 00, When R3 = 01, need j ump to BRT AB + 2, so A = 02, When R3 = 02, need j ump to BRT AB + 4, so A = 04, When R3 = 03, need j ump to BRT AB + 6, so A = 06.Assumed that: R3 saves branching number. BRTAB denotes the base address of jump instruction table.Requirement: Design a program to realize multi-branching. Offset table (offset value=BR0/BR1/BR2/BR3 - BRTAB )Jump instruction table4.By using stack operationSteps: (1)Put the 16-bit address into stack(2)Using RET instruction to get PC value from stack For example:·R3: 00, 01, 02, 03 MOV DPTR, # BRT AB ; let DPTR point to base address of offset table MOV A, R3 ; put the branching number into A RL A ; A = branching number × 2 MOV R1, A ; R1 = 2·R3 INC A ; A = 2·R 3 + 1 MOVC A , @A +DPTR ; fetch low 8-bit address to A PUSH ACC ; and put low 8-bit address into Stack. MOV A, R 1 MOVC A , @A +DPTR ; fetch high 8-bit address to A PUSH ACC ; and put it into Stack. RET ; set PC value from stack. Get high 8-bit address first, and then low 8-bit address . BRT AB: DW BR0 ; 16-bit address of branching subroutine 0DW BR1 ; 16-bit address of branching subroutine 1 DW BR2 ; 16-bit address of branching subroutine 2 DW BR3 ; 16-bit address of branching subroutine 3 …DW BRn ; 16-bit address of branching subroutine n4.2.3 Circular StructureMethod: Using conditional jump instructions.For example:MOV R2, #0FFH ; set the initial value of the length counter. MOV R0, #3FH ; set the initial value of the string pointer. LOOP: INC R2 ; R2 = 00H, 01H,… INC R0 ; R0 = 40H, 41H,…CJNE @R0, #0DH , LOOPRETAssumed that: R3 saves branching number .BRTAB denotes the base address of jump instruction table.Requirement: Design a program to realize multi-branching.Assumed that: There is a character string that adopts “Enter ” symbol as the ending flag. This string is saved in the internal RAM beginning with 40H cell. Requirement: Design a program to get the length of this string.16-bit address t able. Pay attention to the operation of DW!4.3 Delay time Program4.3.1 Single-cycle delay time programMOV R5, #TIME; 1LOOP: NOP ; 1 NOP ; 1 DJNZ R5, LOOP ; 2If f osc = 6MHz, then machine cycle T M :So total delay time: T max =1+(1+1+2)×2us ×TIME; TIME = 00H-FFH, 0-255, cycles 265 times=1+(1+1+2)×2us ×256 = 1+2048 = 2049us4.3.2 Long delay time program (Multi-cycle )MOVR5, #TIME1 ; 1LOOP2:MOV R4, #TIME2 ; 1 LOOP1:NOP; 1 NOP ; 1 DJNZ R4, LOOP1 ; 2 DJNZ R5, LOOP2 ; 2 RET; 2If f osc = 6MHz, then total delay time T max : T max = 1+((1+(1+1+2)×256+2)×256)+ 2 )× 2us = 1+ 525828 = 525829us4.3.3 Adjusting delay time range·by adding or deleting instructions that don ’t affect program function.MOV R0, #TIME1LOOP:ADD A, R1 ; 1 INC DPTR; 2DJNZ R0, LOOP; 2If f osc = 6MHz, then the delay time T of the cycle body is as follow :T = (1+2+2)×2us ×TIME = 10×TIME (us ) MOV R0, #TIME1LOOP: ADD A, R1 ; 1 INC DPTR ; 2 NOP; 1DJNZ R0, LOOP; 2If f osc = 6MHz, then the delay time T of the cycle body is as follow :T = (1+2+1+2)×2us ×TIME = 12×TIME (us )4.3.4 Get different timing with basic delay programMOV R0, #05H; 5s delay time LOOP1:LCALL DELA Y; 1s delay time DJNZ R0, LOOP1MOV R0, #0A H; 10s delay time LOOP2:LCALL DELA Y; 1s delay time DJNZ R0, LOOP2MOV R0, #14H; 20s delay time LOOP3:LCALL DELA Y ; 1s delay time DJNZ R0, LOOP32us126MHz1T M =⨯=4.4 Pseudoinstruction7 pseudoinstructions:ORG, END, EQU, DB, DW, DS, BIT(Read P93)Note: DB, DW, and DS are only used for program memory.4.5 How to edit and assemble the source program·hand assemble·Machine edit: get source program: *. asm·Across assembleHome Work of Chapter 4P98 (一)1、4 (二)6。
第4章80C51汇编程序设计.
4AH 1402H 00H 1403H 3CH
定义常值为符号名伪指令 EQU
符号名 EQU 常值表达式 LEN EQU SUM EQU BLOCK EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV 10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
4.2 基本程序结构
(无分支、无循环) 4.2.1 顺序程序
开始
【例4-1】片内RAM的21H单元
存放一个十进制数据十位的 ASCII码,22H单元存放该数 据个位的ASCII码。编写程序 将该数据转换成压缩BCD码存
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
第4章 汇编语言程序设计
教学内容: 4.1 汇编语言程序设计过程 4.2 基本程序结构 4.3 子程序及其调用 4.4 简单I/O设备的并口直接驱动示例
教学目的:
1、掌握80C51汇编语言程序设计步骤 2、掌握80C51常用伪指令的使用方法 3、熟悉几种基本的程序结构和简单I/O程序设计方法
教学重点:
利用存储器(个数多,用R0或R1及DPTR为参数表指针) 【例4-7】将内部RAM 中两个4字节无符号整数相加,和的高 字节由R0指向。数据采用大端模式存储。
入口:(R0)=加数低字节地址; 出口:(R0)=和的高字节起始地址。 (R1)=被加数低字节地址。
NADD:MOV CLR NADD1:MOV ADDC MOV DEC DEC DJNZ INC RET
放在20H单元。
ORG LJMP ORG START:MOV ANL SWAP MOV MOV ANL ORL SJMP END
80C51的汇编语言程序设计
标号(即符号地址)
非数字字符开头,后跟字母、数字、“ -” 、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) LOOP: 1BT: 后跟英文冒号“:” 指令助记符 TABLE: LST+2: 是指令功能的英文缩写。 THLS2: BEGIN LT-1: MOV:
2016/7/10 8
操作数
78H 56H 34H 12H 00H 00H
(b)
实际应用中,应尽量采用指令代码字节数少、 执行时间短的高效率程序,即注意程序的优化。
2016/7/10 23
2、查表程序
例4.2 有一变量存放在片内RAM的20H单元,其取值范 围为00H~05H.要求编程,根据变量值求其平方值, 并存入片内RAM的21H单元。 开始
26
;被加数的低字节地址 ;加数的低字节地址
;低字节相减 ;存低字节相减结果
;中间字节带进位相减 ;存中间字节相减结果
;高字节带进位相减 ;存高字节相减结果 ;借位送00H保存
4.3.2 分支程序设计
程序的分支是通过条件转移指令实现的。根据条件 对程序中的状态进行判断,满足条件则进行程序转移, 否则按顺序执行。在 MCS-51 指令系统中,有多种条件转 移指令,包括JZ、JNZ、CJNE、DJNZ以及位状态条件转移 指令JC、JNC、JB、JNB、JBC等,使用这些指令,可以完 成各种条件下的程序分支转移。 分支程序可分为单分支、双分支和多分支程序。
3、简单运算
由于80C51指令系统中只有单字节加法指 令,因此对于多字节的相加运算必须从低位字 节开始分字节进行。除最低字节相加时可以使 用ADD指令外,其他字节相加时要把低字节的 进位考虑进去,这时应该使用ADDC(减法用 SUBB)指令。
第四章 80C51汇编语言程序设计
4.2 基本结构程序设计
程序设计的基本结构有:顺序结构、分支结构和循环结构。 4.2.1 顺序结构程序 例4-2 将30H单元的2个BCD码拆开并分别存入到31H和32H 单元中。 解:方法一:先把30H中低4位BCD码交换出来,存入31H 中,再把高4位BCD码交换到低4位存入32H中。
4.2 基本结构程序设计
4.2 基本结构程序设计
ORG 0000H LJMP START ORG 0030H START:MOV R0,#30H MOV A,@R0 INC R0 CLR C SUBB A,@R0 JC BIG2 ADD A,@R0 SJMP NEXT BIG2: MOV A, @R0 NEXT: INC R0 MOV @R0,A SJMP $ END
程序1:用AJMP 和JMP 程序 KEY: MOV DPTR, #TAB; 转移表的首址 MOV A, R2 RL A JMP @A+DPTR TAB: AJMP KEY0 AJMP KEY1 AJMP KEY2 AJMP KEY3 AJMP KEY4 AJMP KEY5 AJMP KEY6 AJMP KEY7 KEY0: …… RET KEY1: …… RET ……
4.2 基本结构程序设计
例:4-10 设计一个延时50ms的程序 DEL :MOV R7, #200 DEL1:MOV R6, #123 NOP DEL2:DJNZ R6, DEL2 DJNZ R7, DEL1 RET
4.2 基本结构程序设计
4.3 子程序设计 例:4-9已知(30H)=x,(31H)=y ,(32H)=f,实现函数 f小于255 f x y
LCALL DL MOV 32H,A MOV A, 31H LCALL DL ADD A, 32H MOV 32H, A SJMP $
第4章80C51的汇编与C语言程序设计资料
由于指向对象的存储空间在编译时无法确定(运行时确 定),因此必须生成一般代码以保证对任意空间的对象进 行存取。所以一般指针所产生的代码速度较慢。
2018/10/25
28
天津理工大学聋人工学院
4.4.2
基于存储器的指针
定义时就指定它所指向的对象的存储器类型
指针占1个字节(idata *,data *,pdata *)或2个 字节(code *,xdata *) 基于存储器指针定义示例: char data *str; int /* 指针指向的char型数据存于data 空间 */ xdata *num; /* 指针指向的int型数据存于xdata 空间 */ 基于存储器的指针长度比一般指针短,可以节省存储 器空间,运行速度快,但它所指对象具有确定的存储器 空间,兼容性不好。
特殊功能寄存器的声明
格式:
sfr 特殊功能寄存器名 = 地址常数;
例如: sfr SCON = 0x90; sfr P0 = 0x80;
2018/10/25
11
天津理工大学聋人工学院
特殊功能寄存器中特定位的声明
sbit 位变量名=特殊功能寄存器名^位的位置(0~7) 例如: sfr PSW=0xD0; sbit OV=PSW^2;
2018/10/25 22 天津理工大学聋人工学院
4.3.2
C51循环语句
while语句
一般形式为: while(条件表达式)语句;
如果条件表达式的结果一开始就为假,则后面的语句一 次也不能执行。
do-while语句
一般形式为: do语句 while(条件表达式);
任何条件下,循环体语句至少会被执行一次。
C51程序开发过程
编写源程序 建立工程,加入源程序 编译生产目标程序 仿真调试、写存储器
第4章 80C51的程序设计
Y=0
Y=1 结束
(解一)
ORG 8000H MOV A,35H FHHS:CJNE A,#0,NEQ0 ; ≠ 0转移 MOV A, #0 SJMP OK NEQ0: CJNE A,#7FH,ISZF;≠7FH转移 ISZF: JNC LT0 ;A>7FH 负数 GT0: MOV A,#01H SJMP OK LT0: MOV A,#FFH OK: MOV 36H,A SJMP $ ;暂停
汇编语言程序设计的设计步骤
1、分析问题,导出数学表达式 2、确定算法,运算步骤和顺序 3、分配存储单元和寄存器 4、画出程序流程图,编写程序 5、上机调试
简单程序设计(无分支循环) §4-2 简单程序设计(无分支循环)
例1 两个8位无符号数存放在内部RAM的20H、21H中, 求(1)两数的和存放到22H(用寄存器间接寻址) (2)两数的差存放到23H中(用直接寻址)。 解:(1) ORG 4000H MOV R0,#20H MOV A,@R0 INC R0 ADD A,@R0 INC R0 MOV @R0,A END (2) ORG 8000H MOV R0,20H MOV A,21H CLR SUBB A,R0 MOV 23H,A END
例2 16位二进制数存于R1、R0中,将其求补后 存放到R7、R6中 解:ORG 8000H CLR C :CY清0 MOV A,R0 CPL A ADD A,1 ;低8位求补 MOV R6,A ;送低8位结果 MOV A,R1 CPL A ADDC A,#0 ;高8位求反 MOV R7,A ;送高8位结果 END
; CY←0 ; 置数据指针 ; 取第一个数 ; 第一个数暂存于R3 ; 修改指针 ; 取第二个数 ; 两数比较 ; CY=0,第二个数大 ; 第一个数大 ;再取第二个数 ; 修改指针 ; 存放大数
单片机及应用_第四章_80C51单片机汇编语言程序设计
80C51单片机汇编语言程序设计
主要内容: 4.1 单片机程序设计语言概述 4.2 汇编语言程序的基本结构形式 4.3 80C51 单片机汇编语言程序设计举例 4.4 单片机汇编语言源程序的编辑和汇编 4.5 80C51 单片机汇编语言伪指令
4.1 单片机程序设计语言概述
4.1.1 机器语言和汇编语言 1、机器语言:直接用二进制代码指令表达的计算 机语言。计算机可以直接识别,不需要进行任 何翻译。每台机器的指令,其格式和代码所代 表的含义都是硬性规定的 。机器语言是其它各 种程序设计语言的基础,但难记、难用、已出 错。
符(ASCII码0DH)比较的方法。同时在程序中还应设置一个
字符串指针以顺序定位字符,设置一个字符长度计数器以累 计字符个数。
4.2.3 循环程序结构
MOV R2, #0FFH ;设置长度计数器初值 MOV R0, #3FH ;设置字符串指针初值 LOOP: INC R2 INC R0 CJNE @R0, #0DH, LOOP
4.1.1 机器语言和汇编语言
2、汇编语言:用助记符和专门的语言规则表示指令的功 能和特征的面向机器的程序设计语言。汇编语言是对 机器语言的改进,比机器语言高级。汇编语言的最大 优点是助记符与机器指令一一对应。用汇编语言编写 的程序占用存储空间小,运行速度快,程序效率高。 此外,汇编语言能直接管理和控制硬件资源。
4.2 汇编语言程序的基本结构形式
四种基本结构形式:顺序程序结构、分支程 序结构、循环程序结构、子程序。
4.2.1 顺序程序结构 顺序结构程序是最简单的程序结构。程序既 无分支、循环,也不调用子程序,程序执行 时一条接一条地按顺序执行指令。
4.2.1 顺序程序结构
例1 3字节无符号数的加法运算。其中被加数在 内部RAM的50H、51H和52H单元中;加数 在内部RAM的53H、54H和55H单元中;要 求把相加之和存放在50H、51H和52H单元中, 进位存放在位寻址区的20H位中。
第4章80C51的汇编语言程序设计
4.3.1 顺序程序
(无分支、无循环)
4.3 基本程序结构
【例4-1】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。
ORG 0040H START:MOV A,21H ;取十位ASCII码 ANL A,#0FH ;保留低半字节 SWAP A ;移至高半字节 MOV 20H,A ;存于20H单元 MOV A,22H ;取个位ASCII码 ANL A,#0FH ;保留低半字节 ORL 20H,A ;合并到结果单元 SJMP $ END
1400H
32H
4AH
00H
3CH
1401H
1402H
1403H
大端模式
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式
LEN EQU 10 SUM EQU 21H BLOCK EQU 22H CLR A MOV R7,#LEN MOV R0,#BLOCK LOOP:ADD A,@R0 INC R0 DJNZ R7,LOOP MOV SUM,A
4.1.3 汇编语言的语句格式
非数字字符开头,后跟字母、数字、“-”、“?”等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
Keil的汇编器A51可以识别的语句形式为:
标号(即符号地址)
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
指令助记符
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
起始地址设定伪指令ORG
ORG 表达式
表达式通常为十六进制地址,例:
第4章 80C51单片机汇编语言程序设计(新)
(1003H)=78H,
(100AH)=-2=0FEH
(1004H)=35H(5的ASCII码),
7
定义数据字命令 DW (Define Word)
在程序存储器中定义16位的数据字。
存放时,数据字的高8位在低地址,低8位在后
高地址。
DW
通常,DB用来定义<数Y1据,Y,2,D…W,Y用n>来定义地址。
机器编辑→交叉汇编→串行传送
*.ASM
地址 8000
8002
机器码 7820
7F07
标号 助记符指令
SORT: MOV R0,#20H
MOV 3
编辑、汇编
编辑:
编写程序的过程称为编辑。 机器编辑指借助于微型机进行单片机的程序设计,通常都是使用编
辑软件进行源程序的编辑。 编辑完成后,生成一个由汇编指令和伪指令构成的扩展名
一般用汇编语言编写的程序需要 预留存放数据的空间用伪指令定义好
然后编写程序代码 最后用原地踏步或返回起始位置循环作为结束。
【例】程序格式如下:
ORG … … SJMP $ END
14
汇编语言程序的基本结构形式
分支结构
使用条件转移指令对程序的执行结果进行判断
教学内容及要求
教学内容
汇编语言程序的基本结构形式、子程序结构形式 80C51单片机汇编语言伪指令 80C51单片机汇编语言程序设计举例
教学要求
掌握顺序结构程序、分支程序、循环程序和子程序等 结构程序的设计等
熟悉单片机汇编程序常用的伪指令 了解汇编语言程序的格式
汇编语言源程序的编辑和汇编
[<标号:>] DS <16位数表>
【例】ADDRTAB:DS 20 ;从标号ADDRTAB代表的地址开始,预留20个 ;连续的地址单元。
