搜索
bottom↓
回复: 34

[求助]AT89S51/52上的怪事一庄

[复制链接]

出0入0汤圆

发表于 2012-7-14 01:53:33 | 显示全部楼层 |阅读模式
前2天用AT89S51/52做数字钟玩
里面用到setb 10h和cjne a,22h,dxx两条指令
但是都不执行
改成setb 08h和cjne a,#22h,dxx
就可以执行
真是怪的很
大家以为是什么原因呢?
请指教

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出145入215汤圆

发表于 2012-7-15 02:33:48 来自手机 | 显示全部楼层
带#是立即数的意思,不带就是地址,位操作就要对应能进行位寻址的内存单元

出0入0汤圆

 楼主| 发表于 2012-7-15 13:02:17 | 显示全部楼层
dz20062008 发表于 2012-7-15 02:33
带#是立即数的意思,不带就是地址,位操作就要对应能进行位寻址的内存单元 ...

按说那2条指令里边
带不带#号
都应该能够执行的呀

出0入0汤圆

发表于 2012-7-15 15:10:35 | 显示全部楼层
把程序全部发上来才好看

出0入0汤圆

 楼主| 发表于 2012-7-15 15:13:18 | 显示全部楼层
renwocai 发表于 2012-7-15 15:10
把程序全部发上来才好看

程序有点长~~~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-7-15 15:32:05 | 显示全部楼层
你说的不执行是没有跑那两条语句还是运行结果和你设想不一致?

出0入0汤圆

 楼主| 发表于 2012-7-15 15:34:10 | 显示全部楼层
openepo 发表于 2012-7-15 15:32
你说的不执行是没有跑那两条语句还是运行结果和你设想不一致?

是执行的结果和我设想的不一样

出0入0汤圆

发表于 2012-7-15 22:06:23 | 显示全部楼层
那我想 2 楼的 dz20062008 就说得挺清楚了。

加不加 # 号会直接影响寻址方式。自然运行的结果不一样了。

出0入0汤圆

发表于 2012-7-16 14:37:19 | 显示全部楼层
没带"#"就是错误的语句!
cjne a,#22h,dxx
标准语句是 CJNE A,立即数,要跳转的地址

如果没有" #",它就不当作立即数,A和谁比值呀,当然不能运行呀!

出0入0汤圆

发表于 2012-7-16 14:38:19 | 显示全部楼层
即便运行了,结果也不是自己希望的!

出0入0汤圆

发表于 2012-7-16 15:03:39 | 显示全部楼层
and001 发表于 2012-7-16 14:37
没带"#"就是错误的语句!
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 了。

出0入0汤圆

发表于 2012-7-16 15:32:14 | 显示全部楼层
本帖最后由 and001 于 2012-7-16 15:35 编辑

对!楼上的很全面!51的指令是有些模糊了!比较少用汇编了!

出0入0汤圆

发表于 2012-7-16 15:35:23 | 显示全部楼层
我上面说的 cjne 的用法中,第五条好像是 Atmel 特有的用法。

5,CJNE A, @Ri,rel
将 A 和 Ri 指向的地址单元的数据比较,不等则跳转。

附上 Intel MCS 51 系列的汇编指令集和 Atmel C51 系列 ASM 用户手册作参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-16 22:04:23 | 显示全部楼层
本帖最后由 lxa0 于 2012-7-16 22:28 编辑
openepo 发表于 2012-7-16 15:35
我上面说的 cjne 的用法中,第五条好像是 Atmel 特有的用法。

5,CJNE A, @Ri,rel


首先谢谢你的解释和你所提供的资料

我在用cjne a,22h,dxx指令时
22h里放的是一个立即数
目的就是要a和22h里的数据做比较
不相等就跳转的
但是这条指令好像不能执行,或是执行的不对
搞不懂是啥原因了


还有那个 setb 10h
手册上明明说的是对10h位地址也就是22h单元的最低位置1
但是也不能执行,或是执行的不对
当用08h是就没错了
也叫我很纳闷

。。。。。。。。。。。

出0入0汤圆

 楼主| 发表于 2012-7-16 22:06:14 | 显示全部楼层
su27 发表于 2012-7-16 15:36
SETB是位操作,后面即使是地址也是字节了,怎么可能对呢?

你说的和手册上讲的不一样
手册上讲setb 10h中
10h是位地址
虽然它也占用了一个字节的空间

出0入0汤圆

发表于 2012-7-16 22:30:49 | 显示全部楼层
lxa0 发表于 2012-7-16 22:04
首先谢谢你的解释和你所提供的资料

我在用cjne a,22h,dxx指令时

依照你说的
改成setb 08h和cjne a,#22h,dxx
就可以执行


难道你的设计意图就是运行到这一步的时候,判断 a 是否等于 0x22h?你在 22h 这个单元里面放的就是 0x22h 这个数?

建议你在这里单步调试,看看这个时候的 a 还有以及字节地址 20h 和 22h的数值。

出0入0汤圆

 楼主| 发表于 2012-7-16 22:30:51 | 显示全部楼层
openepo 发表于 2012-7-16 15:03
这个说的就不准确了。

cjne 的用法有以下几种:

CJNE A,direct,rel
将 A 和直接寻址(地址为 direct)的数据进行比较,不等则跳转。
你的资料里也有这样的例子:wait:cjne a,p1,wait

