51单片机汇编语言:利用 RET 指令实现多路分支

发布者:HeavenlySunset最新更新时间:2022-07-25 来源: csdn关键字:51单片机  汇编语言  RET  指令 手机看文章 扫描二维码
随时随地手机看文章

有这样一个问题:

-----------------------------

已知程序执行前有 A = 02H,SP = 52H,(51H) = FFH,(52H) = FFH。


执行下列程序:


    POP   DPH


    POP   DPL


    MOV   DPTR, #4000H  


    RL    A


    MOV   B, A


    MOVC  A, @A + DPTR


    PUSH  A


    MOV   A, B


    INC   A


    MOVC  A, @A + DPTR


    PUSH  A


    RET


    ORG   4000H


    DB    10H, 80H, 30H, 50H, 30H, 50H


求程序执行后:


A=(  )H、SP=(  )H、(51H) =(  )H、(52H)=(  )H、PC=(    )H。

------------------------------

这个问题,在百度知道出现过很多次,搜一下,就会出来几十个链接。


但是回答正确的,确实不多。


有的提问者,好像是说,这是什么学校教材上的习题。


在这个程序中,写错了两条指令:


非法指令:PUSH  A


应该写成:PUSH  ACC


做为教材来说,这可是一个 BUG 啊,呵呵


这个程序,是利用 RET 指令来进行多路分支。


程序中,有两条查表指令:MOVC  A, @A + DPTR,


当 A = 0 时,将从 4000H 处,先后读出 10H、80H;


当 A = 1 时,将从 4000H 处,先后读出 30H、50H;


当 A = 2 时,将从 4000H 处,先后读出 30H、50H。


本题目的条件已经给出:A = 02H,那么就是读出了 30H、50H。


读出数据后,先后压栈,再执行 RET。


RET 指令,就是把堆栈中的两个字节,送到 PC。


那么,PC = 5030H,就是这么来的。


全部的空格,填写如下:


A=(50)H、SP=(50)H、(51H) =(30)H、(52H)=(50)H、PC=(5030)H。

------------------------------

本程序,是个子程序结构,应该用 CALL 指令来调用。


在本程序开始处,用 POP 指令,抛弃了 CALL 自动保存的返回地址。


腾出了两个字节的堆栈空间,又压入两字节数据,然后,再返回。


RET 返回指令,就会用刚刚压入两字节数据,当做返回地址。


本程序,是属于偷梁换柱,还是移花接木 ?

------------------------------

下面逐条解释一下:


    POP   DPH


    POP   DPL           ;弹出两次,SP = SP - 2 = 50H


    MOV   DPTR, #4000H  


    RL    A             ;乘以2


    MOV   B, A          ;B = 04H


    MOVC  A, @A + DPTR  ;取出第4个字节30H


    PUSH  ACC           ;SP = SP + 1 = 51H, (51H)=30H


    MOV   A, B


    INC   A             ;A = 05H


    MOVC  A, @A + DPTR  ;取出第5个字节50H


    PUSH  ACC           ;SP = SP + 1 = 52H, (52H)=50H


    RET                 ;子程序返回指令


执行 RET 指令时,是从堆栈中弹出两个字节到 PC 的高、低八位。


即:


(SP) → PCH,然后 SP - 1 → SP;


(SP) → PCL,然后 SP - 1 → SP。


即:


(52H) = 50H → PCH,SP = 51H


(51H) = 30H → PCL,SP = 50H


那么,PC = 5030H,就是这么来的。


------------------------------


进行多路分支,还有简单一点的方法。


如,利用指令:JMP  @A + DPTR,就可以。


那么,前面的程序,可以改为:


    MOV   DPTR, #4000H  


    RL    A


    MOV   B, A


    MOVC  A, @A + DPTR 


    XCH   A, B


    INC   A


    MOVC  A, @A + DPTR ;先后读出两字节


    MOV   DPH, A       ;把读出数据送到 DPTR


    MOV   DPL, B


    CLR   A            ;A=0


    JMP   @A + DPTR    ;以 DPTR 内容为目的地,转移


    ORG   4000H


    DB    10H, 80H, 30H, 50H, 30H, 50H


程序这样写,就不涉及堆栈了,也就没有前一个程序那么复杂的推导。


理解起来,可以轻松些。


这个程序,没有使用 RET 指令,那么,就不要用 CALL 来调用了。


要用 JMP 指令来应用本程序。


关键字:51单片机  汇编语言  RET  指令 引用地址:51单片机汇编语言:利用 RET 指令实现多路分支

上一篇:51单片机,点亮LED灯和闪烁
下一篇:51单片机 汇编语言电子琴

推荐阅读最新更新时间:2024-11-17 08:09

