打印

探讨一条指令

[复制链接]
5168|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天雨粟|  楼主 | 2008-8-30 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
探讨一条指令

比较转移指令CJNE A,#data , rel,在实际过程中一般是这样使用:
CJNE     A,#data,CMP
CMP:JC rel
实际上变成了根据进位位C来进行程序跳转,这里进位位C是跳转的关键依据,对C的值带来影响的无非是这三种情况:A>data , A=data , A<date ,关于大于或小于这两种情况下C取何值一般的书都有详细介绍,至于等于,则一般不作介绍,那么等于不重要吗?否,如果被比较的两个数相等时C的值是随机的,则实际过程中如出现相等岂不是程序要乱跳?
只有一本书对等于的情况做了介绍:等于时C的值不变。
用这个说法去套一些程序,不能通解。
那么相等时C到底如何取值,我们可以在Keil中做一个实验,实验程序如下:
         ORG    0000H
    SJMP    START
    ORG    0030H
START:    MOV A,  #10
    SETB     C
    CJNE    A,#8,CMP    
CMP:    MOV   00H,C
    NOP
    NOP
    SETB C
    CJNE A,#10,CMP1
CMP1:    MOV 08H,C
    NOP
    NOP
    SETB C
    CJNE A,#12,CMP2
CMP2:    MOV 10H,C
    NOP
    NOP

    CLR    C
    CJNE    A,#1,CMP3    
CMP3:    MOV    18H,C
    NOP
    NOP
    CLR C
    CJNE A,#10,CMP4
CMP4:    MOV  20H,C
    NOP
    NOP
    CLR C
    CJNE A,#12,CMP5
CMP5:    MOV 28H,C
    NOP
    NOP

    SJMP    $
    END             
在C分别取0和1时,就A>data , A=data , A<data三种情况分别讨论,实验结果表明,不管C先前等于什么,在两个被比较数相等时,执行指令后,C的值都是0。如果这样,再去看其它程序,也可以解得通,那么我的结论是正确的吗?请教各位老师!

相关帖子

沙发
lyjian| | 2008-8-30 14:46 | 只看该作者

晕菜

CJNE A,#data , rel
...
这条指令是比较A和data,不相等就转移到rel处,相等的话就不转移按顺序执行下面的指令了,怎么会出现相等时乱跳
都不知道你是怎么理解的

使用特权

评论回复
板凳
lyjian| | 2008-8-30 15:09 | 只看该作者

搂主写的软件都是错误的

    ORG    0000H
    SJMP    START
    ORG    0030H
START:    MOV A,  #10
    SETB     C
    CJNE    A,#8,CMP
---〉相等的话会执行到这里,这里应该放相等时要执行的指令  
CMP:    MOV   00H,C
    NOP
    NOP
    SETB C
    CJNE A,#10,CMP1
---〉同样的问题  
CMP1:    MOV 08H,C
    NOP
    NOP
    SETB C
    CJNE A,#12,CMP2
---〉同样的问题  
CMP2:    MOV 10H,C
    NOP
    NOP

    CLR    C
    CJNE    A,#1,CMP3
---〉同样的问题   
CMP3:    MOV    18H,C
    NOP
    NOP
    CLR C
    CJNE A,#10,CMP4
---〉同样的问题  
CMP4:    MOV  20H,C
    NOP
    NOP
    CLR C
    CJNE A,#12,CMP5
---〉同样的问题  
CMP5:    MOV 28H,C
    NOP
    NOP

    SJMP    $
********************************************
真服了楼主
一个本来很简单的指令,你竟然能把它分析的这么复杂

使用特权

评论回复
地板
dengm| | 2008-8-30 15:16 | 只看该作者

cjne A, #data, rel 等于:

cjne A, #data, rel 等于:
    PUSH ACC
    CLR C
    SUBB A, #data
    JNZ  rel1
      pop acc



REL1:
      POP ACC
rel:

rel2:

使用特权

评论回复
5
tangli0604| | 2008-8-30 15:18 | 只看该作者

你没理解这杀指令

使用特权

评论回复
6
lyjian| | 2008-8-30 15:35 | 只看该作者

5楼是什么意思?

