布林指令集包含ANL和ORL运算但没有XRL(Exclusive OR)运算,但是XRL运算很容易地由软体模拟,例如:想要作两位元的互斥或C=bit1 XRL bit2可以用如下的软体加以达成:

MOV C,bit1

JNB bit2,OVER

CRL C

OVER:(继续)

其方法是首先是将bit1的状态载入进位旗号,如果bit2=0,则C的内容就是正确的结果,即bit2=0的话,bit1 XRL bit2=bit1,反过来说,如果bit2=1时,则C的值就是正确值的反相,因此只须将C的值反相(CPL C)就可得到正确的结果。

JNB指令是一系列的位元测试指令中一个。它们在被测试的位元为"1"时JC、JB及JBC执行跳跃,或是被测试的位元"0"时JNC、JNB执行跳跃。在上面的例子里,是测试bit2,如果bit=0时,则CPL C这个指令就被跳过。

JBC指令是在被测试位元为"1"时产生跳跃动作,且将此位元清除。因此旗号可以使用一个指令作测试和清除的动作。 PSW的所有位元都是可直接定址,因此这些位元也可以使用位元测试指令。

程序跳跃指令

指令说明周期

ACALL addr11绝对式子程序呼叫24

LCALL addr16远程子程序呼叫24

RET从子程序返回24

RETI从中断子程序返回24

AJMP addr11绝对式跳跃24

LJMP addr16远程跳跃24

SJMP rel短程跳跃24

JMP @A+DPTR间接跳跃24

JZ rel若A=0跳至rel24

JNZ rel若A不等于0跳至rel24

CJNE A,direct,rel若A不等于direct跳至rel24

CJNE A,#data,rel若A不等于data跳至rel24

CJNE Rn,#data,rel<> /> /> />>若Rn不等于data跳至rel24

CJNE @Ri,#data,rel若Ri不等于data跳至rel24

DJNZ Rn,relRn减1不等于0跳至rel24

DJNZ direct,reldirect减1不等于0跳至rel24

NOP没动作12

相对偏移值(Relative offset)

对于以上的条条件式跳跃指令的目的位址,可以使用标记(label)或用程序记忆体的实际位址以指定给组译器使用。然而组译出来的目的位址是一个相对偏移值的位元组,且是一个带符号(2补数)的偏移值,如果跳跃被执行的话,则这个位元组的值会以2补数的加法加入PC里。因此条件式跳跃的范围就从跳跃指令的下一个位址算起在- 128至+ 127之间。

跳跃指令:

在表中的" JMP addr"指令,实际上总共有三种------既SJMP、LJMP和AJMP------它们在目的位址的格式上有所不同,如果程序不管跳跃指令的解码方式的话,JMP这个指令可作一般指令使用。

SJMP这个指令将目的的位址编码成如上面所讨论的相对偏移位址,这个指令要使用2位元组长,既包括有操码(opcode)和偏移值(offset),此时跳跃的距离就限制在SJMP指令下一个指令位址的-128至+127之间。

LJMP指令是将目的的位址编码成16位元的常数。这个指令共占了3位元组,包括操作和两位元组的位址。如此LJMP就可跳至64K程序记忆体的任何一个位址。

AJMP指令将目的的位址编码成11位元的常数,这个指令共占2位元组,包括一个操作码,此操作码中的3个位元是11位址位元中的一部分,接下去的一个位元组就是位址的低阶八位元。当执行这个指令时,这11位元就取代了PC的低阶11位元,而PC的高阶5位元不变,因此目的位址必须在AJMP指令的下一个指令位址算起的2K区域内。

在任何情况下,写程序的人都是以标记(Label)或16位元常数去指定目的位址,组译器(Assembler)会转成正确的值给指令。如果跳跃的距离超过了指令所能达到的范围时,组译器会输出"Destinationout of rang"的讯息。

JMP @A+DPTR指令是一个间接跳跃指令。其跳跃的目的位址会在程序执行中计算16位元的DPTR和累加器的和,通常DPTR是指到一个跳跃表的位址,而累加器是表里的索引,例如:要作5条通路的跳跃时,可将整数0至4载入累加器,其程序如下面所列:

MOV  DPTR,#JUMP_TABLE

MOV  A,INDEX_NUMBER

RL   A

JMP  @A+DPTR

JUMP_TABLE:

AJMP  CASE_0

AJMP  CASE_1

AJMP  CASE_2

AJMP  CASE_3

AJMP  CASE_4

上面程序的RL A指令是将索引值(0~4)转换成0至8的偶数值范围,因为在跳跃表里的每个进入点是2位元长.

表里所列的"CALL addr"指令也包括有两种指令----LCALL和ACALL,它们只是位址格式不同。 CALL是使用在不在乎什么位址编码方式时。 LCALL指令使用16位址格式,此时副程序可以在64K程序记忆体李的任一位址。而ACALL指令是使用11位元的格式,因此副程序必须在ACALL的下一位址算起的2K区域范围。在任何一种情况下,写程序的人可以以相同的方法指定副程序的位址给组译器:既使用标记或16位元的常数。组译器会放入正确的格式给组译令。

副程序必须以RET指令作结束,它会反回CALL的下一个指令去执行。 RETI是在中断服务程序反回使用,RET和RETI之间仅有的不同点是RETI会告诉中断控制系统,中断事件以作完,如果在没中断的情况下执行了RETI指令时,则RETI与RET在功能上是相同的。

