第四章 8051汇编语言程序设计
第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单片机汇编语言程序设计
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.3.2 参数传递
利用累加器或寄存器(简单、快速,但参数个数不多) 【例4-6】实现两个8位的十六进制无符号数求和的子程序。 例 实现两个8位的十六进制无符号数求和的子程序。
入口: R3) 加数; 入口:(R3)=加数; R4) 被加数。 (R4)=被加数。 SADD:MOV CLR ADD JC MOV SJMP PP1:MOV PP2:MOV RET A,R3 C A,R4 PP1 R3,#00H PP2 R3,#01H R4,A 出口: R3) 和的高字节; 出口:(R3)=和的高字节; R4) 和的低字节。 (R4)=和的低字节。 ;取加数( R3中 ;取加数(在R3中) 取加数 ;被加数( R4中 ;被加数(在R4中)加A 被加数 ;结果小于255时 高字节R3内容为00H ;结果小于255时,高字节R3内容为00H 结果小于255 R3内容为 ;结果大于255时 高字节R3内容为01H ;结果大于255时,高字节R3内容为01H 结果大于255 R3内容为 ;结果的低字节在R4中 结果的低字节在R4 ;结果的低字节在R4中
MAIN:MOV MOV LOOP0:MOV CJNE SJMP LOOP1:MOVX INC INC SJMP DONE:SJMP R0,#60H DPTR,#1000H A,@R0 A,#24H,LOOP1 DONE @DPTR,A R0 DPTR LOOP0 DONE ;置初值 ;置初值 ;取数据 ;取数据 ;循环结束 循环结束? ;循环结束? ;是 ;是 ;循环处理 ;循环处理 ;循环修改 ;循环修改 ;继续循环 ;继续循环 ;结束处理 ;结束处理
;置初值 ;置初值 ; ; ;循环处理 ;循环处理 ; ;循环修改 循环修改, ;循环修改,判结束 ;结束处理 ;结束处理
[所有分类]第4章 汇编语言程序设计ppt课件
JMP_128:MOV A,R3
RL A MOV DPTR,#JMPTAB
JMP @A+DPTR JMPTAB:AJMP ROUT00
AJMP ROUT01
┇
┇
AJMP ROUT7F
128个子程序首址
•说明:此程序要求128个转移目的地址(ROUT00 ~ROUT7FH)必须驻 留在与绝对转移指令AJMP相同的一个2KB存储区内。
第4章 汇编语言程序设计及知识
§4.1 编程的步骤、方法和技巧 §4.2 汇编语言源程序的编辑和汇编
2021/5/19
§4.1 编程的步骤、方法和技巧
§4.1.1 编程的步骤 §4.1.2 编程的方法和技巧 §4.1.3 汇编语言程序的基本结构
2021/5/19
编程的步骤
一、分析问题 二、确定算法 三、画程序流程图 四、编写程序
LOOP : CLR C SUBB A,@R1 JNC NEXT MOV A,@R1 SJMP NEXT1
NEXT: ADD A,@R1 NEXT1: INC R1
DJNZ R2,LOOP MOV MAX,A
2021/5/19
循环结构
例:在内部RAM的20H~ 2FH连续16个单元中存放单 字节无符号数。求16个无 符号数之和,并将其和存放 在31H、30H中。用R0作加 数指针,R7作循环次数计 数器。
一、顺序结构
顺序程序是最简单的程序结构,即顺序 结构。
程序按顺序一条一条地执行指令。
2021/5/19
顺序结构举例
例1 双字节乘法子程序。 (R4) (R3)×(R2)=[(R4) ·28+ (R3) ] ·(R2) =(R4) ·(R2) ·28+ (R3) ·(R2)
第四章 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 $
第四章 8051汇编语言程序设计
ADDC A,@R1 ;高字节数相加
MOV @R0,A SJMP $
4.2.1 顺序结构程序
例4-2将30H单元的2个BCD码拆开并分别存放到31H和 32H两个单元中。 分析:先把30H(书上有误)中低4位BCD码交换出来, 存入到32H (书上有误)中,再把高4位BCD码交换 至低4位,存入到31H (书上有误)中。 程序如下: ORG 0000H LJMP MAIN
4.1 程序设计语言概述
2.汇编语言的语句格式 汇编语言源程序是由汇编语句(即指令)组成的。汇编 语句一般由四部分组成。
其典型的汇编语句格式如下:
标号: 操作码 操作数; 注释 START:MOV A,30H;A←(30H) (2)特殊功能寄存器名;
操作数字段的内容可能包括以下几种情况:
(1)工作寄存器名; (3)标号名; (4)常数; (5)表达式。
返回本节
4.1.5 流程图的设计
常用的流程图符号有:开始和结束符号、工作任务 符号、判断分支符号、程序连接符号、程序流向符号等
开始或结束符号 判断分支符号 程序流向符号
工作任务符号
程序连接符号
程序流向符号
4.1常用流程图符号
返回本节
4.2 汇编语方程序设计步骤
1.分析问题
2.确定算法
3.设计程序流程图 4.分配内存单元 5.编写汇编语言源程序 6.调试程序
3.DB:定义数据字节 把数据以字节数的形式存放在存储器单元中。 4.DW:定义数据字 按字的形式把数据存放在存储单元中。
5.DS:定义存储区
从指定的地址单元开始,保留一定数量存储单元。 6.BIT:位定义 确定字符名为确定的位地址值。 7.END:汇编结束
返回本节
单片机第4章汇编语言程序设计
4.2 伪指令
伪指令是在机器汇编中告诉汇编程序 如何汇编、对汇编过程进行控制的命令。 伪指令与汇编语言指令不同,只在源程序 中出现,不产生任何机器代码,在程序的 运行过程中不起作用,故称为“伪指令”。
处理 判断 连接
2.绘制程序流程图 简单的问题可由文字说明, 当问题复杂时,将文字说明的步骤以图形符号表示, 称流程图。
3.编写源程序 用汇编语言把流程图所表明的 步骤描述出来,实现流程图中每一框内的要求,从 而编制出一个有序的指令流,即汇编语言源程序。
4.汇编、调试 汇编语言是用指令助记符代替机 器码的编程语言,所编写的程序是不能在计算机上 直接执行的,因此利用它所编写的汇编语言程序必 须转换为单片机能执行的机器码形式的目标程序才 能运行,我们把这一过程称为汇编,进行汇编的程 序称为汇编程序。
4. 定义字伪指令DW
[标号:] DW 16位字数据表
该指令的功能与DB相似, 区别仅在于从指定地
址开始存放的是指令中的16位数据, 而不是字节串。
每个16位数据要占两个存储单元, 高8 位先存(低位
地址), 低 8 位后存(高位地址)。
1403H 3CH
ORG 1400H DATA1:DW 324AH,3CH
散转程序是分支程序的一种, 它可根据运算结果或输入数 据将程序转入不同的分支。MCS - 51 指令系统中有一条跳转指 令JMP@A+DPTR,用它可以很容易地实现散转功能。该指令 把累加器的8位无符号数与16位数据指针的内容相加, 并把相加 的结果装入程序计数器PC,控制程序转向目标地址去执行。
第4章 80C51单片机汇编语言程序设计
按照语法格式 编写源程序 *.ASM *.C 按照语法格式 将源程序翻译 成机器代码 计算机识别的 二进制代码 *.OBJ
高级语言如 C++
汇编语言如 MCS-51指令
编译
目标文件
汇编
目标文件
1
本章结构
4.1 单片机程序设计语言概述 4.4 汇编语言编辑和汇编及其伪指令 4.2 汇编语言程序的基本结构形式
顺序程序结构 分支程序结构 循环程序结构
4.3 汇编语言程序设计举例
2
4.1
概述
4.1.1、 程序设计语言及语言处理程序
程序设计语言分:机器语言、汇编语言和中高级语言 1.机器语言: •硬件识别,二进制,无需翻译、直接执行,面向机器; •速度快,效率高,难以辨认和记忆,易错,难修改。 地址 2000H 2002H 机器码 78 30 E6 源程序 ORG 2000H MAIN: MOV R0,#30H MOV A,@R0
22
2.1 使用多条CJNE指令
假定分支序号值保存在累加器A中,则可使用
CJNE A, #data, rel
(A)=0?
转向0分支
(A)=1?
转向1分支
(A)=2?
转向2分支
23
例4.3某温度控制系统,采集的温度值(Ta)放在累加器A中。此外,在内部 RAM54H单元存放控制温度下限制(T54),在55H单元存放控制温度上限 制(T55)。若Ta >T55,程序转向JW(降温处理程序);若Ta<T54,则 程序转向SW(升温处理程序);T55≥Ta≥T54,则程序转向FH(返回主程 序)。 程序如下: CJNE A,55H,LOOP1 ;Ta ≠T55,转向LOOP1 AJMP FH ;Ta=T55,返回 LOOP1:JNC JW ;若C=0,表明Ta>T55,转降温程序 CJNE A,54H,LOOP2 ;Ta ≠T54,转向LOOP2 AJMP FH ; Ta=T54,返回 LOOP2:JC SW ;若C=1,表明Ta<T54,转升温程序 FH: RET
单片机及应用_第四章_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单片机汇编语言程序设计(新)
(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个 ;连续的地址单元。
80C51汇编语言程序设计
课程名称:单片机及应用第四章第四章80C51汇编语言程序设计一、基本要求1.1.了解汇编语言源程序的格式2.熟悉常用的伪指令3.掌握简单程序、分支程序、循环程序、查表程序和子程序等结构程序的设计二、知识点导学4.3 汇编语言程序举例用汇编语言进行程序设计的过程跟用高级语言进行程序设计很相似。
对于比较复杂的问题可以先根据题目的要求作出流程图,然后再根据流程图来编写程序。
对于比较简单的问题则可以不用流程图而直接编程。
当然,两者的差别还是很大的。
一个很重要的差别就在于用汇编语言编程时,对于数据的存放位置,以及工作单元的安排等都要由编程者自己安排。
而用高级语言编程时,这些问题都是由计算机安排的,编程者则不必过问。
例如MCS-51中有八个工作寄存器R0-R7,而只有R0和R1可以用于变址寻址指令。
因此,编程者就要考虑哪些变量存放在哪个寄存器,以及R0和R1这样可变址寻址的寄存器若不够用又如何处理等等。
这些问题的处理和掌握,将是编程的关键之一。
希望通过实践注意掌握。
这一节中将介绍一些汇编语言设计的实例及一些程序设计的方法。
一、简单程序简单程序是指一种无分支的直接程序,即从第一条指令开始依次执行每一条指令,直到最后一条,程序就算完毕。
这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。
例1 将一个字节内的两个BCD十进制数拆开并变成相应的ASCII码,存入两个RAM单元。
解:设两个BCD数已放在内部RAM的20H单元,变换后的ASCII码放在21H和22H单元并让高位十进制BCD数存放在21H单元。
在上一章中曾举例用SW AP指令来将两个BCD数合在一个字节内。
拆字时也可以用SW AP 指令,并且借助于半字节交换指令XCHD,就不难完成所规定的功能。
数字0~9的ASCII码为30H~39H。
完成拆字转换只需将一个字节内的两个BCD数拆开放到另两个单元的低4位,并在其高4位赋以0011即可。
51单片机 第四章 汇编语言的设计
1第四章汇编语言程序设计第四章汇编语言程序设计2第一节伪指令1. 起始汇编ORG 格式:ORG 16位地址指明程序或数据块的起始地址,用在每段源程序或数据块的开始。
2. 结束汇编END 格式::END一个源程序只能有一个END 命令,放到所有指令的最后。
第四章汇编语言程序设计33. 赋值伪EQU——Equate 格式: 字符名称EQU 数字或汇编符号 功能:将右边的值赋给左边的字符。
z右边可以是字节、字。
z赋值的字符在源程序中可作为数值或地址使用。
例:LED1EQU 58HBLOCK EQU BUFFER第四章汇编语言程序设计44. 定义字节DB ——Define byte 格式:[标号:]DB 数据或表格功能:把数据或表格依次存入从标号开始的连续字节单元。
例4-3ORG 1000H FIRST:DB 73H ,01H ,01H ,91H ,07H ,01H SECOND :DB 02H ,00H ,19H ,7lH ,11H ,11HTABLE:DB 96,40H ,‘C’,‘7’,1101B55. 定义字DW ——Define word 格式:[标号:]DW 数据或表格功能:同DB ,每个字要占两个单元,高8位先存,低8位后存。
例4-5ORG 1000HPIOI :DW 7654H ,40H ,12,'AB'第四章汇编语言程序设计66. 数据地址赋值DATA格式:字符名称DATA 表达式功能:类似于EQU ,常用来定义数据地址,该语句可放在程序开头或末尾。
7. 定义存储空间DS ——Dfine storage 格式:[标号:]DS 表达式功能:从指定单元开始,保留由表达式指定的若干字节空间作为备用空间。
例4-6ORG 1000H DS 0AHDB 71H ,11H ,11H第四章汇编语言程序设计78. 位地址赋值BIT格式:标号BIT 位地址功能:将位地址赋给标号,类似DATA 。
第4章 80C51单片机汇编语言程序设计
形式,即顺序结构、分支结构、循环结构和子程序结构。
4.2.1 顺序程序结构 顺序程序是最简单的程序结构,在顺序程序中,既无分支, 循环,也不调用子程序,程序执行时一条一条地按顺序执行指令 例:假定三字节无符号数相加,其中一个加数在内部RAM的
50H、51H和52H单元中,另一个加数在内部RAM的53H、54H和55H
MOVX
DEC
@R1,
R0;
A;
保存N1、N2中间字节和
修改加数N1的地址指针内容
课程:单片机技术 教材:单片机基础
DEC R1; 修改加数N2的地址指针内容 MOVX A, @R1; 取N2的高字节 ADDC A, @R0; N1、N2高字节带中间字节和进位相加 MOVX @R1, A; 保存N1、N2高字节和 MOV 00H, C; 高字节和的进位送00H位保存 END 如果N2、N3的数据地址指针采用DPTR,则程序修改如下: ORG 1000H MOV RO, #52H;加数N1的低字节地址送地址指针R0 MOV DPTR, #0055H;加数N2的低字节地址送DPTR MOVX A, @DPTR; 取N2的低字节 ADD A, @R0; N1、N2低字节相加 MOVX @DPTR, A; 保存N1、N2低字节和 DEC R0; 修改加数N1的地址指针内容
课程:单片机技术 教材:单片机基础
课程:单片机技术 教材:单片机基础
4.2.2
分支程序结构
(1)单分支程序
单分支程序是通过条件转移指令实现的,即根据条件对程序
的执行进行判断,满足条件则进行程序转移,不满足条件程序就 顺序执行。 在MCS-51指令系统中,可利用JZ,JNZ,CJNE,DJNZ,JC, JNC,JB,JNB,JBC等指令,完成为0、为1、为正、为负以及相
8051汇编程序设计
操作数域出现的常数表示法: 十六进制数: 其末尾必须加“H”说明; 十六进制数以A、B、C、D、E、F开头,其前面必 须添一个“0”进行引导说明, 二进制数: 其末尾必须用“B”说明。 十进制数: 可以不加后缀或加“D”说明。 80C51的操作数可以是寄存器寻址、直接地址等七 种寻址方式。 字符: ‘H’ 字符串: “Hello”。
4. DS( Define Storage) 定义存储区伪指令 格式:<标号:> DS <表达式> 通知汇编程序,在目标代码中,以标号为首 地址保留表达式值的若干存储单元以备源程序使 用。汇编时,对这些单元不赋值。例如: BASE: DS 100H 是通知汇编程序,从标号BASE开始,保留 100H个存储单元,以备源程序另用。 注意,对于80C51单片微机,DB、DW、DS等伪指 令只能应用于程序存储器,而不能对数据存储器 使用。
注释域: 注释域由分号“;”引导开始,是说 明语句功能、性质以及执行结果的文字。 注释的长度不限,一行不够可换行接着 写,但换行的开头仍以分号“;”引导。
例:把片外存储器2200H单元中的数送入片内30H 单元中。 标号域 操作码域 操作数域 注释域 BEGIN:MOV DPTR,#2200H ;(DPTR)=2200H MOV R0,#70H ;(R0)=70H MOVX A,@DPTR ;(A)=((DPTR)) MOV @R0,A ;((R0))=(A)
5. EQU(Equate)赋值伪指令
指令格式为:<字符名称> EQU <表达式> 其作用是把表达式赋值于字符名称,这里的字符名 称和表达式是必不可少的。例如: LOOP EQU 2002H 是向汇编程序表明,字符名称LOOP的值为2002H。又 如: LOOP1 EQU LOOP LOOP已赋值为2002H,则相当于LOOP1=LOOP, 即LOOP1也为LOOP,在程序中LOOP和LOOP1可以互换使 用。 用EQU语句给一个字符名称赋值以后,在整个 源程序中该标号的值是固定的,不能更改。
第4章 8051汇编语言程序设计
2020年3月19日星期四
[思考题]
COUNT EQU 34H ADDE EQU 18H MOV A,#COUNT ADD A,ADDE
这里,COUNT被赋值为34H,ADDE被赋值为18H。
2020年3月19日星期四
3. DB定义字节伪指令 格式:[标号:] DB 项或项表
汇编后,01H和P1.0的位地址90H分别赋给了M1 和M2。
2020年3月19日星期四
4.1.4 程序设计步骤
分析问题,确定算法 画流程图
分配内存工作区及有关端口地址 编写源程序代码 调试、测试程序
2020年3月19日星期四
4.2 汇编语言源程序的汇编
1.手工汇编 手工汇编是通过手工方式查指令编码表,逐个把
2020年3月19日星期四
SQR: TAB:
ORG 0000H MOV A,20H ;a→A ACALL SQR ;求a2
MOV R0,A MOV A,21H
ACALL SQR ADD A,R0
;a2→R0 ;b→A ;求b2 ;a2+b2→A
MOV 22H,A ;存入22H单元
SJMP $ MOV DPTR,#TAB MOVC A,@A+DPTR
功能: 把项或项表中的数据存入程序存储器从标号开始 的连续地址单元中。
2020年3月19日星期四
[思考题] ORG 2000H TAB1:DB 10H,23H TAB2:DB “123”
汇编后 (2000H)=10H (2001H)=23H (2002H)=31H (2003H)=32H (2004H)=33H
2020年3月19日星期四
汇编语言
[工学]第4章_MCS-51汇编语言程序设计
4.1.3 汇编语言的规范
(8)位定义伪指令BIT
字符名称 BIT 位地址 功能:将位地址赋给字符名称。 例如: S BIT P1.0 经汇编后,S符号的值是P1.0的地址90H。
2021/8/26
返回目录 19
4.1.4 汇编语言程序编辑和汇编
1.汇编语言源程序编辑
DATA0 EQU 30H
;将30H赋予字符名称DATA0
与x的关系是:
编写程序,根据x的值求y的值,并放回原单元中。
2021/8/26
返回目录 25
4.2.2 分支程序
程序如下:
ORG 1000H
START: MOV A, 30H
JZ NEXT ;x=0,转移
ANL A, #80H ;保留符号位
JZ ED
;x > 0 ,转移
MOV A, #05H ;x < 0,不转移
;400B 26
DJNZ R1, LOOP
;400C D9FC
SJMP HERE
;400E 80F7
END
2021/8/26
返回目录 21
4.2 结构化程序设计方法
• 在汇编语言程序设计中,普遍采用结构化程序设计 方法。采用这种设计方法的主要依据是任何复杂的 程序都可由顺序结构、分支结构及循环结构程序等 构成。
1) 标号由1~8个ASCII字符组成。第一个字符必须是字母,其 余字符可以是字母、数字或其它特定字符; 2) 标号不能使用该汇编语言已经定义了的符号。如指令助记 符、伪指令以及寄存器符号名称等; 3) 标号后边必须跟以冒号。
2021/8/26
返回目录
8
4.1.2 汇编语言的规范
操作数:操作数用于给指令的操作提供数据或地址。 在一条汇编语句中操作数可能是空白的,也可能包 括两项或三项。各操作数间用逗号分隔。操作数字 段的内容可能包括工作寄存器、特殊功能寄存器、 标号、常数和表达式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
END
4.3 子程序
4.3.1子程序概念
所谓调用子程序,暂时中断主程序的执行,而转到子 程序的入口地址去执行子程序。如图下图所示。调用 子程序应注意:
(1)子程序占用的存储单元和寄存器。
(2)参数的传递。 (3)子程序经过调用后得到的数据来完成程序之间 的参数传递。 (4)嵌套调用与递归调用。
4.3 子程序
第四章 8051汇编语言程序设计 (6学时)
4.1 概述
4.2 基本结构程序设计
4.3 子程序设计
4.1 程序设计语言概述
按照语言的结构及其功能可以分为三种:
1.机器语言:机器语言是用二进制代码0和1表 示指令和数据的最原始的程序设计语言。
2.汇编语言:在汇编语言中,指令用助记符表 示,地址、操作数可用标号、符号地址及字 符等形式来描述。
ADDC A,@R1 ;高字节数相加
MOV @R0,A SJMP $
4.2.1 顺序结构程序
例4-2将30H单元的2个BCD码拆开并分别存放到31H和 32H两个单元中。 分析:先把30H(书上有误)中低4位BCD码交换出来, 存入到32H (书上有误)中,再把高4位BCD码交换 至低4位,存入到31H (书上有误)中。 程序如下: ORG 0000H LJMP MAIN
3.DB:定义数据字节 把数据以字节数的形式存放在存储器单元中。 4.DW:定义数据字 按字的形式把数据存放在存储单元中。
5.DS:定义存储区
从指定的地址单元开始,保留一定数量存储单元。 6.BIT:位定义 确定字符名为确定的位地址值。 7.END:汇编结束
返回本节
4.1.4 汇编语言源程序的编辑与汇编
ORG 0030H
4.2.1 顺序结构程序
MAIN: MOV R0,#32H MOV @R0,#00H
MOV A ,30H
XCHD A,@R0 SWAP A
MOV 31H,A
SJMP $ END
4.2.1 顺序结构程序
例4-3 设数a存放在R1中数b存放在R2中,计算Y=a2-b, 并将结果存入R4(低8位)R5(高8位)中。 程序如下: ORG 0000H LJMP START ORG 0030H START: MOV A,R1 MOV B,A MUL AB CLR C ; a送到A中 ;A送到B中 ;计算a2
4.1 程序设计语言概述
2.汇编语言的语句格式 汇编语言源程序是由汇编语句(即指令)组成的。汇编 语句一般由四部分组成。
其典型的汇编语句格式如下:
标号: 操作码 操作数; 注释 START:MOV A,30H;A←(30H) (2)特殊功能寄存器名;
操作数字段的内容可能包括以下几种情况:
(1)工作寄存器名; (3)标号名; (4)常数; (5)表达式。
N K=0 K=1 B A0 A1
条件满足? Y A
K=? …
…… (c)
K=n An
(b)
图4-1 分支程序结构流程图
4.2.2 分支程序 -单分支
例4-4两个单字节无 符号数比较大小。 设两个单字节 无符号数分别存在 RAM 30H(甲数)和 31H(乙数)单元 中,找出其中的大 数存入32H单元。
4.2.1 顺序结构程序
SUBB A,R2 MOV R4,A ; a2低8位减b ;存低8位结果到R4
MOV A,B
SUBB A,#00H MOV R5,A
;送高8位到A
;考虑可能有的进位 ;将高8位结果存到R5
SJMP $
END
4.2.2 分支程序
1.分支程序的基本形式
分支程序有单分支和多分支两种基本形式,如图4-1 所示。
返回本节
4.1.5 流程图的设计
常用的流程图符号有:开始和结束符号、工作任务 符号、判断分支符号、程序连接符号、程序流向符号等
开始或结束符号 判断分支符号 程序流向符号
工作任务符号
程序连接符号
程序流向符号
4.1常用流程图符号
返回本节
4.2 汇编语方程序设计步骤
1.分析问题
2.确定算法
3.设计程序流程图 4.分配内存单元 5.编写汇编语言源程序 6.调试程序
;取第一个数(甲)做被减数
;减去第二个数(乙) ;恢复A中较大的数
4.2.2 分支程序-单分支
BIG2: MOV A,@R0 NEXT:INC R0 MOV A,@R0 ;存结果 SJMP $ ;大数送到A中
END
4.2.2 分支程序 -多分支
例4-5 求符号函数,其中x存放在内部RAM 40H单元中, 结果y放在 41H中。
(c)交叉不正确
多重循环示意图
4.2.3 循环程序
-单循环结构
例4-7 多字节加法运算程序,在内部RAM从30H和40H开始分别存 有两个8字节数,现编程求他们的和放入内部RAM 30H开始单 元中(低字节在小的单元中)
程序如下:
ORG 0000H LJMP MAIN
ORG 0030H
MAIN: MOV R0,#30H ;初始化被加数指针地址 MOV R1,#40H ;初始化加数指针地址
开始
开始 置循环初值
置循环初值
循环处理 循环参数修改 N
循环结束? N 循环处理
循环参数修改 Y
循环结束?
Y
结束处理 结束处理 结束 结束 A)先执行后判断 B)先判断后执行
图4-5 循环结构程序流程图
4.2.3 循环程序
外循环 中循环 内循环
外循环
内循环
外循环 内循环
内循环
(a)嵌ET
子程序的调用与返回
4.3 子程序
LCALL A LCALL B
RET
RET
子程序的嵌套调用与返回
4.3 子程序-码制转换程序
例4-14 将十六进制数转换为ASCII码。 设一位十六进制数存放在R0寄存器的低4位,转换后的 ASCII码仍送回R0中存放。 解:根据ASCII码表:0~9的ASCII码为30H~39H,而 A~F的ASCII码为41H~46H
1.手工编程和汇编 先把程序用助记符指令写出,然后通过查指令编 码表,翻译成机器码,最后把机器码输入单片机, 进行调试和运行。 2.机器编辑和交叉汇编 机器编辑是指借助于微型机或开发器进行单片机 的程序设计。 交叉汇编是指使用一种计算机的汇编程序去汇编 另一种计算机的源程序。 “机器编辑—交叉汇编—串行传送”这三个过程 构成单片机软件设计的“三步曲”。
当R0小于9, ASCII码为 R0 + 30H
当R0大于9, ASCII码为 R0 + 30H+07H
4.3 子程序-码制转换程序
HEXASC1: MOV A,R0 ANL A,#0FH MOV R1,A ADD A,#0F6H MOV A,R1 JNC SMALL SMALL ADD A,07H SMALL: ADD A,30H MOV R0,A ;转换成ASCII码 ;小于9就转跳到 ;判断A>9?
RET
4.3 I/O接口控制类子程序
例4-19编写一个循环闪烁程序。有8个发光二极管,每 次其中1个灯闪烁点亮10次后,即转移到下一个闪烁 点亮10次,并循环不止。
P1.0
D0 D1
Q0 Q1
8 0 5 1
P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
D2
D3 D4 D5 D6
返回本节
4.1.5 流程图的设计
清晰正确的流程图是编制正确无误的应用程序的 基础和条件。所以,绘制一个好的流程图,是程序设 计的一项重要内容。 流程图可以分为总流程图和局部流程图。总流程图侧 重反映程序的逻辑结构和各程序模块之间的相互关系。 局部流程图反映程序模块的具体实施细节。对于简单 的应用程序,可以不画流程图。但是当程序较为复杂 时,绘制流程图是一个良好的编程习惯。
Q2
Q3 Q4 Q5 Q6
D7
Q7
74HC240 LED闪烁硬件电路图
4.3 LED循环闪烁程序
MOV A,#01H SHIFT: LCALL FLASH RR A SJMP SHIFT FLASH: MOV R2,#0AH FLASH1: MOV P1,A LCALL DELAY MOV P1,#00H LCALL DELAY DJNZ R2,FLASH1 RET
开始 X=0? x>0 y=0
y=1
存结果 结束
y = -1
4.2.2 分支程序 -多分支
程序如下: ORG 0000H LJMP START ORG 0030H START:MOV A,40H JCNE A,#00H,NEXT1 SJMP LAST
NEXT1:JB ACC.7,NEXT2 ;为负时溢出标志OV即ACC.7=1
开始 取甲数到A
A减去乙数
是否借位?
恢复A中的数 大数送给A 存结果 结束
4.2.2 分支程序-单分支
ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV R0,#30H MOV A,@R0 INC R0 CLR C SUBB A,@R0 JC BIG2 ADD A,@R0 SJMP NEXT
4.2.2 分支程序 -散转程序
MAIN: MOV DPTR,#TAB MOV A,R2 ADD A,R2 JNC NEXT INC DPH NEXT: JMP @A+DPTR TAB:AJMP KEY0 ;一条指令2个字节 ;判断是否有进位 ;有进位加到高字节地址 ;跳转 ;转向0号键处理程序 ;转移表首地址送入DOTR
3.高级语言:高级语言是接近于人的自然语言, 面向过程而独立于机器的通用语言。
返回本节
4.1 程序设计语言概述
4.1.2 汇编语言的语句结构 1.汇编语言的指令类型 MCS-51单片机汇编语言,包含两类不同性质的指令。 (1)基本指令:即指令系统中的指令。它们都是机器 能够执行的指令,每一条指令都有对应的机器码。 (2)伪指令:汇编时用于控制汇编的指令。它们都是 机器不执行的指令,无机器码。