汇编仿真 — 比较大小

该文详细解释了一段用80C51单片机汇编语言编写的程序,用于比较片内RAM的30H和40H单元中的无符号数,并根据比较结果存储大数和小数。程序利用CJNE指令进行条件跳转,影响C标志位,并通过相对寻址确定跳转目标地址。当数值相等时,7FH位单元被置1。此外,文章还介绍了如何计算汇编指令的相对地址和执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目文件

文件

关于项目的内容知识点可以见专栏单片机原理及应用 的第三章 汇编

 


题目:编程实现如下功能:比较片内 RAM的30H和40H单元中两个无符号数的大小,并将大数存入50H,小数存入51H,若两数相等,则使位单元7FH置1。

思路:指令CJNE可以比较双方关系进行跳转,同时还影响C标志位

编译程序如下:

MOV A,30H
CJNE A,40H,NOEQU ;30H不等于40H里面的值,转NOEQU
SETB 7FH  ;相等则使7F位置1
SJMP FINISH ;跳转到FINISH结束

NOEQU: JC SMALL ;30H<40H 转SMALL
       MOV 50H,A;30H>40H 存
       MOV 51H,40H
       SJMP FINISH
       
SMALL: MOV 50H,40H ;30H<40H 存
       MOV 51H,A

FINISH: SJMP FINISH      

如图:地址

在这里插入图片描述

这里说下SJMP FINISH

这条指令的工作原理为:

  • 根据机器码800EH,由PC当前值0009H和指令中含有的偏移量OEH(由汇编系统根据行号FINISH算出的rel值)得到PC修正后的目标地址0017H(=0009H+OEH),从而引导程序转向FINISH语句行。这种利用偏移量rel修正转移目标地址的做法称为相对寻址

  • OEH = 相对地址 - 当前指令地址 - 指令长度

在这个代码段中,相对地址0013H是指标签NOEQU的地址。当程序执行CJNE A,40H,NOEQU指令时,如果A不等于40H,则会跳转到标签NOEQU处继续执行。因此,在编写汇编代码时,程序员必须使用标签的相对地址来告诉计算机如何计算下一条指令的地址。
在这个代码段中,NOEQU标签前面有三条指令(MOV 50H,A、MOV 51H,40H和SJMP FINISH),它们的总长度为3个字节。因此,NOEQU标签的地址应该是当前指令地址加上3个字节的长度,即0009H+3=000CH。由于标签的地址是相对地址,因此需要将其转换为相对于当前指令的相对地址。因此,相对地址0013H是从000AH开始计算的,因为CJNE指令的地址是0009H,并且它占用了1个字节。
因此,NOEQU标签的相对地址可以计算如下:
NOEQU标签的地址 = 当前指令地址 + 3个字节的长度 = 0009H + 3 = 000CH
NOEQU标签的相对地址 = NOEQU标签的地址 - CJNE指令的地址 - CJNE指令的长度 = 000CH - 0009H - 1 = 0013H
因此,偏移量OEH是14(十进制),它表示如果CJNE指令转移到NOEQU标签,则程序将从NOEQU标签后的第14个字节开始执行SETB 7FH指令。最终得出下一条指令的地址为0017H(0009H+0EH),这就是修正后的目标地址。

也就是这样:如上面代码

在这里插入图片描述
就是这样求下一条指令的地址 地址+OEH偏移地址

 

仿真模拟:80C51,hex文件可以用keil生成

在这里插入图片描述

在这里插入图片描述

打开源代码和调试窗口

在这里插入图片描述
点击调试— 开始仿真

在这里插入图片描述
这里首先定义的是 30H > 40H

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值