电子工程师提升计划-第4章 单片机编程【1.9】

下面以一个程序段为例来说明短转移指令的功能。例如:
1000H: AJMP 0783H
# #
1783H: MOV A,#0FFH
在执行该指令前,PC中的值是1000H,即(PC)=1000H,如图4-8(a)所示。执行该指令时,先将(PC)
+2=1002H(0001000000000010),然后再用地址
0783H(0000011110000011)中的低11位替代1002H中的低11位,得到的新地址是0001011110000011(1783H),在PC中的值为1783H, PC跳转到1783H处并执行该处的指令(MOV A,#0FFH),如图4-8(b)所示。

        由于短转移指令只可以改变 PC 中的低 11 位,高 5 位不能改变,故 PC 值的变化范围为 0~211=2048=2KB,所以该指令只可以跳转执行0~2KB范围内的指令,即要求转移的地址和当前地址相隔不能超过2KB。
(2)长转移指令
长转移指令比短转移指令的跳转范围要大,它的操作码助记符是“LJMP”。
长转移指令的形式和功能如下:

下面以一个程序段为例来说明长转移指令的功能。例如:
0100H:LJMP 0783H
        在执行该指令前,PC中的值是0100H,即(PC)=0100H,如图4-9(a)所示。执行该指令后, PC中的值变为0783H,PC就跳转到0783H地址并执行该处的指令,如图4-9(b)所示。
        长转移指令可以改变PC中的16位,故PC中的地址变化范围为0~216=0~64KB,所以该指令可以跳转执行0~64KB范围内的指令(如从0000H地址最远只能跳至FFFFH地址)。
(3)相对转移指令
        相对转移指令的操作码助记符是“SJMP”。

相对转移指令的形式和功能如下:


在编写程序时,rel是一个地址标号。
下面以一个程序段为例来说明相对转移指令的功能。例如:
1000H: MOV A #01H
# #
1050H: SJMP 1000H
在上述程序中,当执行到“1050H: SJMP 1000H”时,程序会跳转到1000H处,并执行“MOV A #01H”指令。
        因为(PC)目=(PC)源+2+rel,所以rel=(PC)源-(PC)目-2=1000H-1050H-2=-52H,地址偏移量为-52H。在编写程序时,只需在“SJMP”后面写地址标号,不用写地址偏移量(在汇编时,汇编程序会自动计算偏移量)。
        SJMP指令转移的目标地址可以在当前PC地址的前128B到后127B之间(-128~+127)。例如在执行“1050H: SJMP 1000H”指令时,PC地址为 1050H,“SJMP”指令可转移的范围是 1050H地址的前128个单元到后127个单元。
(4)散转指令
散转指令的操作码助记符是“JMP”。
散转指令的形式和功能如下:

下面以一个程序段为例来说明散转指令的功能。例如:
JMP @A+DPTR
        如果指令执行前,(A)=12H,(DPTR)=1234H,上述指令执行后,PC中的值为1246H,程序将跳转并执行1246H地址单元的指令。总之,短转移指令AJMP可在0~2KB的ROM空间转移,但要求转移的地址和当前地址(当前PC值)在同一个0~2KB区域内;长转移指令可
在0~64KB的ROM空间任意转移;相对转移指令可在当前地址的前128B到后127B的ROM空间内转移;散转指令与长转移指令一样,也可在0~64KB的ROM空间任意转移,但由于累加器A和DPTR中的数据都可变化,故使用起来更灵活。
2.有条件控制转移指令
        有条件控制转移指令在某种条件满足时执行转移,不满足则不执行转移。它包括累加器判0转移指令、位控制转移指令、比较不相等转移指令和减1不为0转移指令。
(1)累加器判0转移指令
        累加器判0转移指令首先判断累加器是否为0,然后决定是否转移。它有2条指令,各条指令的形式和功能如下:

下面以一个程序段为例来说明累加器判0转移指令的功能。例如:
LOOP: CLR A
1010H: JZ LOOP
1012H: MOV A, #23H
        第1条指令将累加器A清0;在执行第2条指令时,由于A中数据为“0”,所以程序跳转执行地址标号LOOP处的指令,如果A的数据不为“0”,程序将执行1012H处的指令,即执行下一条指令“MOV A,#23H”。这是因为 JZ 指令占 2B,当 JZ 指令执行完后,PC 中的值变为 1012H,PC指向下一条指令。
(2)位控制转移指令
        位控制转移指令根据某位的值来决定是否转移。它有5条指令,各条指令的形式和功能如下:

下面以一个程序段为例来说明位控制转移指令的功能。例如:
LOOP: MOV A,#65H
CLR P1.3
JB P1.3,LOOP
MOV A,#23H
        第1条指令是将数据65H送入累加器A中;第2条指令是将寄存器P1的D3位清0;执行第3条指令时,由于P1的D3位为“0”,所以程序会执行下一条指令(第4条指令),若将第2条指令改为“SETB P1.3”,就将P1的D3位置“1”,执行第3条指令时,程序会跳转执行地址标号为LOOP的第1条指令。
(3)比较不相等转移指令
比较不相等转移指令的操作码助记符是“CJNE”。
        指令格式:CJNE操作数1,操作数2,rel指令的功能是将操作数1与操作数2进行比较,如果两者不相等则转移到地址标号rel处。
        比较不相等转移指令有4条,各条指令的形式和功能如下:

说明:这4条指令为3B指令,转移范围是以当前PC值为中心的前128B到后127B的空间,即地址标号rel为-128~+127B。
(4)减1不为0转移指令
减1不为0转移指令的操作码助记符是“DJNZ”。
指令格式:DJNZ操作数1,rel
指令的功能是将操作数1减1,如果结果不为“0”则转移到地址标号rel处。
减1不为0转移指令有2条,各条指令的形式和功能如下:

3.子程序调用及返回指令
        在编程时,如果需要某段程序反复运行,可以将该段程序写成子程序的形式。在主程序运行时,可通过子程序调用指令来执行子程序,子程序执行完后,再通过返回指令从子程序返回到主程序。
(1)子程序调用指令
        子程序调用指令有2条:长调用指令和短调用指令(绝对调用指令)。各条指令的形式和功能如下:

        子程序调用指令的工作原理简单来说就是在执行子程序前,先将本指令的下一条主程序指令的地址保存在 SP 中,然后再执行子程序。之所以要将下一条主程序的指令地址保存下来,是为了在执行完子程序后能够返回到下一条主程序指令,并执行它。
        子程序调用指令执行过程很复杂,但这些过程都是由单片机硬件自动完成的,编程时一般不用理会。下面以一个程序段为例来说明子程序调用指令的功能。例如:
MOV A,#65H
LCALL DELAY
MOV P2,#23H

DELAY:…
RET
        当程序运行到“LCALL DELAY”指令时,硬件会先将下一条指令“MOV P2,#23H”的地址保存到SP中,然后执行DELAY处的子程序,当子程序运行到“RET”指令时,该指令让硬件将SP中保存的地址送给PC,PC就指向该地址处的指令“MOV P2,#23H”,并执行该条指令。
(2)返回指令
        返回指令有2条:子程序返回指令和中断返回指令。各条指令的形式和功能如下:

        返回指令工作原理简单来说就是将保存在 SP 中的指令地址(即调用指令的下一条指令的地址)取出,送给 PC,然后 PC 指向该地址处的指令并执行它。返回指令从 SP 中取出地址并送给PC的过程由硬件自动完成,编程时只要知道执行“RET”指令后,程序会返回到调用指令的下一条指令即可。
4.空操作指令
空操作指令的操作码助记符是“NOP”。
指令格式:NOP
指令的功能是将PC中的值加1,而不进行其他操作,该指令执行时会耗时1个机器周期。

4.3.5 位操作类指令

        位操作类指令的功能是对单片机内部存储器的位单元进行操作。位操作类指令有数据位传送指令、位变量修改指令、位变量逻辑指令和位控制转移指令。MCS-51 系列单片机内部能进行位操作的空间如下。
① 特殊功能寄存器(SFR)中可位寻址的位单元。
② 地址为 20H~2FH 的 16B 存储单元(每字节存储单元有 8位,共有 128 个位单元,这 128个位单元的位地址为00H~7FH)。
1.数据位传送指令
数据位传送指令有2条,各条指令的形式和功能如下:

2.位变量修改指令
位变量修改指令有6条,它们分别可以清0、取反和置“1”。各条指令的形式和功能如下:


3.位变量逻辑指令
位变量逻辑指令有4条,各条指令的形式和功能如下:

例如:累加器A中的数据为01101010,PSW的CY位中的数据为“1”,现在执行指令:
ANL C,/ACC.3
在指令执行时,将累加器A的第3位(位地址为E3H)数据“1”取反变为“0”,然后将“0”与CY位中的“1”进行与运算,运算结果为“0”,“0”被送到CY位中。
4.位控制转移指令
位控制转移指令有下面5条:
JC rel
JNC Rn
JB bit,rel
JNB bit,rel
JBC bit,rel
由于位控制转移指令在前面已详细介绍过(见“程序控制类指令”中的内容),这里不再说明。
明。

4.4 伪指令

        单片机是无法识别汇编语言程序的,所以用汇编语言写好程序后,还要用汇编程序将汇编语言程序(以下称作源程序)汇编(翻译)成单片机能识别的机器语言程序(又称目标程序),然后再通过编程器将目标程序写入单片机的程序存储器(ROM)中。在汇编时,汇编程序会将源程序中的每条汇编语言指令转换成相应的机器指令,如果在汇编时需要汇编程序对源程序进行一些处理,可在源程序中加入一些特殊的指令,由于这些指令只是告诉汇编程序在汇编时如何处理源程序,而并不会被转换成机器指令,故将这些指令称为伪指令。常用的伪指令有下面8条。

4.4.1 汇编起始指令(Origin)

汇编起始指令
操作码助记符:ORG
格式:ORG 16位地址
功能:该指令用于指示下一条指令在程序存储器中的起始地址。
举例:ORG 2000H
MOV A,36H
“ORG 2000H”的功能是指示它的下一条指令“MOV A,36H”的起始地址为2000H。

4.4.2 定义字节指令(Define Byte)

定义字节指令
操作码助记符:DB
格式:DB 字节内容
功能:该指令用于定义字节内容。
举例:ORG 3000H
DB 45H,36H,56H,7AH
第1行指令的功能是指示它的下一条指令的起始地址为3000H;第2
行指令的功能是依次让3000H、3001H、3002H、3003H单元中的数据为45H、36H、56H、7AH,即让(3000H)=45H、(3001H)=36H、(3002H)=56H、(3003H)=7AH。

4.4.3 定义字指令(Define Word)

定义字指令
操作码助记符:DW
格式:DW 字内容
功能:该指令用于定义字内容。
举例:ORG 4000H
DW 4510H,3621H,5600H
第1行指令的功能是指示它的下一条指令的起始地址为4000H;第2行指令的功能是依次让4000H、4001H、4002H、4003H、4004H、4005H单元中的数据为45H、10H、36H、21H、56H、00H,即让(4000H)=45H、(4001H)=10H、(4002H)=36H、(4003H)=21H、(4004H)
=56H、(4005H)=00H。

4.4.4 定义预留存储单元指令(Define Space)

定义预留存储单元指令
操作码助记符:DS
格式:DS 保留单元数目
功能:该指令用于定义在存储器中留出一定数目的存储单元。
举例:ORG 30H
DS 08H
DB 23H,E8H
第1行指令的功能是指示它的下一条指令的起始地址为30H;第2行指令的功能是从30H地址开始,留出30H~37H的8个存储单元;第3行指令的功能是让38H、39H单元中的数据分别为23H、E8H。

4.4.5 等值指令(Equate)

等值指令
操作码助记符:EQU
格式:字符 EQU数值
功能:该指令用于将EQU左边的字符代表右边的数值,使程序更易
读懂。
举例:SG EQU R5
DE EQU 36H
MOV A,SG
MOV A,DE
第1行指令的功能是用字符SG代表寄存器R5,第2行指令的功能是用字符DE代表数据36H,第3行指令的功能是将寄存器R5(由字符SG代表)中的数据送给累加器A,第4行指令的功能是将数据36H(由字符DE代表)送给累加器A。

4.4.6 数据地址赋值指令

数据地址赋值指令
操作码助记符:DATA
格式:字符 DATA数值
功能:该指令用于将DATA左边的字符代表右边的数值,它与EQU类似,但EQU必须先定义后使用,而DATA没有这个限制,DATA常用作定义数据地址。
举例:MAIN DATA 2000H
该行指令是用字符MAIN代表地址2000H。

4.4.7 位地址符号赋值指令

位地址符号赋值指令
操作码助记符:BIT
格式:字符 BIT位
功能:该指令用于将BIT左边的字符代表右边的位地址。
举例:BUSY BIT P1.1
G5 BIT 02H
第1行指令的功能是用字符BUSY代表位址P1.1,第2行指令的功能是用字符G5代表位地址02H。

4.4.8 汇编结束指令

汇编结束指令
操作码助记符:END
格式:END
功能:该指令用于结束汇编程序。在汇编时,该指令通知汇编程序结束汇编。一个源程序只能有一个END指令,并写在整个程序的最后,如果END后面还有程序段,汇编程序将不会对该程序汇编,即写在END后面的程序是无效的。

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinaryStarXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值