Advertisement

准确辨别LJMP、AJMP、SJMP和JMP指令的区别

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文章深入解析了MCS-51单片机中的四种跳转指令(LJMP、AJMP、SJMP及JMP)之间的区别与应用场合,帮助读者掌握其准确使用方法。 在单片机汇编语言中使用跳转指令需要注意一些特定的问题。MCS-51系列的控制转移类指令共有17条,可以分为无条件转移、条件转移、子程序调用与返回以及空操作等四种类别。其中,无条件转移包括LJMP(长跳转)、AJMP(绝对地址跳转)、SJMP(短距离相对跳转)和JMP(@A+DPTR)这四种指令。 1. **长转移指令 (LJMP)** 这条命令的功能是将目标地址addr16装入程序计数器PC,从而实现向该位置的无条件跳转。它不改变任何标志位,并且可以覆盖整个单片机内存(0000H—FFFFH),即支持在64KB范围内进行转移操作。LJMP指令为三字节双周期指令。 示例:LJMP F886H 2. **绝对地址跳转 (AJMP)** 这条命令是使用11位的addr11(a10—a0)作为目标地址,其格式由两部分组成,即操作码和一个指定的目标位置。该指令执行时首先会将PC加两次以获取下一条指令的位置,并随后结合当前高5位地址与指令中提供的低11位来确定最终的跳转目标位置。AJMP可以在2KB范围内向前或向后跳跃。 示例:MGH2001: AJMP addr11,其中,addr11为一个特定的目标地址。 3. **短距离相对跳转 (SJMP)** 这条指令用于执行程序计数器PC的加一操作两次,并将结果与rel(即目标位置相对于当前指令的位置差)相加形成新的目标地址。因此它是一个双字节,双周期的操作码格式为80H rel,其中80H表示SJMP指令本身;rel则指示从当前位置到跳转目的地的距离。 4. **变址寻址转移 (JMP @A+DPTR)** 这条命令使用当前累加器(A)的值与数据指针(DPTR)中的地址相加以确定目标位置,执行时会改变程序计数器PC的内容。这种类型的指令可以在256个存储单元内进行跳转。 总结来说,无条件转移指令包括LJMP、AJMP、SJMP和JMP(@A+DPTR),它们都通过修改程序计数器(PC)来实现控制流的改变。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • LJMPAJMPSJMPJMP
    优质
    本文章深入解析了MCS-51单片机中的四种跳转指令(LJMP、AJMP、SJMP及JMP)之间的区别与应用场合,帮助读者掌握其准确使用方法。 在单片机汇编语言中使用跳转指令需要注意一些特定的问题。MCS-51系列的控制转移类指令共有17条,可以分为无条件转移、条件转移、子程序调用与返回以及空操作等四种类别。其中,无条件转移包括LJMP(长跳转)、AJMP(绝对地址跳转)、SJMP(短距离相对跳转)和JMP(@A+DPTR)这四种指令。 1. **长转移指令 (LJMP)** 这条命令的功能是将目标地址addr16装入程序计数器PC,从而实现向该位置的无条件跳转。它不改变任何标志位,并且可以覆盖整个单片机内存(0000H—FFFFH),即支持在64KB范围内进行转移操作。LJMP指令为三字节双周期指令。 示例:LJMP F886H 2. **绝对地址跳转 (AJMP)** 这条命令是使用11位的addr11(a10—a0)作为目标地址,其格式由两部分组成,即操作码和一个指定的目标位置。该指令执行时首先会将PC加两次以获取下一条指令的位置,并随后结合当前高5位地址与指令中提供的低11位来确定最终的跳转目标位置。AJMP可以在2KB范围内向前或向后跳跃。 示例:MGH2001: AJMP addr11,其中,addr11为一个特定的目标地址。 3. **短距离相对跳转 (SJMP)** 这条指令用于执行程序计数器PC的加一操作两次,并将结果与rel(即目标位置相对于当前指令的位置差)相加形成新的目标地址。因此它是一个双字节,双周期的操作码格式为80H rel,其中80H表示SJMP指令本身;rel则指示从当前位置到跳转目的地的距离。 4. **变址寻址转移 (JMP @A+DPTR)** 这条命令使用当前累加器(A)的值与数据指针(DPTR)中的地址相加以确定目标位置,执行时会改变程序计数器PC的内容。这种类型的指令可以在256个存储单元内进行跳转。 总结来说,无条件转移指令包括LJMP、AJMP、SJMP和JMP(@A+DPTR),它们都通过修改程序计数器(PC)来实现控制流的改变。
  • C++中&与&&
    优质
    本文介绍了在C++编程语言中引用符&和右引用符&&的不同用途及其应用场景,帮助读者理解二者区别。 在C++编程语言中,“&”和“&&”是两个常用但容易混淆的运算符。“&”符号有三种用途,而“&&”有两种。 **& 的用途** 1. **位运算中的 “与”(AND)操作:** 位运算是非常高效的,常用于数据分片中。例如,在处理网络数据包头部、IP地址段以及UTF-8编码时会用到这种类型的运算。 2. **取地址功能**: 这种用途在C语言中的使用频率较高,比如获取变量或函数的内存地址。具体示例如下: ```cpp int b = 10; int *a = &b; // a指针指向b的存储位置 // 声明一个接受两个整数参数并返回整数值的函数: int add(int a, int b) { return a + b; } // 定义一个指向该类型函数的指针 int (*functionPtr)(int, int); ```
  • 教你dBm、dB、dBidBd
    优质
    本教程深入浅出地解析了无线通信中常见的四种单位——dBm、dB、dBi和dBd的概念及其应用区别,帮助读者快速掌握相关知识。 dB 是一个纯计数单位:对于功率而言,计算公式为 dB = 10 * lg(AB);而对于电压或电流,则是 dB = 20 * lg(AB)。实际上,dB 的意义非常简单,就是将一个很大的数值(后面跟着一长串零)或者很小的数值(前面有一长串零)简短地表示出来。 例如: - X=10,000,000,000,000 (共15个零) 10lgX = 150dB - X=0.000,000,01 10lgX = -156 dB 此外,dBm 定义为毫瓦(milliwatt),其中 0 dBm 等于 1 毫瓦;而 dBw 则定义为瓦特(watt),因此 0 dBw 是指 lg(1 W) 或者 lg(1,000 milliwatts),即等于30dBm。
  • B与BL在ARM中
    优质
    本文介绍了ARM架构中B(Branch)和BL(Branch with Link)指令的区别,深入解析了它们的工作原理及其应用场景。 B 指令用于跳转到指定的指令处执行。BL 指令用于跳转并保存子程序地址以便返回。接下来我们进一步探讨这两个指令的功能。
  • UID、FUIDCUID卡片方法
    优质
    本文介绍了UID、FUID和CUID三种卡片之间的区别,并提供了如何有效辨别的实用方法。帮助读者更好地理解和应用这些不同类型的卡片。 文档介绍了UID、FUID和CUID卡之间的差异与区分,并指出了它们各自的优点和缺点。
  • 如何PNPNPN:NPN与PNP方法
    优质
    本文详细介绍了PNP管与NPN管之间的区别,并提供了实用的方法来辨别这两种类型的晶体管。帮助读者理解其工作原理及应用场景。 判断是使用PNP还是NPN晶体管可以根据输入电平与输出电平的关系来决定: 1. 当输入为高电平时且需要输出低电平,则优先考虑使用NPN。 2. 若输入为低电平而期望的输出也为低电平,应选择PNP。 3. 输入是低电平但希望得到高电压作为输出时,应该选用NPN。 4. 如果输入是一个高电平并且预期同样需要一个高的输出,则优先考虑使用PNP。
  • ARM中MOVLDR是什么?
    优质
    本文探讨了在ARM汇编语言中MOV与LDR两条指令的功能差异。详解这两条指令如何操作寄存器及内存,并提供示例以便理解其区别。 在ARM指令集这一精简指令集计算机(RISC)的实现方式中,设计原则强调了简洁性和规则性的重要性。其中,mov和ldr是两种常用的指令,在功能与用途上有所不同。 首先来看mov指令。它主要用于寄存器之间的数据传递或向寄存器直接加载一个立即数。然而,在ARM架构下,mov不能直接从内存地址读取并存储到寄存器中。例如,若要将数值0x56赋值给r0寄存器,则可以使用以下指令: ``` mov r0, #0x56 ``` 这条命令会把立即数0x56放入r0寄存器内。 相比之下,ldr指令专门用于从内存加载数据到寄存器。当需要读取存储于特定地址的内存中的数据时,应使用ldr指令。例如: ``` ldr r0, [r1] ``` 这条命令会把位于由寄存器r1所指向的位置的数据装载至r0中。 此外,还可以通过绝对地址直接加载数据到寄存器: ``` ldr r0, =0x*** ``` 这行指令将指定的内存位置(如:0x***)中的内容读取并放入r0内。可以看出,ldr主要用于处理内存数据的操作,而mov则主要涉及寄存器内部的数据操作。 值得注意的是,在ARM架构中存在一种特殊的ldr伪指令。虽然它在功能上与标准的ldr有所不同,但当需要将一个32位立即数或地址写入寄存器时(特别是该数值位于-255到+255范围内),编译后的真实机器代码会被转化为mov指令。例如: ``` ldr r0, =0x*** ``` 如果这个值在允许由mov表示的范围之内,那么这条ldr伪指令将会被转换为一个对应的mov命令。 总的来说,在ARM架构中,不同用途和功能要求决定了选择使用mov还是ldr指令。理解这些区别对于进行相关编程工作至关重要,尤其是在系统底层开发或优化性能时尤为关键。
  • 键盘输入扫描枪输入
    优质
    本文详细介绍了键盘输入与扫描枪输入的不同之处,帮助读者了解两种数据录入方式的特点及应用场景。 区分键盘输入与扫描枪输入的差别在于提示是键盘输入还是扫描枪输入。原理在于两者的速度不同:键盘输入速度不同于扫描枪输入速度。
  • Linux中dfdu命
    优质
    本文探讨了在Linux系统中常用的磁盘空间管理命令df与du之间的区别,帮助用户更好地理解和使用这两个工具。 df命令用于显示文件系统的使用情况,相较于du命令而言更加全面地展示了整个系统的情况。通常使用的选项是df -T,这可以显示出各个分区的类型以及它们的空间使用详情。 例如: [root@localhost ~]# df -T Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup-lv_root ext4 18134344 780860 16432296 5% / tmpfs tmpfs
  • 鼠标点击与触摸
    优质
    本文介绍了如何区分鼠标点击和触摸操作的特点及应用场景,帮助读者更好地理解二者差异。 演示如何在鼠标响应事件中判断当前用户是通过鼠标点击还是通过触摸完成当前操作,以便最大程度地兼容传统Windows程序,并同时保证良好的触摸体验效果。