搜索
bottom↓
回复: 30

问一个汇编最简单的问题,进来看看吧。

[复制链接]

出0入0汤圆

发表于 2013-8-11 12:24:32 | 显示全部楼层 |阅读模式
本帖最后由 大哈欠E 于 2013-8-11 22:29 编辑

看到一个扫描矩阵行列程序的一部分,看了一下郁闷了。。。

KEY: MOV A,#00H
       MOV DPTR,#POTR1      ;port1为单片机的io口
       MOVX @DPTR,A              ;把行全部赋值为00H 相当于port1=00h
       MOV DPTR,#PORT2        ;读取列的值
       MOVX A,@DPTR
      
有两个问题:
1、为什么要这样写,读取列端口port2的值为什么用movx(对外部RAM的数据传送)?难道51单片机的io口port2属于片外ram吗?它的端口不是特殊功能寄存器的一个单元吗                                                                                                                                                                                                          2、为什么不这样写
                mov port1,#00h
                        mov a,port2
?访问51的sfr不是直接寻址的吗?

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入85汤圆

发表于 2013-8-11 14:17:18 | 显示全部楼层
人家写的是间接寻址,你用的是直接寻址,还有DPTR是16bit的,能同时操作2组IO

出0入0汤圆

发表于 2013-8-11 14:30:46 | 显示全部楼层
marshallemon 发表于 2013-8-11 14:17
人家写的是间接寻址,你用的是直接寻址,还有DPTR是16bit的,能同时操作2组IO ...

你这说法完全错误,dptr的16bit关端口什么事啊。
估计楼主没看原理图,用到了这样的代码,估计是单片机外接了8155或8255这样的器件,port1是PA的地址,port2是PB的地址,这根本不是单片机本身的P1 P2端口。

出0入85汤圆

发表于 2013-8-11 16:08:09 | 显示全部楼层
本帖最后由 marshallemon 于 2013-8-11 16:13 编辑
XA144F 发表于 2013-8-11 14:30
你这说法完全错误,dptr的16bit关端口什么事啊。
估计楼主没看原理图,用到了这样的代码,估计是单片机外 ...


把汇编修好再来评价吧,先说你的回复,首先这段代码是51的的汇编,并非AVR,所以端口并不是PA,PB.
再说LZ问的这个问题,LZ问问题的 核心在于寻址方式的不同,并不在于端口,
再说我的回复,我回复的核心在于说使用DPTR进行间接寻址的灵活性。
另外说下即便使用8155,8255,8279之类的并不一定要使用这种方式操作,使用IO模拟时序依然是可以的这样依然用不到MOVX,之所以是使用MOVX的主旨在于使用总线模式操作

出0入0汤圆

发表于 2013-8-11 16:18:43 | 显示全部楼层
不用你说,我知道这是51的汇编。
8155或8255器件上的IO口就是用PA、PB、PC命名的,别以为只有AVR单片机才写PORTA、PORTB什么的。
虽然模拟总线方式也可以访问8155/8255,但是没有总线方式的速度快。
所以楼主的问题很简单,看看这程序对应的原理图是什么样子的,空说无凭。

出0入0汤圆

发表于 2013-8-11 16:21:49 | 显示全部楼层
执行movx指令的确能让51的P0和P2同时发生变化,但这只是输出地址信息持续一个movx指令的时间,指令执行后恢复高电平。但这输出没法用来扫描键盘矩阵吧?

出0入4汤圆

发表于 2013-8-11 16:28:17 | 显示全部楼层
很明显是用了总线的操作方式。楼主不理解的话,没必要看了,这都是哪个年代了玩意了。

出0入0汤圆

 楼主| 发表于 2013-8-11 17:11:20 | 显示全部楼层
marshallemon 发表于 2013-8-11 14:17
人家写的是间接寻址,你用的是直接寻址,还有DPTR是16bit的,能同时操作2组IO ...

小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52的高128字节ram只能用间接寻址,这样可以区分开来,为何这里用到了间接选址?还用movx间接寻址。。

出0入0汤圆

 楼主| 发表于 2013-8-11 17:25:09 | 显示全部楼层
XA144F 发表于 2013-8-11 16:18
不用你说,我知道这是51的汇编。
8155或8255器件上的IO口就是用PA、PB、PC命名的,别以为只有AVR单片机才写 ...

小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52的高128字节ram只能用间接寻址,这样可以区分开来,为何这里用到了间接选址?还用movx间接寻址。。书上也没有原理图,只是说设行地址为port1列地址为port2,我觉大神说的有理啊,还有你们说的总线怎么这么深奥啊?51总线宽度是16位,用movx就用到总线,难道用mov就不是总线 8位?还说io模拟,小生更不懂了,看来是小生愚昧了,
请大神点拨一二。。

出0入0汤圆

 楼主| 发表于 2013-8-11 17:26:16 | 显示全部楼层
XA144F 发表于 2013-8-11 16:21
执行movx指令的确能让51的P0和P2同时发生变化,但这只是输出地址信息持续一个movx指令的时间,指令执行后恢 ...