基于51单片机漩涡流水点阵的设计
#include typedefunsignedcharuchar; typedefunsignedintuint; typedefunsignedlongulong; sbitADDR0=P1^0; sbitADDR1=P1^1; sbitADDR2=P1^2; sbitADDR3=P1^3; sbi tE NLED=P1^4; ucharimage ={ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }; ucharT0RH,T0RL; uintrate; voidLEDScan(); voidresetImage(); voidconfigTmr0(uintms1,ucharms2);
[单片机]
基于<font color='red'>51单片机</font>漩涡流水点阵的设计
基于51单片机的温度+烟雾报警系统设计
一.硬件方案 本设计采用51单片机为核心控制器,利用气体传感器MQ-2、ADC0832模数转换器、DS18B20温度传感器等实现基本功能。通过这些传感器和芯片,当环境中可燃气体浓度或温度等发生变化时系统会发出相应的灯光报警信号和声音报警信号,以此来实现火灾报警,智能化提示。 主要由51单片机+最小系统+LCD1602液晶显示模块+MQ-2烟雾模块+ADC0832模块+DS18B20温度模块+蜂鸣器模块+LED指示灯模块+继电器驱动模块+风扇模块+按键模块;如图: 二.设计功能 (1)LCD1602液晶显示屏实时显示当前的烟雾值和温度值。 (2)温度和烟雾的报警值可以通过按键设定。 (3)当前温度值超过上限时,红灯亮,蜂鸣器
[单片机]
基于<font color='red'>51单片机</font>的温度+烟雾报警系统设计
基于STC89C51单片机的GPS智能塔钟控制系统的研究
本文研究的GPS自动校时塔钟控制系统是以STC89C51单片机为控制器,由GPS接收器、伺服电机、LED显示、语音报时等部分组成,具有自动校时、显示、报时等功能。通过GPS15XL-W接收芯片捕捉来自卫星的准确时间信息,以此为时钟源。利用单片机对接收到的时间信息进行提取和处理,并完成对单片机走时的校正。系统由单片机走时构成母钟,单片机向伺服电机发送脉冲驱动子钟走时。其优点是实现上电后的自动校时,改变了传统校时的不便,减少了机械误差,塔钟精度可达±1μs,没有累计误差。 随着经济社会的不断发展,人们生活的节奏逐步加快,人们对时间的精确度要求越来越高,尽管城市建筑物上的塔钟也越来越多,但大部分都是以传统塔钟为基础的传动、人
[单片机]
基于STC89C<font color='red'>51单片机</font>的GPS智能塔钟控制系统的研究
AT89S51单片机串行口的结构
AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据。发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一个特殊功能寄存器字节地址(99H)。      串行口的控制寄存器共有两个:特殊功能寄存器SCON和PCON。下面介绍这两个特殊功能寄存器各位的功能。      1、串行口控制寄存器SCON      串行口控制寄存器SCON,字节地址988H,可位寻址,位地址为98H~9FH。SCON的格式如下图所示。      下面介绍SCON中各位的功能。      (1) SM0、SMl:串行口4种工作方式选择位。      
[单片机]
AT89S<font color='red'>51单片机</font>串行口的结构
基于51单片机和可编程逻辑器件实现LED显示屏
LED显示屏主要由电流驱动电路及LED点阵阵列、控制系统和PC端管理软件三部分构成(图1)。控制系统负责接收、转换和处理各种外部信号,并实现扫描控制,然后驱动LED点阵显示需要的文字或图案。控制系统作为LED显示屏的核心部分,直接决定了显示屏的显示效果和性能的优劣。本文详细分析采用Verilog HDL对ATF1508AS进行编程,实现双口RAM访问和产生LED点阵驱动电路所需的各种时序信号。 1 LED显示屏的基本结构及关键技术 本系统设计中,控制系统采用单片机+CPLD的方案来实现,整个控制系统可分为:信号接收及处理模块和CPLD的扫描控制模块和LED点阵驱动模块,如图1 所示。本系统的关键技术是使用双口RAM和C
[单片机]
基于<font color='red'>51单片机</font>和可编程逻辑器件实现LED显示屏
51单片机存储器结构介绍(1)
MCS-51单片机在物理结构上有四个存储空间: 1、片内程序存储器 2、片外程序存储器 3、片内数据存储器 4、片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1、片内外统一编址的64K的程序存储器地址空间(MOVC) 2、256B的片内数据存储器的地址空间(MOV) 3、以及64K片外数据存储器的地址空间(MOVX) 在访问三个不同的逻辑空间时,应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解),以产生不同的存储器空间的选通信号。 程序内存ROM 寻址范围:0000H ~ FFFFH 容量64KB E
[单片机]
<font color='red'>51单片机</font>存储器结构介绍(1)
基于普通51单片机的LIN协议实现方案
1 概述 LIN协议是新出现的一种新型低成本串行通信总线,其全称是Local Interconnect Network,即局部互联网络。它最开始出现于汽车行业,是为解决汽车智能化和网络化的发展要求和降低汽车制造成本的矛盾而提出来的一种串行总线协议,主要用于车门、车灯等需要简单控制但又要求智能控制的场合。它的主要特点是:采用单个主控制器/多从设备通信模式;基于普通UART/SCI接口硬件实现,协议简单;网络传输速率不高,最高可达20kb/s。由于LIN协议的突出特点是协议对硬件的依赖程度低,可以基于普通单片机的通用串口等硬件资源以软件方式实现,成本低廉,因此可广泛应用于汽车行业以外的其他领域,如智能家庭网络内部的数据传输、节点控
[单片机]
基于普通<font color='red'>51单片机</font>的LIN协议实现方案
ARM平台下独占访问指令LDREX和STREX
为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁。为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持。 本文主要用来说明ARM平台上特有的独占访问指令LDREX和STREX的工作原理,以及如何使用。而它们也是ARM平台上,实现互斥锁等线程同步工具的基础。 我们先来看看LDREX和STREX两条指令的语义。其实LDREX和STREX指令,是将单纯的更新内存的原子操作分成了两个独立的步骤。 1)LDREX用来读取内存中的值,并标记对该段内存的独占访问: LDREX Rx, 上面的指令意味着,读取寄存器Ry指向的4字节内存值,将其保存到Rx寄存器中,同时标记对Ry指向内存区域的独
[单片机]
ARM平台下独占访问<font color='red'>指令</font>LDREX和STREX
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved