第4章80C51的汇编语言程序设计

合集下载

第4章 80C51汇编语言程序设计

第4章 80C51汇编语言程序设计
构、分支结构、循环结构。三种基本结构的流程图:
(a)顺序结构
(b)分支结构
(c)循环结构
图4.1 程序的基本结构流程
4.2 汇编语言程序程序设计 4.2.1 顺序程序设计

顺序结构的程序多用来处理比较简单的问题。
特点是:程序中的语句由前向后顺序执行,最
后一条指令执行完毕,整个程序也随之结束
例4.1 将20H中存放的压缩BCD数转换成二进制数 存放在累加器A中。
;数据区首址送R0 ;各次冒泡比较次数送R7 ;互换标志位清零
;取前数送A中 ;暂存到2BH单元中 ;修改地址指针 ;取后数暂存到2AH单元中 ;清CY ;前数减后数 ;前数小于后数,则转(不互换) ;前数大于后数,两数交换
;续前 DEC R0 MOV @R0 ,2AH INC R0 SETB 00H NEXT: DJNZ R7 ,LOOP JB 00H ,START END
编程如下:
MOV ANL MOV MOV ANL ORL A ,30H A ,#0F0H 32H ,A A ,31H A ,#0FH A ,32H
MOV
32H ,A
例4.4 计算Y=X1+X2-X3 X1=38H ,X2=2AH , X3=19H
编程如下:
START: MOV ADD CLR A ,#38H A ,#2AH C
例11: 行李计价:
当G≤5,M=G×3; 当G>5,M=G×3+(G-5)×(5-3)
FRT: MOV MOV MOV MUL MOV MOV CJNE L1:JC SUBB RLC ADD MOV WETC:MOV END
A ,40H R3 ,A B ,#03H AB R2 ,A A ,R3 A ,#06H ,L1 WETC A ,#05H A A ,R2 R2 , A 41H ,A

第4章 80C51单片机汇编语言程序设计

第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汇编程序设计.

第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的汇编语言程序设计.

80C51的汇编语言程序设计.
目标程序的连接
.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件 绝对地址目标文件可以用于仿真器调试 调试无误的目标文件用OH51.EXE转换为.HEX文件 .HEX文件经编程器写入单片机存储器
2020/8/19
11
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
如: ORG 1000H DB -2,-4,-6,8,10,18
定义字数据表伪指令DW
[标号:] DW 字数据表
ORG 1400H DATA1:DW 324AH,3CH
……
2020/8/19
13
1000H FEH 1001H FCH
FAH 08H 0AH 12H
1400H 32H 1401H 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
高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。
2020/8/19
2
4.1 程序编制的方法和技巧
4.1.1 程序编制的步骤 任务分析
明确任务:功能要求、技术指标 运行环境调研
算法设计
将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度)

第四章 80C51汇编语言程序设计

第四章 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语言程序设计资料

第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的程序设计

第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,第二个数大 ; 第一个数大 ;再取第二个数 ; 修改指针 ; 存放大数

第4章80C51的汇编语言程序设计

第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 表达式
表达式通常为十六进制地址,例:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

