导图社区 单片机汇编程序设计思维导图
C51单片机第三章单片机汇编程序设计总结,包括51系列单片机汇编指令格式及标识、51单片机指令的寻址方式、51单片机的指令系统、51单片机汇编程序常用伪指令等内容。
编辑于2024-12-21 13:46:46第三章 单片机汇编程序设计
51系列单片机汇编指令格式及标识
指令格式
[标号;]操作码助记符 [目的操作数] [,源操作数] [;注释]
1.操作码助记符表明指令的功能,不同的指令有不同的助记符,由说明其功能的英文缩写表示
子主题
2.操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用响应寻址方式指明
3.标号是该指令的符号地址,后面需带冒号。为转移指令提供转移的目的地址
4.注释是对该指令的解释,前带分号,根据编程者需求添加
指令中用到的标识符
1.Ri和Rn:表示当前工作寄存区中的工作寄存器,i取0或1,表示R0或R1.n取0-7,表示R0-R7.
2.#data:表示包含在指令中的8位立即数
3.#data:表示包含在指令中的16位立即数
4. rel :以补码的形式表示的8位的相对偏移量,范围为-128~127,主要用在相对寻址的指令中
5. addr16和addr11:分别表示16位直接地址和11位直接地址
6. direct:表示直接寻址的地址
7. bit :表示可按位寻址的直接位地址
8. (X):表示X单元中的内容
9. / 和 →符号:"/"对改为操作数取反,但不影响该位的原值。"→"表示操作流程,将箭尾方向内容输入到箭头所指方向单元中去
51单片机指令的寻址方式
所谓寻址方式就是操作数或操作数地址的寻址方式
常数寻址(立即寻址)
操作数为常数,使用时直接出现于指令中,紧跟操作码,作为指令的一部分,,与操作吗一起存放于程序储存器中,可立即寻得并执行,无需其他途径。
MOV A,#20H
寄存器数寻址(寄存器寻址)
操作数在寄存器中,使用时在指令中直接提供寄存器名称这种方式称为寄存器寻址(R0~R7,及部分特殊寄存器)
MOV A,R0
存储器数寻址
针对的数据存放于存储单元中,对存储器单元中的内容通过提供存储器地址单元寻址
直接寻址
MOV A,20H
将片内数据存储器20H单元内容送入累加器A
MOV A,P0
将P0(80H)口内容送入累加器A
寄存器间接寻址
存储器单元的地址存放于寄存器中,在指令中通过提供寄存器来使用对应存储单元
MOV A,@R1
将以工作寄存器R1中的内容为地址的片RAM单元的数据传送到累加器A中
变址寻址
操作数的地址由基址寄存器中存放的地址加上变址寄存器中存放的地址得到
MOVC A,@ A+DPTR
将数据指针寄存器DPTR中的内容和累加器A中的内容相加作为程序存储器的地址
位数据寻址
独立处理器,位操作对象为各种数据
直接位地址(00H~0FFH)
字节地址带位号。
20.3H表示20H单元的三位
特殊功能寄存器名带位号
P0.1表示P0口的1位
位符号地址
TR0是定时器/计数器T0的启动位
指令寻址
指令寻址用于控制转移指令中,为了得到转移的目的的位置的地址
绝对寻址
在指令操作数中直接提供目的位置的地址或地址的一部分
相对寻址
当前PC值是转移指令执行时的PC值,他等于转移指令的地址加上转移指令的字节数。实际上是转移指令的下一条指令的地址
偏移量rel是8位有符号数,以补码表示,他的取值范围为-128~+127,当为负数时向前移,为正数时向后转移。 目的地址=当前PC+rel=转移指令的地址+转移指令的字节数+rel
51单片机的指令系统
数据传送指令
实现数据在各模块之间的相互传送,将源操作数传送到目的操作数。
① 以累加器A为目的寄存器的传送指令会影响PSW 中的奇偶标志位 (程序状态字PSW),其余传送指令对所有标志位均无影响。 ② 不能任意制造非法指令,源操作数和目的操作数中的Rn和@Ri不能 相互配对。如不允许有“MOV Rn,Rn”,“MOV @Ri,Rn” “MOV Rn,@Ri”这样的指令。如果涉及到相应处理,可通过累加 器A中间处理。 ③ 片外数据存储器、程序存储器都只能通过累加器A传送,程序存储器 只能读,不能写。 ④ 堆栈操作指令通常是用来保存和恢复数据,如果多个数据的保存和 恢复,要先入栈的数据后出栈恢复,后入栈的数据先出栈恢复。
算数运算指令
1. 算术运算指令执行要影响标志位。 其中:ADD、ADDC和SUBB指令要影响CY、AC、OV和P标志位,INC和DEC只影响P标志位; MUL指令执行后CY复位,当积大于255时,OV为1,否则,OV为0; DIV指令执行后一般情况下CY和OV都清0,而当B寄存器中的除数为0时,CY和OV置1。 2. 51单片机只有带借位减法,没有一般减法,一般减法可通过带借位减法 实现,只需要执行带借位减法前先把借位清零。 3. 51单片机的乘法和除法指令都只有一条,针对的只能是无符号数。 4. 十进制调整指令只有一条DA A,只能用在ADD或ADDC指令的后面,用来对两个二位压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使之得到正确的十进制结果。 调整过程: (1) 若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累 加器A中的内容做加06H调整。 (2) 若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器 A中的内容做加60H调整。 44
逻辑操作指令
1.逻辑与通常用于实现对指定位清0,其余位不变;逻辑或通常用于实 现对指定位置1,其余位不变;逻辑异或通常用于实现指定位取反,其 余位不变。 2.循环移位指令通常用于把一个字节各位依次取出使用
控制转移指令
1. 无条件转移指令:当指令执行后,程序将无条件地转移到指令指定的地方。 条件转移指令:当条件满足时,程序转移到指定位置,条件不满足时,程 序将继续顺次执行。 2. LJMP和AJMP是绝对转移,其他都是相对转移。LJMP可实现程序存储器 64KB空间范围内转移,AJMP实现当前位置2KB空间内转移,相对转移转移 范围为-128~+127字节。 (1) 长转移指令LJMP (64KB 范围内转移指令),为三字节双周期指令。 指令码为 (2) 绝对转移指令AJMP (2KB 范围内转移指令)。绝对转移指令是一条双字节双周期指令,11 位地址addr11(a10~a0) 在指令中的分布为 (3)短转移指令SJMP (-126~+129范围内转移指令)3. 子程序调用指令转移前会先将当前的PC值(指令执行的PC值)入栈保存。RET (RETI)放在子程序(中断服务子程序)的最后位置,用来返回主程序的断点 位置,RETI和RET基本操作相同,只是RETI在回主程序前要将先将相应的中断 优先级触发位清零。
位操作指令
1. 位传送必须有位运算器C参与,不能直接实现两位之间的传送。 2. 位逻辑运算指令通常用来实现各种各样的逻辑功能。 3. 位转移指令通常用来实现各种位测试。 4. 空操作指令执行时,不做任何操作,但要消耗一个机器周期时间,常常用 它来构造延时程序
51单片机汇编程序常用伪指令
是指放在汇编语言源程序中用于指示hi编程序如何对源程序进行汇编的指令
ORG伪指令
放在一端源程序或数据之前,指明从程序存储器的什么位置开始存放。其后地址是数据或程序的起始地址
格式:ORG 地址(十六进制表示)
DB伪指令
用于定义字节数据,定义的多个字节在储存器中是连续存放的
格式: [标号:]DB或项表
DW伪指令
用于定义字数据,定义的字节在储存器中占两个字节。汇编时自动按高字节在前,低字节在后存放,既,高字节低地址单元,低字节高地址单元
格式:[标号:]DW项或项表
DS伪指令
在存储器中保留一定数量的字节单元,用于之后存放数据。
格式:[标号:]DS数字表达式
EQU伪指令
将指令中的值赋予EQU前面的符号,之后可以使用符号借代相应项
格式:符号 EQU 项
DATA伪指令
给片内RAM字节单元地址赋予DATA前面的符号,赋值后可用该符号代替DATA后片内RAM字节单元地址
格式:符号 DATA 直接字节地址
XDATA伪指令
与DATA相同针对片外RAM字节单元
格式: 符号 XDATA 直接字节地址
bit伪指令
给位地址赋予符号,赋值后可用该符号代替bit后面的位地址
格式: 符号 bit 位地址
END伪指令
放于程序最后,表明程序结束
格式:END
51单片机汇编程序设计
(1)明确课题的具体内容,对程序功能、运算精度、执行速度等方面的要求及硬件条件 (2)把复杂问题分解为若干个模块,确定各模块的处理方法,画出程序流程图(简单问题可以不画)。对复杂问题可分别画出分模块流程图和总的流程图。 (3)存储器资源分配,如各程序段的存放地址、数据区地址、工作单元分配等。(4)编制程序,根据程序流程图精心选择合适的指令和寻址方式来编制源程序(5)对程序进行汇编、调试和修改。将编制好的源程序进行汇编,检查修改程序中的错误,执行目标程序,对程序运行结果进行分析,直至正确为止。
数据传送程序
字节内容的转移
运算程序
字节数之间的运算
代码转换程序
利用规律运算或查表的方式转换
多分支转移(散转)程序
JMP @A+DPTR
由数据指针寄存器DPTR的内容与累加器A中的内容相加得到转移的目的地址
RET
先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的地址,按先低字节后高字节的顺序压入堆栈,然后执行RET指令,执行后则转到对应目的位置
延时程序
每条指令都要占用一定的机器周期,延时程序通过执行多条指令来实现,一般采用循环结构。