这个更没法理解了。。。

出0入0汤圆

发表于 2013-8-11 17:27:19 | 显示全部楼层
同意8楼意见

出0入0汤圆

 楼主| 发表于 2013-8-11 17:32:41 | 显示全部楼层
wajlh 发表于 2013-8-11 16:28
很明显是用了总线的操作方式。楼主不理解的话,没必要看了,这都是哪个年代了玩意了。 ...

额,我怎么觉得还是有必要搞一下汇编了

出0入0汤圆

 楼主| 发表于 2013-8-11 17:34:15 | 显示全部楼层
哎!都是论坛元老级人物了,佩服你们啊,更羡慕你们的知识。。。

出0入0汤圆

 楼主| 发表于 2013-8-11 17:35:06 | 显示全部楼层
NJ8888 发表于 2013-8-11 17:27
同意8楼意见

嗯,我还是认为有必要搞搞汇编。

出0入0汤圆

 楼主| 发表于 2013-8-11 17:37:04 | 显示全部楼层
renpeng009 发表于 2013-8-11 14:10
都对。思路不同而已。

据我推测,第一种写法应该是受了教科书的影响

小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52的高128字节ram只能用间接寻址,这样可以区分开来,为何这里用到了间接选址?还用movx间接寻址。。

出0入85汤圆

发表于 2013-8-11 20:18:50 | 显示全部楼层
XA144F 发表于 2013-8-11 16:18
不用你说,我知道这是51的汇编。
8155或8255器件上的IO口就是用PA、PB、PC命名的,别以为只有AVR单片机才写 ...

呵呵,看来你说来说去都指在使用8155,8255啊,不使用8155或8255类只使用锁存来扩展IO这种方法依然是可以使用的,使用总线方式速度快这个是肯定的

出0入85汤圆

发表于 2013-8-11 20:26:34 | 显示全部楼层
大哈欠E 发表于 2013-8-11 17:11
小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52 ...

让你这么一问让我反而不知道该怎样作答了,感觉你把两个内容搞混了,这种间接寻址是对于变量自身来说的,并不是针对SFR来说的,例如你例子中的#POTR1,#POTR2,也就是说对于#POTR1,#POTR2是间接寻址,而不是对于DPTR,在这个例子中#POTR1,#POTR2为立即数

出0入0汤圆

 楼主| 发表于 2013-8-11 20:54:44 | 显示全部楼层
marshallemon 发表于 2013-8-11 20:26
让你这么一问让我反而不知道该怎样作答了,感觉你把两个内容搞混了,这种间接寻址是对于变量自身来说的, ...

我没有搞混淆,大神可能没仔细看问题,我纠结的是port1 port2是51单片机的io端口,像P1和P2,但如果是这样的话还可以用movx来访问吗?如果port1和port2是自变量的话那么一切疑问即可烟消云散,但是如果是变量的话,是不是也要求port1和port2是片外ram单元,还有关键是这个程序是矩阵键盘扫描程序应该是端口才对啊,现在结果可能只有一个那就是用8155和8255扩展了io口,所以才用movx,不知道小生这样理解对不对?

出0入0汤圆

 楼主| 发表于 2013-8-11 20:57:07 | 显示全部楼层
如果你们说的总线访问是这样吗?“movx 只用于访问外部RAM或EPROM(EA要为低电平)。会用到地址总线P0(低8位)和P2(高8位) 数据总线P0 和 控制总线WR、RD、ALE、PCON访问是外部RAM时:ALE用于低8位地址锁存, RD为读信号,WR为写信号. 地址线P0(低8位)和P2(高8位) 访问了地址后数据再由P0口数据线传送。 时序:ALE先发出锁存选通信号,P0和P2再发地址信号,RD或WR作RAM选通信号。之后锁存地址线,再由P0接收读的数据或发送写的数据。访问是外EPROM时:ALE用于低8位地址锁存,地址线为P2和P0 PCON为外EPROM选通信号。”

出0入0汤圆

 楼主| 发表于 2013-8-11 21:01:16 | 显示全部楼层
XA144F 发表于 2013-8-11 14:30
你这说法完全错误,dptr的16bit关端口什么事啊。
估计楼主没看原理图,用到了这样的代码,估计是单片机外 ...

正解。。。。。谢谢。

出0入0汤圆

 楼主| 发表于 2013-8-11 21:02:54 | 显示全部楼层
51单片机执行MOVX读指令时,相关的信号状态是(      )
A.PSEN无效为低电平,RD有效为低电平
B.PSEN无效为高电平,RD有效为低电平
C.PSEN有效为低电平,RD无效为高电平
D.PSEN有效为高电平,RD无效为高电平
选B吗? 呵呵

出0入42汤圆

发表于 2013-8-11 21:07:31 | 显示全部楼层
首先对 MOV @DPTR,A 表示疑问,应该是 MOVX @DPTR,A 吧?前面那句在keil下会报错的。