返回
2013-8-6
23
START:MOV ACALL AJMP JPNUM:MOV MOV ADD MOV MOVC XCH INC MOVC MOV MOV CLR JMP
2013-8-6
R7,#3 JPNUM START DPTR,#TAB A,R7 A,R7 R3,A A,@A+DPTR A,R3 A A,@A+DPTR DPL,A DPH,R3 A @A+DPTR
2013-8-6
PP0 PP1 PP2 PP3 PP4 30H,#0 30H,#1 30H,#2
;转移序号为0时,置功能号“0”于30H单元 ;转移序号为1时,置功能号“1”于30H单元 ;转移序号为2时,置功能号“2”于30H单元
30H,#3
30H,#4
;转移序号为3时,置功能号“3”于30H单元
2013-8-6
表4.1
优先级
A51汇编器的运算符及其优先级
功 能 表达式及其结果示例 4*(5+6)即44 NOT 55H 即AAH; HIGH 1234H 即12H +5、-6 17 / 5 即3; 17 MOD 5 即2
运 算 符
() NOT、HIGH、 LOW
高 ↓ ↓ ↓ ↓ ↓ ↓ ↓ 低·
;转移序号为4时,置功能号“4”于30H单元
25
4.3.3
循环程序
(2种:先执行,后判断;先判断,后执行)
【例4-4】将内部RAM的30H至3FH单元初始化为00H。
开始
置初值
循环处理 循环修改 N
循环结束? Y 结束处理
MAIN:MOV MOV MOV LOOP:MOV INC DJNZ SJMP
;以转移序号3为例
;置分支入口地址表首址 ;乘2,调整偏移量
;取地址高字节,暂存于R3
;取地址低字节 ;处理程序入口地址低8位送DPL ;处理程序入口地址高8位送DPH
24
TAB:DW DW DW DW DW PP0:MOV RET PP1:MOV RET PP2:MOV RET PP3:MOV RET PP4:MOV RET
循环扫描、处理
程序流向符号 程序流向符号
2013-8-6
4
4.1.2
程序编制的方法和技巧
强化模块观念
程序模块(主程序模块、各种子程序模块) 模块化优点:分块设计、便于阅读、调试方便
采用循环和子程序
使程序占用空间减少、结构清晰 循环初值和结束条件,避免“死机”现象 子程序的现场保护(注意栈平衡、寄存器内容) 对中断子程序还有注意保护PSW的内容
指令助记符
是指令功能的英文缩写。
2013-8-6
6
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
7
2013-8-6
15
4.3 基本程序结构
4.3.1 顺序程序
(无分支、无循环)
开始 取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
【例4-1】片内RAM的21H单元存放
一个十进制数据十位的ASCII码,
22H单元存放该数据个位的ASCII 码。编写程序将该数据转换成压缩 BCD码存放在20H单元。
.LST
连接器 BL51.EXE
转换器 OH51.EXE
编译器 C51.EXE .M51
写入芯片 仿真调试
C源文件 .C
.LST
库文件 .LIB
映像文件
2013-8-6
9
4.2.1
源程序的编辑和汇编
ORG 0000H LJMP MAIN ORG 0040H MAIN:MOV R7,#16 MOV R0,#60H MOV A,#55H LOOP:MOV @R0,A INC R0 DJNZ R7,LOOP SJMP $ END
括号 取反、取高字节、取低 字节 正号、负号 乘、除(取商)、取余 数
+、- *、/、MOD
+、- SHL、SHR
AND、OR、XOR <、>、=、<>、 <=、>=
加、减 左移、右移
与、或、异或 比较运算符
5+4 即 9; 5-4 =即1 2 SHL 2即8;8 SHR 2 即 2
45H AND 0FH即05H
2013-8-6 22
【例4-3】根据R7的内容X(转移序号)转向相应的处理程序。 设R7内容为0~4,对应的处理程序入口地址分别为PP0~PP4。
取分支号,乘2
地址高、低字节存DPTR
X=?
X=0 分支程序PP0
X=1 分支程序PP1
X=2 分支程序PP2
X=3 分支程序PP3
X=4 分支程序PP4
该伪指令位于源程序的最后一行。
2013-8-6 12
定义字节数据表伪指令DB
[标号:] DB 字节数据表 如: ORG 1000H DB -2,-4,-6,8,10,18
1000H 1001H
FEH
FCH
FAH 08H
0AH
12H
定义字数据表伪指令DW
[标号:] DW 字数据表 ORG 1400H DATA1:DW 324AH,3CH … …
开始
N
M高8位=N高8位? N Y
Y M低8位=N低8位? Y
CY=1?
N (42)=00H
(42)=FFH
结束
20
2013-8-6
ORG 2000H CMP:MOV A,50H CJNE A,40H,CMP1 MOV A,51H CJNE A,41H,CMP1 SJMP NHIGHE ;跳过一些其它分支 CMP1:JC HIGHE NHIGHE:MOV 42H,#0FFH SJMP DONE HIGHE:MOV 42H,#00H DONE:SJMP $ END
2013-8-6 21
解法II:先假设M> N,再来判断是否NA ≤ NB。 ORG 3000H CMP2:MOV R0,#00H MOV A,50H CJNE A,40H,CMP3 MOV A,51H CJNE A,41H,CMP3 SJMP NHIGHE CMP3:JC HIGHE NHIGHE:MOV R0,#0FFH ;不大于标志 HIGHE:MOV 42H,R0 SJMP $ END
MOV A,X>8; 若X>8为真,则为MOV A,01H 若X>8为假,则为MOV A,00H
2013-8-6
8
4.2
源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ
调试目标文件 (绝对地址) 无扩展名
可烧写 目标文件 .HEX
2013-8-6
2
4.1
4.1.1
程序编制的方法和技巧
程序编制的步骤
任务分析
明确任务:功能要求、技术指标 运行环境调研
算法设计
将实际问题转化为计算机处理的程序算法 算法比较与优化(内存需求与运行速度)
2013-8-6
3
流程描述
流程图符号
开始或结束符号 判断分支符号
“超级循环”框架
开始
初始化
工作任务符号 程序连接符号
17
4.3.2 分支程序
(单分支、双分支、多分支)
开始
【例4-2】设变量X以补码的形式存 放在片内RAM的30H单元,变量Y与 X的关系是: X (X>0)
Y = 20H (X=0) X+5 (X<0)
取x至累加器 Y X=0? N Y X>0? N X+05H送Y 20H送Y
编制程序,根据X的大小求Y并送回 原单元。
5
2013-8-6
4.1.3
汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“-”、“?”等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
;取x至累加器 ;x = 0 ,转NEXT ;否,保留符号位 ;x >0 ,转结束 ;x <0 ,处理Y=X+5 ;X+05H送Y ;x = 0 ,20H送Y
例4-3 设有两个16位无符号数M,N分别存放在8051单片机内部RAM的40H、 41H及50H、51H单元中,当M > N时,将内部RAM的42H单元清0;否则,将 该单元置成全1,试编程。 解法I:因为无16位数的比较指令,所以只能用8位数的比较指令
第4章 80C51的汇编语言程序设计
4.1 4.2 4.3 4.4 4.5 程序编制的方法和技巧 源程序的编辑和汇编 基本程序结构 子程序及其调用
简单I/O设备的并口直接驱动示例
2013-8-6
1
单片机应用系统由硬件系统和应用程序构成 应用程序设计方法
汇编语言 高级语言 汇编语言,生成的目标程序占内存空间少、运行速 度快,具有效率高、实时性强。 高级语言,对系统的功能描述与实现简单,程序阅 读、修改和移植方便,适合于编写复杂的程序。
2013-8-6
16
ORG START:MOV ANL SWAP MOV MOV ANL ORL SJMP END
2013-8-6
0040H A,21H A,#0FH A 20H,A A,22H A,#0FH 20H,A $
相关文档
最新文档