求高人解答单片机,谢谢谢谢

求高人解答单片机,谢谢谢谢,第1张

指令 SJMP rel 中的 rel,是补码,范围是-128~+127。
若 rel = F6H,其真值就是-10,或写成 -0AH。
当(PC)= 0100H,执行这条指令时,PC 已经是 0102H 了。
那么执行结果就是:PC = 0102H + (-0AH) = 00F8H。
----
楼主所说的 FFF6H,是编写题目的人诚心添乱。
本来单片机里面就是 F6H,他们人为的多写了两位 F,单片机里面,并没有这两位。

在51单片机SJMP rel 那PC地址等于PC+2+rel,这个rel是相对地址,可以正可负,范围在-127~128之间,当为负数时就向前转移了。比如:
SJMP $ rel=-2
PC=PC+2
PC<---PC+(-2)
所以是原地循环。

刚好也有这么个困惑,已经解决了,拿出来分享下
比较转移指令 CJNZ
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就次序执行(执行本
指令的下一条指令),如果不相等,就转移,同样地,我们能将rel理解成标号,即:CJNEA,
#data,标号。这样利用这条指令,我们就能判断两数是否相等,这在很多场合是非常有用的。
但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相等,则CPU还会反映出哪个数大,哪个数小,这是用CY(进位位)来实现的。如果前面的
数(A中的)大,则CY=0,不然CY=1,因此在程序转移后再次利用CY就可判断出A中的数
比data大还是小了。
例:
MOV A,R0
CJNE A,#10H,L1
MOV R1,#0FFH
AJMP L3
L1: JC L2
MOV R1,#0AAH
AJMP L3
L2: MOV R1,#0FFH
L3: SJMP L3
JC是判CY是0,还是1进行转移,如果CY=1,则转移到JC后面的标号处
执行,如果CY=0则次序执行(执行它的下面一条指令)。
分析一下上面的程序,如果(A)=10H,则次序执行,即R1=0。如果(A)不等于10H,则转
到L1处继续执行,在L1处,再次进行判断,如果(A)>10H,则CY=1,将次序执行,即执
行MOV R1,#0AAH指令,而如果(A)<10H,则将转移到L2处指行,即执行MOV R1,#0FFH
指令。因此最终结果是:本程序执行前,如果(R0)=10H,则(R1)=00H,如果(R0)>10H,
则(R1)=0AAH,如果(R0)<10H,则(R1)=0FFH。
弄懂了这条指令,其它的几条就类似了,第二条是把A当中的值和直接地址中的值比较,第
三条则是将直接地址中的值和立即数比较,第四条是将间址寻址得到的数和立即数比较,这
里就不详谈了,下面给出几个对应的例程。
CJNE A,10H ;把A中的值和10H中的值比较(注意和上题的区别)
CJNE 10H,#35H ;把10H中的值和35H中的值比较
CJNE @R0,#35H ;把R0中的值作为地址,从此地址中取数并和35H比较

sjmp是短转移指令,用相对地址,相对地址是有符号数,所以用的都是补码,89是一个负数,因为第一位是1,所以他如果变成双字节就要填FF,如果是正数才填00。。。。
补码你应该懂得把,负数的补码就是反码+1,实际这个语句是向前跳转,是一个减法,加上一个数的补码就是相当于执行了减法,89H不是原码他更不代表-89H。。。
所以向这样的语句你只要判断首位是不是比8大,如果大说明是负数加FF,向前跳转,反之向后跳转。。。
通常如果你想向前跳,想跳几个地址就把这个数化成2进制补码的形式变成16进制填上就没问题,不过实际当中这些事我们不需要做,编译器可以替我们干,我们只需要用标示,比如sjmp
D1,在要跳的位置填D1:
编译器会替我们算。。。
用于运算的数的分浮点数,有符号数,无符号数,只有无符号整型数的16进制才符合我们的常规思维,其他两种第一次见都会迷惑。。。

5AH本身就是个正数,后面的(正数)也只是个特别说明,不写,5AH也是正数。
转移目的地址还是 215CH
rel=0A6H 这才是个负数,最高位符号位为1 0A6H就是 负的5AH 负数用补码来存,取反加1
SJMP 是2000H
2013H-2000H = 13H
13H-02H=11H 再减去指令本身的占用的2个字节的地址。
相对地址是11H

以SJMP为原点,可以往前跳,正向跳转,往后跳,反向跳转。假设SJMP指令所在地址为0110H,因为要取出SJMP指令,是两个字节,那当前地址要加2,为0112H,反向跳转的目的地址是0110H,则跳转偏移量rel=0110H-0112H=-12H。rel为负数,但要用补码表示,为EFH。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12948593.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存