打印

51中 JNB bit,rel指令怎么执行的问题?

[复制链接]
8238|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hengshao|  楼主 | 2011-11-12 15:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
JNB bit,rel
如果bit这位是0,那么PC+rel--PC,这是书上的说法
但是,我用反汇编好像是直接rel赋给PC的,哪个对呢?
       K1  BIT  P0.0          ;LED 灯
        K2  BIT  P0.1
        K3  BIT  P0.2
        K4  BIT  P0.3
        K5  BIT  P0.4         ;喇叭开关
        K6  BIT  P0.5    ;继电器      
;*********************************************************
        ORG  0000H
        JMP  MAIN
        ORG  0030H        
;*********************************************************
MAIN:
        MOV  SP,#60H
               
LOOP:
        JNB  K1,K1_Prog
        JNB  K2,K2_Prog
        JNB  K3,K3_Prog
        JNB  K4,K4_Prog
        MOV  P2,#0FFH       ;关闭所有LED
        JNB  K5,K5_Prog
        SETB P1.5                        ;关闭风铃器
     JNB  K6,K6_Prog
       SETB P1.4                         ;关闭继电器

      JMP  LOOP

K1_Prog:
        MOV  P2,#0FEH       ;D00灯亮
        JMP  LOOP
K2_Prog:
        MOV  P2,#0FDH       ;D01灯亮
        JMP  LOOP
K3_Prog:
        MOV  P2,#0FBH       ;D02灯亮
        JMP  LOOP
K4_Prog:
        MOV  P2,#0F7H       ;D03灯亮
        JMP  LOOP

K5_Prog:CLR  P1.5           ;喇叭
        JMP  LOOP

K6_Prog:CLR  P1.4           ;继电器
        JMP  LOOP

;*********************************************************
        END

相关帖子

沙发
chen3bing| | 2011-11-12 15:40 | 只看该作者
要相信自己呀!不过你这不像反汇编吗。看着像是自己写的汇编。

使用特权

评论回复
板凳
ningling_21| | 2011-11-12 17:20 | 只看该作者
直接rel赋给PC的

程序好像是LZ写的...

使用特权

评论回复
地板
hengshao|  楼主 | 2011-11-12 22:39 | 只看该作者
这是自己写的程序,我说的反汇编只是软件那里那个 2# chen3bing

使用特权

评论回复
5
hengshao|  楼主 | 2011-11-12 22:44 | 只看该作者
那应该是书上的错了吧,那请问有没有在哪里可以查到比较权威的某款单片机的指令系统的?比如数据手册什么的?, 3# ningling_21

使用特权

评论回复
6
hotpower| | 2011-11-12 23:46 | 只看该作者
7
fu10| | 2011-11-12 23:50 | 只看该作者
本帖最后由 fu10 于 2011-11-12 23:52 编辑

rel是不能直接赋给PC的,rel只是个偏移量最大是正负128个字节,应该是下一个PC=当前PC+rel,书是说得没错的.

使用特权

评论回复
8
yirongfu| | 2011-11-13 00:20 | 只看该作者
你看的这本书的说法似乎不准确!!!

对于传统的MCS-51而言,JNB这个位控制转移指令是三字节指令,其跳转应该是这样的:
JNB  bit, rel      ;若(bit)=0,则(PC)<--(PC)+3+rel                       
                       ;若(bit)=1,则(PC)<--(PC)+3

千万注意跳转偏移量的基准地址!!!

以下资料供参考:

使用特权

评论回复
9
hengshao|  楼主 | 2011-11-13 14:45 | 只看该作者
我看了其它资料,你说的是对的,请问你那个供参考的资料是啥来的?[ 8# yirongfu

使用特权

评论回复
10
hengshao|  楼主 | 2011-11-13 14:50 | 只看该作者
8# yirongfu 应该是直接程序跳到LABEL2吧,就是说这个LABEL2不相当于rel咯?LABEL2这个标号不是相对偏移量了,而是直接是下一条要执行的指令的地址了

使用特权

评论回复
11
hengshao|  楼主 | 2011-11-13 14:51 | 只看该作者
我用的KEIL的软件反汇编那里是这意思的 8# yirongfu 我用的KEIL的软件反汇编那里是这意思的

使用特权

评论回复
12
yirongfu| | 2011-11-13 15:49 | 只看该作者
LABEL2就是偏移量rel,按照上面说的规则进行跳转,在小的程序中,对于很短距离的跳转,可能你感觉不到这个偏移量的作用或者说含义,容易造成是直接跳转到一个地址(LABEL2)的误解。这也是你的理解的问题所在。
如果你的跳转距离超过128字节,你就能体会到它的含义了,呵呵,因为编译器可能不会报错,顶多警示,老的编译器我是没见到报错的,而程序就跳到“莫名其妙”的一个地址去了。可是,那时候你去找问题,尤其是没有仿真器时,会很蛋疼的。
另外,那个贴图的资料详见此帖:https://bbs.21ic.com/icview-228688-1-1.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:貴在坚持,永不言弃

0

主题

98

帖子

1

粉丝