[求助]AT89S51/52上的怪事一庄
前2天用AT89S51/52做数字钟玩里面用到setb 10h和cjne a,22h,dxx两条指令
但是都不执行
改成setb 08h和cjne a,#22h,dxx
就可以执行
真是怪的很
大家以为是什么原因呢?
请指教 带#是立即数的意思,不带就是地址,位操作就要对应能进行位寻址的内存单元 dz20062008 发表于 2012-7-15 02:33 static/image/common/back.gif
带#是立即数的意思,不带就是地址,位操作就要对应能进行位寻址的内存单元 ...
按说那2条指令里边
带不带#号
都应该能够执行的呀 把程序全部发上来才好看 renwocai 发表于 2012-7-15 15:10 static/image/common/back.gif
把程序全部发上来才好看
程序有点长~~~~~~~~~~~~~~~~ 你说的不执行是没有跑那两条语句还是运行结果和你设想不一致? openepo 发表于 2012-7-15 15:32 static/image/common/back.gif
你说的不执行是没有跑那两条语句还是运行结果和你设想不一致?
是执行的结果和我设想的不一样 那我想 2 楼的 dz20062008 就说得挺清楚了。
加不加 # 号会直接影响寻址方式。自然运行的结果不一样了。 没带"#"就是错误的语句!
cjne a,#22h,dxx
标准语句是 CJNE A,立即数,要跳转的地址
如果没有" #",它就不当作立即数,A和谁比值呀,当然不能运行呀! 即便运行了,结果也不是自己希望的! and001 发表于 2012-7-16 14:37 static/image/common/back.gif
没带"#"就是错误的语句!
cjne a,#22h,dxx
标准语句是 CJNE A,立即数,要跳转的地址
这个说的就不准确了。
cjne 的用法有以下几种:
1, CJNE A,direct,rel
将 A 和直接寻址(地址为 direct)的数据进行比较,不等则跳转。
2,CJNE A,#data,rel
将 A 和立即数 data 进行比较。不等则跳转。
3,CJNE Rn,#data,rel
将 Rn 和立即数 data 进行比较,不等则跳转。
4,CJNE @Ri, #data,rel
将 Ri 指向的地址单元的数据和立即数 data 比较,不等则跳转。
5,CJNE A, @Ri,rel
将 A 和 Ri 指向的地址单元的数据比较,不等则跳转。
所以 LZ 的两种写法的指令从语法上没有问题,但是实际的执行结果就要看地址为 22h的内存单元的数据是不是 22h 了。 本帖最后由 and001 于 2012-7-16 15:35 编辑
对!楼上的很全面!51的指令是有些模糊了!比较少用汇编了! 我上面说的 cjne 的用法中,第五条好像是 Atmel 特有的用法。
5,CJNE A, @Ri,rel
将 A 和 Ri 指向的地址单元的数据比较,不等则跳转。
附上 Intel MCS 51 系列的汇编指令集和 Atmel C51 系列 ASM 用户手册作参考。 本帖最后由 lxa0 于 2012-7-16 22:28 编辑
openepo 发表于 2012-7-16 15:35 static/image/common/back.gif
我上面说的 cjne 的用法中,第五条好像是 Atmel 特有的用法。
5,CJNE A, @Ri,rel
首先谢谢你的解释和你所提供的资料
我在用cjne a,22h,dxx指令时
22h里放的是一个立即数
目的就是要a和22h里的数据做比较
不相等就跳转的
但是这条指令好像不能执行,或是执行的不对
搞不懂是啥原因了
还有那个 setb 10h
手册上明明说的是对10h位地址也就是22h单元的最低位置1
但是也不能执行,或是执行的不对
当用08h是就没错了
也叫我很纳闷
。。。。。。。。。。。 su27 发表于 2012-7-16 15:36 static/image/common/back.gif
SETB是位操作,后面即使是地址也是字节了,怎么可能对呢?
你说的和手册上讲的不一样
手册上讲setb 10h中
10h是位地址
虽然它也占用了一个字节的空间 lxa0 发表于 2012-7-16 22:04 static/image/common/back.gif
首先谢谢你的解释和你所提供的资料
我在用cjne a,22h,dxx指令时
依照你说的
改成setb 08h和cjne a,#22h,dxx
就可以执行
难道你的设计意图就是运行到这一步的时候,判断 a 是否等于 0x22h?你在 22h 这个单元里面放的就是 0x22h 这个数?
建议你在这里单步调试,看看这个时候的 a 还有以及字节地址 20h 和 22h的数值。 openepo 发表于 2012-7-16 15:03 static/image/common/back.gif
这个说的就不准确了。
cjne 的用法有以下几种:
CJNE A,direct,rel
将 A 和直接寻址(地址为 direct)的数据进行比较,不等则跳转。
你的资料里也有这样的例子:wait:cjne a,p1,wait
怎么我用就不行呢?
真是怪的很 openepo 发表于 2012-7-16 22:30 static/image/common/back.gif
依照你说的
我在 22h 里放的不是#22h
是另一个#0cch 可能对应的汇编工具不一样。 我对 Atmel 里面的的 CJNE A,@Ri,rel 那个也犯嘀咕,就没再其他地方看到类似的用法。估计只有用 Atmel 的汇编工具才能跑的通。这个语句按这个文档,用到了 A5 这个保留的指令。 理论上 Atmel 的汇编工具能支持以上的指令。
Atmel 的 C51ASM 工具
不过我不建议用这种不是标准的指令,以后移植什么的问题会比较多。 本帖最后由 lxa0 于 2012-7-16 22:51 编辑
openepo 发表于 2012-7-16 22:40 static/image/common/back.gif
理论上 Atmel 的汇编工具能支持以上的指令。
Atmel 的 C51ASM 工具
谢谢你的建议
我大多是用AT89S51/52
所以不应该有啥问题的
另外
我的编译工具是keil6.0版本的 UV2简体中文版(破解过的,无2K限制)
这条CJNE A,@Ri,rel 倒是很顺 本帖最后由 dz20062008 于 2012-7-17 09:12 编辑
lxa0 发表于 2012-7-16 22:06 static/image/common/back.gif
你说的和手册上讲的不一样
手册上讲setb 10h中
10h是位地址
RAM20H到2FH的字节地址空间有16BYTE没BYTE有8BIT所以就有128BIT了对应的位地址就是00H到7FH 汇编程序不懂啊 dz20062008 发表于 2012-7-17 09:03 static/image/common/back.gif
RAM20H到2FH的字节地址空间有16BYTE没BYTE有8BIT所以就有128BIT了对应的位地址就是00H到7FH ...
对呀
10h的位地址
就是22h单元的最地位嘛
可为啥就不能setb 10h呢? 本帖最后由 dz20062008 于 2012-7-19 01:49 编辑
setb 10h cjne a,22h,dxx 把22H单元的最低位10H位置1.然后用累加器A的值与22H的值比较跳转。前面的SETB会改变22H内的最地位的值,会影响判断结果
setb 08h cjne a,#22h,dxx 把21H单元的最低位08H位置1,然后用累加器A的值与立即数#22H比较。前面的SETB不会改变立即数#22H,不影响判断的结果,结果只取决于A内的值
setb 10h setb 08h改变的是不同的两个位地址内的值 单步调试的结果出来了么? dz20062008 发表于 2012-7-19 01:47 static/image/common/back.gif
setb 10h cjne a,22h,dxx 把22H单元的最低位10H位置1.然后用累加器A的值与22H的值比较跳转。 ...
谢谢你的介绍
我再想想~~~~~~~~~~~~~~~~ openepo 发表于 2012-7-19 03:09 static/image/common/back.gif
单步调试的结果出来了么?
谢谢你的关注
我的keil6.0破解版搞不了单步
郁闷~~~~~~~~~~ 用汇编一定要使用断点调试功能。
还是有时间换一个KEIL把,不一定要PJ版本的,对于学习那里有2K 这么大的代码啊。
坛子有KEIL4.0的汉化包,电驴上有很多KEIL版本,坛子也应该有,大了无法传给你,没办法! dz20062008 发表于 2012-7-20 12:47 static/image/common/back.gif
用汇编一定要使用断点调试功能。
还是有时间换一个KEIL把,不一定要PJ版本的,对于学习那里有2K 这么大的代 ...
谢谢你
回头我再慢慢试验~~~~~~~~~~~~~ 还没学这一些,先看看!! 看到“setb 10h和setb 08h”有点头晕,习惯使用"setb 2XH.X" tonyone 发表于 2012-7-21 15:10 static/image/common/back.gif
看到“setb 10h和setb 08h”有点头晕,习惯使用"setb 2XH.X"
其实是一样的
setb是一条位操作指令 lxa0 发表于 2012-7-21 23:53 static/image/common/back.gif
其实是一样的
setb是一条位操作指令
至少不要去翻书看哪一位的地址是多少了,呵呵,记性有点不好。 tonyone 发表于 2012-7-22 23:45 static/image/common/back.gif
至少不要去翻书看哪一位的地址是多少了,呵呵,记性有点不好。
老夫年纪50有余
记性不大好了
现在翻书已经是常事啦
哈哈~~~~~~~~~~~~~~~~~~~~~~~~~
页:
[1]