要画蛇添足吗?
执行完指令“cjne A, #data, rel”后本来就知道是否相等了,何必还要整一堆指令来判断A和data是否相等?

使用特权

评论回复
7
天雨粟|  楼主 | 2008-8-30 15:46 | 只看该作者

感谢各位朋友!

2楼请看:
CJNE A,#data,CMP
CMP:JC rel
通常用法,例子太多了,不管是否相等都要转到判C跳转,可见C值的重要!

回3楼:再联系!

4楼请看:
CJNE A,#PARA1,CW_8
CW_8:JC CW_9
见《单片机应用系统开发实例详解》杜树春老师著,第61页。

回5楼:您的程序验证了我在Keil中的试验结果,即被比较数相等,不产生借位,C=0,不管C先前取何值。我们可以正式更改有关书中说的相等C不变的说法了。感谢!收藏!

使用特权

评论回复
8
lyjian| | 2008-8-30 16:37 | 只看该作者

搂主都没理解这条指令的意义

CJNE A,#data,CMP
CMP:JC rel
*********************
如果只是判断大小不需要判断相等的话可以这样写
如果要判断相等的话正确的写法是:
    CJNE A,#data,NOT_EQ
EQUAL:
    ...                   ;IF A = data.
NOT_EQ:
    JC LOW_THAN          
HIGH_THAN:
    ...                   ;IF A > data.
LOW_THAN:
    ...                   ;IF A < data.
*********************
搂主不要尽相信书上的例子,写书的人自己会不会单片机都难说
谁知道谁抄谁的
搂主该理解的是这条指令的意思而不是别人的例子

使用特权

评论回复
9
天雨粟|  楼主 | 2008-8-30 21:09 | 只看该作者

9楼的老师

先感谢您的解答.
也许我没有讲清楚,关于这条指令,如果按您给的例子来用,理论上很清楚,没有问题.但大量的实例并没有按这个来用,而是不管是否相等,都是顺着执行下一条,这样的工程例子非止一二,项目也各不相同,互相抄袭的可能性不大,再者,我引用的杜树春老师书上的例子,也并非是杜老师写的,而是液晶生产厂家给的驱动程序,这个应该是经得起检验的.
但那样用的前提是必须清楚三种情况下指令执行后C的值,一般的书不讲相等这种情况,有一本讲了,却与工程实例有出入,所以我认为应探讨一下.
根据实验及探讨结果,我认为可以得出如下结论:
1,不论是否相等都可以顺着执行下一条,当然也可以分大于、小于、等于三种情况分别执行.
2,第一操作数小于第二操作数,高位产生借位,C=1;
3,第一操作数大于等于第二操作数,不产生借位,C=0;
4,指令执行后C的值与指令执行前的C的值无关.
5,某些书上讲的相等时C的值不变的说法是不对的,不可尽信,呵呵!

以上结论不知是否成立,还望各位老师给予答复!

使用特权

评论回复
10
5880527| | 2008-8-30 21:30 | 只看该作者

比较赞赏楼主的钻研精神

 

使用特权

评论回复
11
lyjian| | 2008-8-30 21:50 | 只看该作者

楼主看来还是不理解这条指令

你所说的这些结论不需要经过任何实验及探讨都是可以知道的,只要你仔细看看这条指令的说明,而不是看什么例子。
英文版的指令描述:
CJNE <dest-byte>,<src-byte>, rel
Function: Compare and Jump if Not Equal.
Description: CJNE compares the magnitudes of the first two operands and branches if their values are not equal. The branch destination is computed by adding the signed relative-displacement in the last instruction byte to the PC, after incrementing the PC to the start of the next instruction. The carry flag is set if the unsigned integer value of <dest-byte> is less than the unsigned integer value of <src-byte> otherwise, the carry is cleared. Neither operand is affected.
***********************************************
功能:比较,如果不相等就转移
对标志位C的影响:如果dest-byte<src-byte,C置位,否则C清零。
(我想其他51的书讲这条指令的时候都会说到这点的)
C标志位会怎么样变化,指令说明都已说得很清楚了,还需要你花时间去探讨吗?
***********************************************
1,不论是否相等都可以顺着执行下一条,当然也可以分大于、小于、等于三种情况分别执行.
***********************************************
至于你的这条所谓结论,这是废话,只有你不知道而已。谁都知道:只要你把转移地址放在这条指令后面,不管等不等它都顺着执行下一条指令了。