MCS-51的条件跳跃指令所有跳跃指令所跳到的目的位址都是以相对偏移的方法指定,因此跳跃的距离是从这个指令的下一位址算起的-128至+127之间。重要一点是,写程序时只要告诉组译器直接位址或标记(label)就可以了,与其他的跳跃指令一样,组译器会算出正确的偏移值。

在PSW里并没有零旗号位址,因此MCS-51使用JZ和JNZ指令去测试累加器的内容是否为零。

DJNZ指令(递减且不为零时跳跃)是用来作回路控制用,要执行N次的回圈时,可将N载入计数器,然后用DJNZ结束这个回圈,如下所示,若N =10:

MOV  COUNTER,10

LOOP:(循环开始)

DJNZ COUNTER,LOOP<> /> /> />>

CJNE指令(比较且不相等时跳跃)也可以使用在回圈控制上,在指令的运算元(operand)栏里共指定了两的位元组,只有在这两个位元组不相等时会产生跳跃。这个指令的另一功能是"大于、小于"的比较,在运算元里的两个位元组被看成无号数(Unsign)的整数,如果第一个位元组小于第二个,则进位旗号C=1,而如果第一个大于或等于第二个位元组则C=0。

jnz和djnz_8051的指令相关推荐

  1. jnz和djnz_单片机指令

    展开全部 单片机指令功能一览表 助e69da5e6ba903231313335323631343130323136353331333236373766记符 代码 说明 MOV A,Rn E8~EF 寄 ...

  2. 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...

    3.2.1 数据传送指令 1. MOVOPRD1,OPRD2 MOV是操作码,OPRD1和OPRD2分别是目的操作数和源操作数.该指令可把一个字节或一个字操作数从源地址传送到目的地址. 源操作数可以是 ...

  3. 字典(汇编指令 INT 21H)

    汇编指令 AAA 未组合的十进制加法调整指令 AAA(ASCII Adgust for Addition) 格式: AAA 功能: 对两个组合的十进制数相加运算(存在AL中)的结果进行调整,产生一个未 ...

  4. REVERSE-COMPETITION-GeekChallenge2021

    REVERSE-COMPETITION-GeekChallenge2021 Re0 刘壮桌面美化大师 买Activity Re1 调试 珍惜生命 new_language easypyc Brute_ ...

  5. REVERSE-PRACTICE-BUUCTF-10

    REVERSE-PRACTICE-BUUCTF-10 [GWCTF 2019]xxor [HDCTF2019]Maze [WUSTCTF2020]level2 [BJDCTF2020]BJD hamb ...

  6. X86汇编语言从实模式到保护模式07:硬盘和显卡的访问控制

    目录 1. 离开主引导扇区 1.1 主引导扇区的一般用途 1.2 改造主引导扇区 2. 给汇编程序分段 2.1 汇编程序分段概述 2.2 汇编程序分段指令 2.3 段的汇编地址 2.3.1 默认的段汇 ...

  7. 8086指令系统(8086基本知识点)

    目录 一.指令的寻址 1 操作数寻址 1.1 立即数寻址 1.2 寄存器寻址 1.3 直接寻址 1.4 寄存器间接寻址 1.5 寄存器相对寻址 1.6 隐含寄存器的操作数 2 指令地址寻址 二.808 ...

  8. hackme pwn onepunch

    做的题太少了,不知道应该把这种题目如何归类 int __cdecl main(int argc, const char **argv, const char **envp) {--v5 = __iso ...

  9. CPU的设计与实现(2)--逻辑电路设计

    在上一篇博文CPU的设计与实现(1)--方案设计中,较为详细地讲解了我将要设计实现的Gater8这个基于自制CPU的自制计算机的设计方案. 这是本系列第二篇博文,我将详细分析具体设计完成的Gater8 ...

最新文章

  1. 企业OKR实施失败一定要小心这三大杀手
  2. 201705-201706 任务书单
  3. 清华大学图神经网络综述:模型与应用
  4. vscode 中搭建Vue.js
  5. maven错误The JAVA_HOME environment variable is not defined correctly
  6. superset 图标调整
  7. linux 安装jdk gz文件,Linux 安装jdk gz 安装方式
  8. python中异常和错误是同一个概念吗_Python 错误与异常
  9. linux-文件路径
  10. python连续质数计算_GitHub - xxqfft/AlgorithmsByPython: 算法/数据结构/Python/剑指offer/机器学习/leetcode...
  11. 中期蒙混过关,后期要早点起步4.13-4.19
  12. java android rsa加密解密_Android中的RSA加密解密
  13. Unity3d 好友管理系统
  14. Error:(199) undefined reference to `__android_log_print'
  15. 【Pix4d精品教程】Pix4d模型成果导出OSGB并加载OSGB到EPS进行三维测图完美案例教程
  16. 京东登录页面html代码_利用Python爬取京东商品的一种办法
  17. sqlldr mysql_sqlldr数据导入
  18. 10月北京二手房交易量强势反弹 房价环比上涨5.2%
  19. 小白都能看得懂的java回调
  20. Java开发者,我到底要不要学大数据开发?

热门文章

  1. 技术人变现的9个路线
  2. 电大计算机科学与技术专业论文,国家开放大学计算机科学与技术专业毕业设计(论文)要求...
  3. 华为服务器如何设置网站dns,华为ensp服务器dns配置
  4. orcale报错 无效数字
  5. 印度理工学院有多难考?
  6. 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真
  7. html怎么绑定数据,06、如何在html中绑定数据
  8. 最好用的文字锁屏APP的使用教程
  9. CIO如何推广ERP系统
  10. [渝粤教育] 郑州工程技术学院 大学计算机基础 参考 资料