怎么我用就不行呢?
真是怪的很

出0入0汤圆

 楼主| 发表于 2012-7-16 22:33:18 | 显示全部楼层
openepo 发表于 2012-7-16 22:30
依照你说的

我在 22h 里放的不是#22h
是另一个#0cch

出0入0汤圆

发表于 2012-7-16 22:35:03 | 显示全部楼层
可能对应的汇编工具不一样。 我对 Atmel 里面的的 CJNE A,@Ri,rel 那个也犯嘀咕,就没再其他地方看到类似的用法。估计只有用 Atmel 的汇编工具才能跑的通。这个语句按这个文档,用到了 A5 这个保留的指令。

出0入0汤圆

发表于 2012-7-16 22:40:58 | 显示全部楼层
理论上 Atmel 的汇编工具能支持以上的指令。
Atmel 的 C51ASM 工具

不过我不建议用这种不是标准的指令,以后移植什么的问题会比较多。

出0入0汤圆

 楼主| 发表于 2012-7-16 22:50:23 | 显示全部楼层
本帖最后由 lxa0 于 2012-7-16 22:51 编辑
openepo 发表于 2012-7-16 22:40
理论上 Atmel 的汇编工具能支持以上的指令。
Atmel 的 C51ASM 工具


谢谢你的建议
我大多是用AT89S51/52
所以不应该有啥问题的

另外
我的编译工具是keil6.0版本的 UV2简体中文版(破解过的,无2K限制)
这条CJNE A,@Ri,rel 倒是很顺

出145入215汤圆

发表于 2012-7-17 09:03:31 | 显示全部楼层
本帖最后由 dz20062008 于 2012-7-17 09:12 编辑
lxa0 发表于 2012-7-16 22:06
你说的和手册上讲的不一样
手册上讲setb 10h中
10h是位地址


RAM  20H到2FH的字节地址空间有16BYTE没BYTE有8BIT所以就有128BIT了对应的位地址就是00H到7FH

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入54汤圆

发表于 2012-7-17 10:41:08 | 显示全部楼层
汇编程序不懂啊

出0入0汤圆

 楼主| 发表于 2012-7-17 21:17:11 | 显示全部楼层
dz20062008 发表于 2012-7-17 09:03
RAM  20H到2FH的字节地址空间有16BYTE没BYTE有8BIT所以就有128BIT了对应的位地址就是00H到7FH ...

对呀
10h的位地址
就是22h单元的最地位嘛
可为啥就不能setb 10h呢?

出145入215汤圆

发表于 2012-7-19 01:47:54 | 显示全部楼层
本帖最后由 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改变的是不同的两个位地址内的值  

出0入0汤圆

发表于 2012-7-19 03:09:19 | 显示全部楼层
单步调试的结果出来了么?

出0入0汤圆

 楼主| 发表于 2012-7-19 19:36:50 | 显示全部楼层
dz20062008 发表于 2012-7-19 01:47
setb 10h     cjne a,22h,dxx         把22H单元的最低位10H位置1.  然后用累加器A的值与22H的值比较跳转。 ...

谢谢你的介绍
我再想想~~~~~~~~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2012-7-19 19:38:05 | 显示全部楼层
openepo 发表于 2012-7-19 03:09
单步调试的结果出来了么?

谢谢你的关注
我的keil6.0破解版搞不了单步
郁闷~~~~~~~~~~

出145入215汤圆

发表于 2012-7-20 12:47:32 | 显示全部楼层
用汇编一定要使用断点调试功能。
还是有时间换一个KEIL把,不一定要PJ版本的,对于学习那里有2K 这么大的代码啊。
坛子有KEIL4.0的汉化包,电驴上有很多KEIL版本,坛子也应该有,大了无法传给你,没办法!

出0入0汤圆

 楼主| 发表于 2012-7-21 02:00:09 | 显示全部楼层
dz20062008 发表于 2012-7-20 12:47
用汇编一定要使用断点调试功能。
还是有时间换一个KEIL把,不一定要PJ版本的,对于学习那里有2K 这么大的代 ...

谢谢你
回头我再慢慢试验~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-7-21 08:17:30 | 显示全部楼层
还没学这一些,先看看!!

出0入0汤圆

发表于 2012-7-21 15:10:16 | 显示全部楼层
看到“setb 10h和setb 08h”有点头晕,习惯使用"setb 2XH.X"

出0入0汤圆

 楼主| 发表于 2012-7-21 23:53:13 | 显示全部楼层
tonyone 发表于 2012-7-21 15:10
看到“setb 10h和setb 08h”有点头晕,习惯使用"setb 2XH.X"

其实是一样的
setb是一条位操作指令

出0入0汤圆

发表于 2012-7-22 23:45:34 | 显示全部楼层
lxa0 发表于 2012-7-21 23:53
其实是一样的
setb是一条位操作指令

至少不要去翻书看哪一位的地址是多少了,呵呵,记性有点不好。

出0入0汤圆

 楼主| 发表于 2012-7-23 23:13:00 | 显示全部楼层
tonyone 发表于 2012-7-22 23:45
至少不要去翻书看哪一位的地址是多少了,呵呵,记性有点不好。

老夫年纪50有余
记性不大好了
现在翻书已经是常事啦
哈哈~~~~~~~~~~~~~~~~~~~~~~~~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表