使用特权

评论回复
12
芯行天下| | 2008-8-30 22:18 | 只看该作者

这条指令初学者还是会遇到一些问题的

CJNE A,#data , rel

关于51的类似的指令还真是有的研究的,当初学51时也注意过这样的细节,当时看的是北航的初级教程,最后还专门研究了一下关于51的所有比较的指令,都是关于C的。

其实实条指令就是相等继续,不等转移,你要注意,有好几条指令都和这相关。

我已不用51好多年,所以也记不大清了。

使用特权

评论回复
13
bg6nw| | 2008-8-30 22:37 | 只看该作者

这条指令想必大家都很清楚

楼主关心的却是c的变化。
其实搭个电路可以很简单的验证一下:用个51片子随意找6个io接上6个发光二极管,写一段程序把【预置c为0或1】和【大于等于小于】一共六种组合,运行完通过6个发光管显示出来,不就结了。

使用特权

评论回复
14
lyjian| | 2008-8-30 22:46 | 只看该作者

对于C的变化,指令描述中又不是没说

看指令描述不就结了。
如果实在看不明白那只有自己做测试了。

使用特权

评论回复
15
bg6nw| | 2008-8-30 22:55 | 只看该作者

在Keil里面调试一下即可看出结果

org 0000h

cmp1:
mov a, #10
clr c
cjne a, #9, cmp2

cmp2:
mov p1.1, c
setb c
cjne a, #9, cmp3

cmp3:
mov p1.2, c
clr c
cjne a, #10, cmp4

cmp4:
mov p1.3, c
setb c
cjne a, #10, cmp5

cmp5:
mov p1.4, c
clr c
cjne a, #11, cmp6

cmp6:
mov p1.5, c
setb c
cjne a, #11, cmp7

cmp7:
mov p1.6, c

sjmp $

end

使用特权

评论回复
16
xwj| | 2008-8-30 23:12 | 只看该作者

唉,谁说没有说明的?

我看到的任何讲51指令的书、资料、**,只要解释了CJNE的影响的,都会说明等于时C的影响:
 大于 或者 等于时 C=0; 小于时C=1;

实际上C就是A-x的借位标志,不够减时C=1,够减时C=0;
而不是“只有一本书对等于的情况做了介绍:等于时C的值不变。”
--上面引号中的说法> 是错误的!!!
真不知LZ你是在哪里看到的???


1、CJNE A,dircet,rel

     指令名称:数值比较转移指令

     指令代码:B5H

     指令功能:累加器内容与内部RAM低128字节或专用寄存器内容比较,不等则转移。

     操作内容:若(A)=(direct),则PC←(PC)+3,C←0

     若(A)>(direct),则PC←(PC)+3+rel,C←0

     若(A)<(direct),则PC←(PC)+3+rel,C←1

     字节数: 3

     机器周期:2

使用特权

评论回复
17
lyjian| | 2008-8-30 23:37 | 只看该作者

我也叹一口气

哎!
真不知道有些人是怎么看资料的!

使用特权

评论回复
18
NE5532| | 2008-8-31 11:22 | 只看该作者

歪评

“关于大于或小于这两种情况下C取何值一般的书都有详细介绍,至于等于,则一般不作介绍,那么等于不重要吗?否,如果被比较的两个数相等时C的值是随机的,则实际过程中如出现相等岂不是程序要乱跳?只有一本书对等于的情况做了介绍:等于时C的值不变。”

一个搞汇编的人,应该清楚地知道指令是如何影响寄存器标志位的。如果不能,只能说明这个人是搞C语言搞惯了,却要来摆弄两句汇编。

使用特权

评论回复
19
5880527| | 2008-8-31 11:42 | 只看该作者

下面这张摆渡到的图比较容易懂的

使用特权

评论回复
20
Ventter| | 2008-8-31 12:19 | 只看该作者

俺几乎不怎么注意标志位变化,如果用不上的话……

所以,学过很久才发现inc不影响c……

使用特权

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

本版积分规则

16

主题

168

帖子

0

粉丝