8051单片机汇编程序编码规范
第3章80C51单片机汇编语言概述
30H R0
R0~R7、A、B(AB形式) E8H MOV A,R0
操作数 在R0
和DPTR
RAM
特点: 传送和执行速度快
30H
ACC
ROM
SFR
2019/12/16
7
二、 直接寻址
操作码后字节存放的是操作数的地址
寻址空间: 片内RAM低128字节 SFR(符号形式)
【例】若(50H)=3AH , 执行MOV A,50H后,(A)=3AH
3.3.1 状态控制伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
一 起始地址设定伪指令ORG
ORG 表达式 表达式通常为十六进制地址,例:
ORG 8000H START:MOV A,#30H
……
ORG可多次使用,但地址值的顺序要由小到大顺序设置
二 结束汇编伪指令END
MOV @R0,A ;(R0)←A MOV @R0,#55H ;(R0)←#55H MOV @R0,55H ;(R0)←(55H)
【例3-10】执行指令 MOV R6,#50H 后,(R6)= 50H
【例3-11】若(R1)=50H,(50H)=18H,执行指令 MOV 40H,@R1 后,(40H)=18H
单字节指令(49条
) 8位编码仅为操作码 位号 字节 如:INC A 编码为:
76543210 opcode
0 0 0 0 0 1 0 0 即:04H
8位编码含操作码和寄存器编码 位号 7 6 5 4 3 2 1 0
如:MOV A,R0 编码为:
字节 opcode r r r
1 1 1 0 1 0 0 0 即:E8H
以direct为目的,例如:
第三章 8051汇编指令
6
汇编语言对不同数制的表示方式
数据的表示方式: 十进制立即数:MOV A,#123 十六进制: MOV A,#7FH 二进制: MOV A,#10011011B 直接地址的表示方式: 十进制立即数:MOV A,123 十六进制: MOV A,7FH 二进制: MOV A,10011011B
注:目的操作数都是A
39
算术运算指令
[2]. 带进位加法指令(4条)
ADDC A, direct ;(A)+(data)+(C)→(A)
ADDC A,#data ;(A)+#data +(C)→(A) ADDC A,Rn ADDC A,@Ri ;(A)+Rn+(C)→(A) ;(A)+((Ri))+(C)→(A)
例如: CLR C
CPL C
SETB P1.2 作业:写出51单片机可位寻址的专用寄存器有哪 些?
17
[7].相对寻址 以PC的内容为基址,加上给出的偏移 量作为转移地址,从而实现程序的转移。这 种寻址方式主要用于转移指令。
例如: S: MOV A,#20 ..... AJMP S
18
软件使用介绍 单片机编程软件:KEIL 电路仿真软件:PROTEUS 电路仿真软件 PCB设计软件
MOV A,#'k'
11
[2].直接寻址 指令中原操作数直接以存储单元的地址 出现。 MOV A,direct 例如: MOV A,68H
12
[3].寄存器寻址 寄存器寻址可以对8个工作寄存器R0-R7进 行操作,也可以对寄存器A、B等进行操作。 例如: MOV R1,#10 MOV A,R1 MOV R2,A
80c51汇编语言指令格式
80c51汇编语言指令格式80C51汇编语言是一种低级编程语言,主要用于对8051系列单片机进行编程。
在80C51汇编语言中,指令格式基本上由操作码、操作数和注释组成。
下面将详细介绍80C51汇编指令的格式。
1.操作码(Opcode):操作码是指令的基本操作,决定了执行指令时处理器应该进行的具体操作。
80C51汇编指令的操作码包括一字节,可以是直接指令,也可以是扩展指令。
-直接指令:直接在指令中给出操作数,可以是寄存器、立即数、或者存储器地址。
指令的操作码如MOV、ADD等。
-扩展指令:扩展指令需要使用扩展二字节的形式,扩展二字节包括操作码和相关的操作数。
扩展指令的操作码如JMP、CALL等。
2.操作数(Operand):操作数位于指令的操作码之后,在指令中给出具体的数据或者数据的地址。
操作数的格式可以是直接给出的数据,也可以是通过地址访问的数据。
-立即数(Immediate value):直接给出的数据,一般用来作为常数或者立即加载到寄存器中的数据。
-寄存器(Register):指令操作数为特定的寄存器,分为通用寄存器和特殊功能寄存器两种。
-存储器(Memory):通过给出地址的方式访问存储器中的数据,可以是位于内部RAM或外部存储器中的数据。
3.注释(Comments):注释是对指令的解释和说明,用于增加代码的可读性。
在80C51汇编语言中,注释以分号(;)开头,并紧跟在指令或数据的后面。
下面是一些80C51汇编指令的例子以加深理解:1. MOV指令的格式:MOV A, #10 ;将立即数10加载到累加器A中MOV R1, R0 ;将R0的值复制到R1中2. ADD指令的格式:ADD A, R1 ;将累加器A与R1中的值相加,并将结果存回A中ADD A, #5 ;将累加器A与立即数5相加,并将结果存回A中3. JMP指令的格式:JMP 1000 ;无条件跳转到内存地址为1000的位置继续执行指令4. CALL指令的格式:CALL 2000 ;调用一个子程序,跳转到内存地址为2000的位置执行指令,并在子程序执行完成后返回到指令的下一条指令继续执行5. SJMP指令的格式:SJMP label ;有条件跳转指令,根据条件跳转到指定标签处执行指令6. RET指令的格式:RET ;用于从子程序返回主程序,并继续执行主程序的下一条指令总结:80C51汇编语言指令的格式主要由操作码、操作数和注释组成。
8051汇编语言概述一 ) 指令分类 42个助记符,33种功能,共...
3-3 数据传送类指令
数据传送操作是指把数据从源地址传送到目的地址, 源地址内容不变。共29条指令,使用8种助记符: 片内数据存储器传送指令MOV;
片外数据存储器传送指令MOVX;
程序存储器传送指令MOVC; 累加器交换指令 XCH、XCHD、SWAP; 堆栈操作指令 PUSH、 POP; 3-5
3-3-4 累加器交换指令
1) 字节交换指令XCH(3 条)
助记符格式
XCH A, Rn
机器码
11001rrrB
相应操作
A Rn
指令说明 机器周期
n=0~7 1 1
XCH A, direct 11000101B A (direct) direct
XCH A, @Ri
1100011iB data
MOV R2,#20h ;设臵传送次数 MOV DPTR,#TAB ;设臵数据源起始地址 MOV R0,#30H ;设臵目标起始地址 LOOP: MOV A, #00h ;设臵变址值 MOVC A, @A+DPTR ;读外部数据存储器 MOV @R0, A ;将数据传送到内部RAM INC R0 ;目标地址+1 INC DPTR ;源地址+1 DJNZ R2,LOOP ;传送个数判断
五)汇编语言的伪指令
伪指令不是真正的指令,它无对应的机器码,在汇编时不 产生目标程序,只是用来对汇编过程进行某种控制。 (p178)
1)ORG nnnnh ;设臵起始地址 例如: ORG 0030h mov a,#00h …… 2)END 汇编结束伪指令 3)EQU (data、bit)等值伪指令 例如:SDA EQU P1.0 ; sda bit P1.0 addr1 EQU 1000h ; addr1 data 1000h D5 EQU 5fh ; D5 data 5fh
第3章 8051指令系统和汇编..
前两条是程序存储器读指令(也称查表指令),后一条 是无条件散转指令。
寻址空间:程序存储器
13
3.1 指令系统基础
第3章 8051指令系统和汇编程序设计
3.1.2 寻址方式
6. 相对寻址
用于程序控制,利用指令修改PC指针内容实现转移。指令中给出的操 作数为程序转移的偏移量(用rel表示)。以PC的当前值(执行这条指令 后的PC)加上偏移量,所得结果即为转移的目的地址。
17
寄 存 器 间 接 @R0~R1,SP(PUSH、POP)
寻址 立即寻址 变址寻址 相对寻址 位寻址 3.1 指令系统基础 @R0~R1、@DPTR #data、#data16 基址寄存器:DPTR、PC; 变址寄存器:A; PC+偏移量 bit、C
第3章 8051指令系统和汇编程序设计
3.2.0 指令系统
指令中给出操作数所在的内存单元地址,该单元的内容为指令的操作数。 例: MOV A,direct 机器码:E5H, direct 例: MOV 30H, 50H MOV 30H, #50H 直接寻址的寻址空间 • 片内RAM的低128个字节单元(00H-7FH) • 特殊功能寄存器区(直接寻址是访问SFR的唯一方式) ;(A) (direct) ; direct为操作数所在的内存地址
汇编指令
操作码 MOV A,#40H MOV A,40H RET 74 E5 22
指令代码 操作数 40 40 隐含
指令长
度 双字节 双字节 单字节
指令时
间 单周期 单周期 双周期
INC A
DIV AB 3.1 指令系统基础
04
84
隐含,实际为A的内容
隐含,实际为A、B的内容
8051汇编语言概述一 ) 指令分类 42个助记符,33种功能,共...
3-2-6 位寻址
位寻址的的操作数是RAM单元和特殊功能寄存器中可 用于位操作的位的地址。 例如: setb 40h ;将28h的最低位(第0位)臵1 mov c, 3fh ;将27h的最高位(第7位)送到CY mov 3fh , c ;将CY 送到27h的最高位(第7位) anl c, 3fh ;CY & (27h的第7位) -> CY
3-3-4 累加器交换指令
1) 字节交换指令XCH(3 条)
助记符格式
XCH A, Rn
机器码
11001rrrB
相应操作
A Rn
指令说明 机器周期
n=0~7 1 1
XCH A, direct 11000101B A (direct) direct
XCH A, ቤተ መጻሕፍቲ ባይዱRi
1100011iB data
相应操作
Rn ← A
指令说明
n=0~7, rrr=000~111
机器周期
1 1 1
10101rrr Rn←(direct) n=0~7, direct rrr=000~111 Rn←#data n=0~7, rrr=000~111
MOV Rn, #data 01111rrr data
注意:以上传送指令的结果均不影响程序状态字寄存器 PSW 的 P 和 Z 标志。
3-3-1 片内数据存储器传送指令MOV
片内数据存储器传送指令MOV 共17 条,指令基本格式: MOV <目的操作数>, <源操作数> 1)以累加器 A 为目的地址的传送指令(4 条)
助记符格式 MOV A, Rn MOV A, direct MOV A, @Ri MOV A, #data 机器码 11101rrrB 相应操作 A←Rn 指令说明 n=0~7, rrr=000~111 i=0,1 机器周期 1 1 1
8051单片机3单片机指令系统
(1) 方括号[ ]表示该项是可选项, 可有可无。 (2) 标号是用户设定的符号, 它实际代表该指令所在的地址。 标号必须以字母开头, 其后跟1~8个字母或数字, 并以“:”结 尾。 (3) 操作码是用英文缩写的指令功能助记符。它确定了本条指 令完成什么样的操作功能。如: ADD表示加法操作。任何一 条指令都必须有该助记符项, 不得省略。 (4) 操作数指的是指令操作的数据. 可以是一个数,也可以是寄 存器和特殊功能寄存器,还可以是标号地址;个数可以为0, 3 也可以为1,2,3
23
3.4.1 数据传送类指令
3.4.1 数据传送类指令
数据传送类指令共29条, 它是指令系统中最活跃、 使 用最多的一类指令。一般的操作是把源操作数传送到目的操 作数, 即指令执行后目的操作数改为源操作数, 而源操作数保 持不变 数据传送类指令不影响进位标志CY、 半进位标志AC 和溢出标志OV, 但当传送或交换数据后影响累加器A的值时, 奇偶标志P的值则按A的值重新设定。 按数据传送类指令的操作方式,又可把传送类指令分 为3种类型: 数据传送、数据交换和堆栈操作, 并使用8种助记 符: MOV、MOVX、MOVC、XCH、XCHD、SWAP、 PUSH及POP 24
3.4.1 数据传送类指令
25
3.4.1 数据传送类指令
1. 内部数据存储器间数据传送指令
内部RAM区是数据传送最活跃的区域, 可用的指令数也最 多, 共有16条指令, 指令操作码助记符为MOV,通用格式为: MOV 目的操作数 , 源操作数 内部RAM之间源操作数传递关系如下图所示
26
3.4.1 数据传送类指令
4
3.1 指令格式
指令描述符号:
在分类介绍各类指令之前, 先对描述指令的一些 符号意义进行一些简单约定:
单片机8051汇编语言课件.
1.1 汇编语言言指令格式与伪指令
1.常用用单位与术语 位(bit):位是计算机所能表示示的最小小的、最基本的数据单位, 位通常是指一一个二二进制位。 字节(Byte):一一个连续的8位二二进制数码称为一一个字节,即 1Byte=8bit。 字(Word):通常由16位二二进制数码组成,即1Word=2Byte。 字长:字⻓长是指计算机一一次处理二二进制数码位的多少。MCS-51 型单片片机是8位机,所以说它的字⻓长为8位。 MCS-51系列单片片机都是以Intel公司最早的典型产品8051 为核心心,增加了一一定的功能部件后构成的。
位地址n可以是绝对地址,也可以是符号地址。
(8)数据地址赋值伪指令DATA 格式:字符名称x DATA 表达式n 功能:把表达式n的值赋值给左边的字符名称x。n可以是数据或地址,也可以是包含
所定义的“字符名称x”在内的表达式,但不能是汇编符号。 DATA与EQU的主要区别ATA 定义的“字符名称”没有这种限制。所以,DATA伪指令通常用用在源程序的开头或末 尾。
例如程序: START: ORG MOV MOV ┇ 1000H A,#20H B,#30H
(2)结束汇编伪指令END 格式:[标号:] END [表达式] 功能:放在汇编语言言源程序的末尾,表明源程序的汇编到此结束, 其后的任何内容不予理睬。
(3)赋值伪指令EQU 格式:字符名称x EQU 赋值项n 功能:将赋值项n的值赋予字符名称x。程序中凡出现该字符名 称x就等同于该赋值项n,其值在整个程序中有效。赋值项n可以 是常数、地址、标号或表达式。在使用用时,必须先赋值后使用用。 “字符名称”与“标号”的区别是“字符名称”后无无冒号,而而“标 号”后面面有冒号。
2.5 变址寻址
定义:操作数存放在变址寄存器(累加器A)和基址寄存器 (DPTR或PC)相加形成的16位地址单元中。这种寻址方方式称为 基址加变址寄存器间接寻址,简称为变址寻址。
8051单片机汇编指令集
将直接地址的内容加1 将间接地址的内容加1 数据指针寄存器值加1
当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位 将累加器的值减1 将寄存器的值减1 将直接地址的内容减1 将间接地址的内容减1 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节 存回B寄存器
指令 算数运算指令 1.ADD A,Rn 2.ADD A,direct 3.ADD A,@Ri 4.ADD A,#data 5.ADDC A,Rn 6.ADDC A,direct 7.ADDC A,@Ri 8.ADDC A,#data 9.SUBB A,Rn 10.SUBB A,direct 11.SUBB A,@Ri 12.SUBB A,0data 13.INC A 14.INC Rn
2 2 3 2 1 2 1 2 2 2 3 2 2 2 1 2 2 2 2 2 3 2 3 2
107.CJNE @Rn,#data,rel 3 2 108.CJNE @Ri,#data,rel 3 2 109.DJNZ Rn,rel 110.DJNZ direct,rel 111.NOP 2 2 3 2 1 1
A) 7-4←(A)7-4+6 将累加器的值与寄存器的值做AND的逻辑判断,结果存回累加器 将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器 将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器 将累加器的值与常数做AND的逻辑判断,结果存回累加器 将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址 将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址 将累加器的值与寄存器的值做OR的逻辑判断,结果存回累加器 将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器 将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器 将累加器的值与常数做OR的逻辑判断,结果存回累加器 将直接地址的内容与累加器的值做OR的逻辑判断,结果存回该直接地址 将直接地址的内容与常数值做OR的逻辑判断,结果存回该直接地址 将累加器的值与寄存器的值做XOR的逻辑判断,结果存回累加器
第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个 ;连续的地址单元。
单片机指令的格式掌握单片机指令的常见格式和语法规则
单片机指令的格式掌握单片机指令的常见格式和语法规则单片机指令是指单片机可以识别和执行的指令集合,它是单片机操作的基础。
掌握单片机指令的格式和语法规则,能够帮助程序员有效地编写单片机程序,实现各种功能。
本文将介绍单片机指令的常见格式和语法规则,帮助读者更好地理解和应用。
一、指令集单片机指令是由一系列二进制代码组成的,每个指令都代表着一种操作或功能。
不同的单片机对应的指令集各不相同,常见的有Intel 8051指令集、PIC指令集、AVR指令集等。
在编写程序时,需要根据所使用的单片机型号选择相应的指令集。
二、指令格式单片机指令的格式通常包括操作码、寻址方式和操作数等三部分。
其中,操作码是指令的标识符,用于表示指令的类型;寻址方式指明了操作数的获取方式;操作数是指令的参数,用于执行指令时的计算和操作。
下面以Intel 8051指令集为例进行说明:1. 无操作数指令无操作数指令不需要提供操作数,只需提供操作码即可完成对应的操作。
例如,操作码为NOP的指令表示空操作,不执行任何操作。
2. 间接寻址指令间接寻址指令需要使用寄存器作为指针,通过该寄存器指向的地址获取操作数。
例如,操作码为MOV A, @R0的指令表示将R0寄存器指向的地址中的内容移动到累加器A中。
3. 直接寻址指令直接寻址指令直接给出操作数的地址。
例如,操作码为MOV A, 40H的指令表示将地址为40H的数据移动到累加器A中。
4. 立即寻址指令立即寻址指令直接给出操作数的值。
例如,操作码为MOV A, #10的指令表示将立即数10移动到累加器A中。
5. 寄存器寻址指令寄存器寻址指令将寄存器作为操作数。
例如,操作码为ADD A, R1的指令表示将寄存器R1中的值与累加器A的值相加。
三、指令的语法规则1. 指令的顺序指令的执行顺序一般是按照程序的逻辑顺序执行的,即从程序的第一条指令开始逐条执行,直到程序的最后一条指令。
2. 指令的标号在编写程序时,可以为每条指令添加一个标号,用于跳转和循环等操作。
8051单片机第三章汇编语言程序设计
多字节加法的程序
0100
ORG 0100H
0100 900801
MOV DPTR,#0801H
0103 75A009
MOV P2,#09H
0106 7901
MOV R1,#01H
0108 7F0A
MOV R7,#0AH
010A C3
CLR C
010B E0 LOOP: MOVX A,DPTR
010C FC
;除100余数作为下一次的被除数 ;余数再除以10
200B C4 200C 45F0 200E FB
SWAP A ORL A,B MOV R3,A
;十位个位合并 ;十位个位合并存R3
200F 22
RET
三、求最大值或最 小值
1.无符号数求最大值 与最小值
例3-7 在以2042H为首 地址的存储单元中,连续 存放一组单字节无符号数, 数据个数存于2041H单元, 从中找出最大数并存于 2040H。
DPTR,A DPTR,#2000H A,DPTR DPTR,#2019H DPTR,A $
分支结构的程序举例
例3-2 有甲乙两数存于41H和42H存储单元,运算符号的 ASCII码存于40H单元,编写一根据40H的符号,对甲乙两数 进行相应运算的程序;井将运算结果存于43H单元。
ORG
LJMP ORG MOV CJNE PLUS: MOV ADD MOV SJMP
0117 E530 0119 F0 011A 80FE
MOV MOVX SJMP END
A,30H DPTR,A $
2.带符号数求 最大值或最小值
例3-8 —组单字 节带符号数据存放 在以2042H为首地 址的连续单元中, 数据长度存放在 2041H单元,找出 的最大值存于 2040H单元。
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章80C51单片机汇编语言程序设计
课程:单片机技术 教材:单片机基础
MOV A, R3; 分支程序序号送A
RL
A;
分支程序序号乘2
MOV DPTR,#BRTAB; BRTAB为转移指令表名称标号,
课程:单片机技术 教材:单片机基础
8000H
C;进位清0
DPTR, #ST1; 设数据指针
A,
@DPTR; A←((ST1)),取N1
R2,
A;
暂存N1
DPTR;
DPTR← ST2(指向N2单元)
A,
@DPTR; 取N2存于A中
A,
R2;N1,N2比较(N2-N1,差在A中)
BIG1;N2≥N1,转BIG1,N2<N1,顺序执行
(3)程序结构:顺序或循环结构 (4)数据类型:三字节、二进制、无符号数 (5)数据结构:升序或降序排列 (6)RAM单元安排: (内部RAM字节单元、位地址空间) (7)采用寄存器间接寻址方式(R0、R1)
加数(N1) 加数(N2)
高字节(8位) 中字节(8位) 低字节(8位) 高字节(8位) 中字节(8位) 低字节(8位)
对于第二条指令常用于本地范围查表即数据表格只能对于第二条指令常用于本地范围查表即数据表格只能放在该指令后面256个地址单元之内而且表格只能被本程序使用编写查表程序时首先把查表数据的序号送入a中再把从查表指令的下一条指令的首地址到表的首地址间的偏移量与a值相加然后再使用该指令进行查表操作并把结果送入a中
思考题(补充作业题): 上例中,如果采用CJNE A, direct,rel指令,应如何修改
MCU—80C51单片机汇编之基本概念汇编程序
1、顺序结构按照程序算法编写的顺序执行的程序例:将一个字节内的两个BCD码拆开成ASCII码,存入两个RAM单元。
PS:两个BCD码放在RAM20H,转化后的高半字节放在21H,低半字节放在22H。
ORG 1000HMOV R0,#22HMOV @R0,#0MOV A,20HXCHD A,@R0ORL 22H,#30HSWAP AORL A,#30HMOV 21H,ASJMP $END2、分支程序计算机需要根据不同的条件去执行不同处理程序例:空调机在制冷时,若排除的空气比吸入空气温度低8摄氏度,则认为是工作正常,否则认为故障,并设置故障位。
ORG 1000HSTART: MOV A,40HCLR CSUBB A,41HJC ERRORSUBB A,#8JC ERRORMOV 42H,#0SJMP EXITERRROR: MOV 42H,#0FFHEXIT: SJMP $END3、查表程序查表程序在非线性函数求解以及代码转换等方面有着重要的作用。
对于一些复杂的函数,事先把全部可能的答案按照一定的规律列表,当用户需要计算时,通过查表可以大大简化CPU的负担,提高运行速度。
查表指令MOVC A,@A+DPTR查表前需要把数据项地址存入DPTR,然后把相应的偏移量送入A(数据相对于数据表头地址的相对位置),最后利用“MOV A,@A+DPTR”完成查表。
MOVC A, @A+PC查表前需要把数据项地址存入A,然后利用ADD A,#data(data实质是查表指令和数据表之间的字节数)修正参数,最后利用“MOVC A,@A+PC”完成查表。
例:已知R0低4位有一个十六进制数(0~F中的一个),请编写能把他转换成对应ASCII码并送入R0的程序求解法一:实时运算ORG 0100HMOV A,R0ANL A,#0FHCJNE A,#10,NEXT1NEXT1: JNC NECT2ADD A,#30SJMP DONENEXT2: ADD A,#37HDONE: MOV R0,ASJMP $END求解法二:查表解法ORG 0100HMOV A,R0ANL A,#0FHADD A,#03HMOVC A,@A+PCMOV R0,ASJMP $ASCTAB: DB ‘0123456789’DB ‘ABCDEF’END4、散转指令散转程序属于分支程序范畴,是根据某种输入或运算的结果,分别转向各个处理程序。
80C51单片机汇编指令的格式
80C51单片机汇编指令的格式
汇编指令(符号指令)就是指令的助记符,是一种关心计算机程序员记忆的符号,汇编指令是由标号、指令助记符、指令操作数、注解4部分组成,格式如下:
标号:指令助记符指令操作数;注解
如:LOOP :MOV A,#03H ;(A)←03H为一条汇编指令。
指令中各项含义说明如下:
(1)标号:用于表示指令地址,由字母与数字组成。
如上例中LOOP 为标号,表示MOV指令的地址位置。
标号与指令助记符必需用冒号“:”分开。
在汇编指令中标号不是必需的,可依据需要设置。
(2)指令助记符:用于说明指令将进行何种操作,如上例中MOV 为指令助记符,MOV表示进行传送操作,传送内容及地址由指令操作数给出。
指令助记符与操作数用空格隔开。
(3)指令操作数:通常格式为:目的操作数,源操作数
目的操作数供应接收数据的地址单元,源操作数供应发送数据或数据地址。
如在上例中,接收数据的目的操作数为累加器A,而发送数据的源操作数为马上数03H。
但必需留意,指令操作数可能有2个或3个、也可能只有1个或1个也没有。
当读者学完本章自然会明白这一点。
(4)注解:是对指令操作的说明,汇编时被忽视。
书写注解的主要目的是便于阅读程序,因此,注解可有可无。
注解与操作数之间用分
号“;”作为分隔符。
在汇编指令中,最简单的是指令操作数,指令操作数既可以是马上数或寄存器R0~R7,也可以是地址为00H~FFH的存储器单元,还可以是位地址区的一位二进制数。
要想正确地使用汇编指令编写程序,必需学会指令操作数的寻址方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8051单片机汇编程序编码规范引言软件设计更多地是一种工程,而不是一种个人艺术。
如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。
分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。
可见,提高软件质量必须降低编码阶段的错误率。
如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。
本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。
1.排版规则1程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。
缩进的目的是使程序结构清晰,便于阅读和理解。
<TAB>默认宽度应为8个空格,由于Word中<TAB>为4个空格,为示范清晰,此处用2个<TAB>代替(下同)。
例如:MOV R1, #00HMOV R2, #00HMOV PMR, #PMRNORMALMOV DPS, #FLAGDPTRMOV DPTR, #ADDREEPROMread1kloop:read1kpage:INC R1MOVX A, @DPTRMOV SBUF, AJNB TI, $CLR TIINC DPTRCJNE R1, #20H, read1kpageINC R2MOV R1, #00HCPL WDICJNE R2, #20H, read1kloop ;END OF EEPROM规则2在指令的操作数之间的,使用空格进行间隔,采用这种松散方式编写代码的目的是使代码更加清晰。
CJNE R2, #20H, read1kloop ;END OF EEPROM规则3一行最多写一条语句。
规则4变量定义时,保持对齐。
便于阅读和检查内存的使用情况。
例如:RegLEDLOSS EQU 30H ; V ARIABLE ; TESTLED==RegLEDLOSS.0RegLEDRA EQU 31H ; V ARIABLERUNLED_Flag EQU 32H ; V ARIABLE ; 256ms改变一次RUNLED状态RUNLED_Def EQU 10H ; STA TIC ; 16*32ms=500ms改变一次LED状态2.注释注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,太少不利于代码理解,太多则会对阅读产生干扰,因此只在必要的地方才加注释,而且注释要准确、易懂、尽可能简洁。
注释量一般控制在30%到50%之间。
规则1程序在必要的地方必须有注释,注释要准确、易懂、简洁。
例如如下注释意义不大:MOV DXCE1COUNTER, #00H ; 将DXCE1COUNTER赋值为0而如下的注释则给出了额外有用的信息:JNZ PcComm_Err ; 假如校验出错规则2注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
规则3头文件、源文件的头部,应进行注释。
注释必须列出:文件名、作者、目的、功能、修改日志等。
规则4函数头部应进行注释,列出:函数的目的、功能、输入参数、输出参数、涉及到的通用变量和寄存器、调用的其他函数和模块、修改日志等。
对一些复杂的函数,在注释中最好提供典型用法。
规则5对重要代码段的功能、意图进行注释,提供有用的、额外的信息。
并在该代码段的结束处加一行注释表示该段代码结束。
对于所有的常量,变量,数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。
规则7维护代码时,要更新相应的注释,删除不再有用的注释。
保持代码、注释的一致性,避免产生误解。
3.命名规则 1标识符缩写形成缩写的几种技术:1) 去掉所有的不在词头的元音字母。
如screen写成scrn, primtive写成prmv。
2) 使用每个单词的头一个或几个字母。
如Channel Activation写成ChanActiv,Release Indication写成RelInd。
3) 使用变量名中每个有典型意义的单词。
如Count of Failure写成FailCnt。
4) 去掉无用的单词后缀ing, ed等。
如Paging Request写成PagReq。
5) 使用标准的或惯用的缩写形式(包括协议文件中出现的缩写形式)。
如BSIC(Base Station Identification Code)、MAP(Mobile Application Part)。
关于缩写的准则:1) 缩写应该保持一致性。
如Channel不要有时缩写成Chan,有时缩写成Ch。
Length有时缩写成Len,有时缩写成len。
2) 在源代码头部加入注解来说明协议相关的、非通用缩写。
3) 标识符的长度不超过12个字符。
规则2变量命名约定:<前缀> + 主体; 注释变量命名要考虑简单、直观、不易混淆。
前缀是可选项,表示变量类型,由于汇编中变量多是单字节变量,所以单字节变量可以不加前缀,对于bit和双字节型变量,使用小写的b和d作为前缀表示。
主体是必选项,可多个单词(或缩写)合在一起,每个单词首字母大写,其余部分小写。
规则3常量的命名常量的命名规则:单词的字母全部大写,各单词之间用下划线隔开。
规则4函数的命名单词首字母为大写,其余均为小写。
函数名应以一个动词开头,即函数名应类似一个动词断语或祈使句。
例如:Test_Protect,Check_EEPROM,Init_Para4.可维护性函数和过程中关系较为紧密的代码尽可能相邻。
规则2每个函数的源程序行数原则上应该少于200行。
对于消息分流处理函数,完成的功能统一,但由于消息的种类多,可能超过200行的限制,不属于违反规定。
规则3语句嵌套层次不得超过5层。
嵌套层次太多,增加了代码的复杂度及测试的难度,容易出错,增加代码维护的难度。
规则4避免相同的代码段在多个地方出现。
当某段代码需在不同的地方重复使用时,应根据代码段的规模大小使用函数调用或宏调用的方式代替。
这样,对该代码段的修改就可在一处完成,增强代码的可维护性。
规则5每个函数完成单一的功能,不设计多用途面面俱到的函数。
多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。
使函数功能明确化,增加程序可读性,亦可方便维护、测试。
规则6在函数的项目维护文档中,应该指出软件适用的硬件平台及版本。
建议1使用专门的初始化函数对所有的公共变量进行初始化。
5.程序正确性、效率规则1严禁使用未经初始化的变量。
引用未经初始化的变量可能会产生不可预知的后果,特别是引用未经初始化的指针经常会导致系统崩溃,需特别注意。
规则2防止内存操作越界。
说明:内存操作越界是软件系统主要错误之一,后果往往非常严重。
规则3注意变量的有效取值范围,防止表达式出现上溢或下溢。
规则4防止易混淆的指令和操作数拼写错误。
规则5避免函数中不必要语句,防止程序中的垃圾代码,预留代码应以注释的方式出现。
程序中的垃圾代码不仅占用额外的空间,而且还常常影响程序的功能与性能,很可能给程序的测试、维护等造成不必要的麻烦。
规则6通过对系统数据结构的划分与组织的改进,以及对程序算法的优化来提高空间效率。
这种方式是解决软件空间效率的根本办法。
规则7循环体内工作量最小化。
应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而提高程序的时间效率。
规则8在多重循环中,应将最忙的循环放在最内层。
规则9避免循环体内含判断语句,将与循环变量无关的判断语句移到循环体外。
目的是减少判断次数。
循环体中的判断语句是否可以移到循环体外,要视程序的具体情况而言,一般情况,与循环变量无关的判断语句可以移到循环体外,而有关的则不可以。
规则10中断和恢复中断程序应该尽量短,应该在中断中进行标记,在主程序中处理。
但实时性很高的程序段例外。
中断时应该保存所有涉及到的通用变量和寄存器,如A, PSW, DPTR等。
规则11堆栈设置堆栈对于程序非常重要,对于堆栈的设置要合理。
堆栈太小,在嵌套调用和很容易溢出,造成系统故障;堆栈太大,浪费RAM资源。
为了节约堆栈资源,中断时要求不要保存太多资源,中断嵌套和程序嵌套层数不要太多,尽量不要超过5层。
这就要求合理的划分功能模块。
规则12看门狗看门狗电路用于在单片机死机时自动复位。
单片机需要定时向看门狗发送脉冲,俗称”喂狗”。
喂狗不可太勤,这样看门狗没有起到作用;也不可太慢,这样容易造成单片机复位。
正确的喂狗应该在主循环中进行,最好是建立一个独立的系统监控进程。
不可以在定时中断中喂狗,应为单片机有时可能会在主循环中死掉。
6.接口规则1去掉没有必要的公共变量,编程时应尽量少用公共变量。
公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。
应该构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象。
规则2当向公共变量传递数据时,要防止越界现象发生。
对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。
规则3尽量不设计多参数函数,将不使用的参数从接口中去掉,降低接口复杂度,减少函数间接口的复杂度。
规则4对所调用函数的返回码要仔细、全面地处理。
防止把错误传递到后面的处理流程。
如有意不检查其返回码,应明确指明。
规则5检查接口函数所有输入参数的有效性。
规则6检查函数的所有非参数输入,如外部数据、公共变量等。
7.代码可测性规则1模块编写应该有完善的测试方面的考虑。
规则2源代码中应该设计了代码测试的内容。
在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码。
程序的调试与测试是软件生存周期中很重要的一个阶段,如何对软件进行较全面、高率的测试并尽可能地找出软件中的错误就成为很关键的问题。
因此在编写源代码之前,除了要有一套比较完善的测试计划外,还应设计出一系列代码测试手段,为单元测试、集成测试及系统联调提供方便。
规则3在同一项目组或产品组内,要有一套统一的为集成测试与系统联调准备的调测开关及相应函数,并且要有详细的说明。
本规则是针对项目组或产品组的。