项目文件
文件
关于项目的内容知识点可以见专栏单片机原理及应用 的第三章 汇编
题目:编程实现如下功能:比较片内 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