如果这么写,那就可能用了外部的锁存器来扩展IO,并且行和列都用了外部扩展

还有,“直接寻址”,“间接寻址”都是针对内部的SRAM和SFR来说的,由DPTR参与的是用来寻址外扩SRAM和程序存储器的

出0入0汤圆

 楼主| 发表于 2013-8-11 22:29:19 | 显示全部楼层
wshtyr 发表于 2013-8-11 21:07
首先对 MOV @DPTR,A 表示疑问,应该是 MOVX @DPTR,A 吧?前面那句在keil下会报错的。

如果这么写,那就可 ...

嗯 对,书上是这样的movx 我粗心漏打了一个。。

出0入0汤圆

发表于 2013-8-12 08:19:48 | 显示全部楼层
大哈欠E 发表于 2013-8-11 17:11
小生刚接触汇编,有些问题还是不明白,对于51或52特殊功能寄存器块,不是只能用直接寻址访问吗?而对于52 ...

间接寻址不是只有一种方式,访问SFR是直接寻址,访问高128字节RAM用间接寻址。
访问外部总线上的设备,那是基于movx的间接寻址,寻址目的地放在DPTR中。
你的程序里说出的是port1和port2,是外部总线上两个端口的地址,不是单片机本身的P1和P2,你必须要分清楚。不然的话,建议你还是看看北航出的51单片机教材,其他杂书就不用看了,更别看什么10天学会的。

出0入85汤圆

发表于 2013-8-12 09:06:10 | 显示全部楼层
大哈欠E 发表于 2013-8-11 20:54
我没有搞混淆,大神可能没仔细看问题,我纠结的是port1 port2是51单片机的io端口,像P1和P2,但如果是这 ...


通常使用51自身的端口是不会这样去写的,看你的写法是立即数,通常这个立即数是在使用总线方式操作时的扩展IO的映射地址,这样的操作实质上是设置总线上扩展的地址,而不会直接把51自身端口的地址以立即数的写法付给DPTR,这样是没有意义的,你即便给DPTR付值为P1口的地址这样也是无效的,因为这种MOVX的写法会影响的IO有P0,P2,WR,RD,ALE......但不会影响P1口
MOV A,#00H
       MOV DPTR,#POTR1      ;port1为单片机的io口
       MOVX @DPTR,A  

这种写法中#POTR1就是总线扩展端口的映射地址,通常是16bit的,但当然你也可以赋值为8bit的地址,付8bit时高8bit就是#00H,这个地址是由你总线上IC的接法决定的,这个 MOVX @DPTR,A在执行时是将A中的内容赋值给#POTR1地址的,这个#POTR1地址由P0,P2口组合完成,这样看出来我为啥说使用这种写法能直接操作2组IO了吧,你说这个DPTR和端口有无关系?

如果这样写你还不理解,那你可以去看看微机原理中的总线扩展RAM,ROM的地址编码部分了,现代通常讲MCU这部分总线扩展一般都不怎么讲了,因为同样内核的片子内部的RAM和ROM都有更大的了,总线扩展将占用的IO会比较多,而且可靠性也相对降低

出0入0汤圆

 楼主| 发表于 2013-8-12 11:01:18 | 显示全部楼层
XA144F 发表于 2013-8-12 08:19
间接寻址不是只有一种方式,访问SFR是直接寻址,访问高128字节RAM用间接寻址。
访问外部总线上的设备,那 ...

嗯,这些搞清楚了,我以为port1和port2是单片机本身的端口,才提出这样的问题的,movx我也懂,我有一本《单片机原理及应用》,正在学习,我是用c做了几个作品之后,觉得有必要搞清楚单片机内部工作原理才反过来学汇编的。。。

出0入0汤圆

 楼主| 发表于 2013-8-12 11:08:53 | 显示全部楼层
marshallemon 发表于 2013-8-12 09:06
通常使用51自身的端口是不会这样去写的,看你的写法是立即数,通常这个立即数是在使用总线方式操作时的扩 ...

嗯,谢谢,其实这些我早就明白了,我就是以为port1和port2是本身端口竟然还会用movx,怀疑这程序错误,结果后才知道port1和port2是扩展io所以采用movx寻址。。

出0入85汤圆

发表于 2013-8-12 11:12:03 | 显示全部楼层
大哈欠E 发表于 2013-8-12 11:08
嗯,谢谢,其实这些我早就明白了,我就是以为port1和port2是本身端口竟然还会用movx,怀疑这程序错误,结 ...

出0入0汤圆

 楼主| 发表于 2013-8-12 11:14:21 | 显示全部楼层
marshallemon 发表于 2013-8-12 11:12

小生是个二愣子。。呵呵

出0入85汤圆

发表于 2013-8-12 11:27:19 | 显示全部楼层
大哈欠E 发表于 2013-8-12 11:14
小生是个二愣子。。呵呵

A51已经不怎么用了,偶尔才会有个反汇编的项目,但之前学的是从汇编到C的,毕业后第一份工作全部是汇编完成

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 16:23

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

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