打印

关于69P55的指令操作问题

[复制链接]
2005|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elic|  楼主 | 2007-11-19 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
90使用中颖单片机,在指令操作方面有很多疑问,望指点一二
比如有如下代码:
PORTI    EQU    390H  定义端口I的数据寄存器
LDI      PORTI  0FH     赋立即数0FH到端口I
然后编译提示出错:超出内存地址范围
但我查看了69P55的DATASHEET,端口I的数据寄存器是$390H错啊

另外中颖的指令系统中有没有:将某一数据寄存器中的数据传送到另一数据寄存器中 这样操作的指令
沙发
warm_ice| | 2007-11-19 13:46 | 只看该作者

是这样的

1.LDI      PORTI  0FH   指令中PORTI和0FH之间要有个逗号。
2.因为PROTI的地址为38FH,故不能直接使用LDI指令,LDI指令只能对00H~7FH的寄存器进行操作。另外,还有一些指令也和LDI一样,请查看规格书或是指令手册。
3.将一个寄存器的值关到别一个寄存器,通常要先把要用的数据调到累加器中,再用STA指令存回要赋值的寄存器。

使用特权

评论回复
板凳
elic|  楼主 | 2007-11-20 09:34 | 只看该作者

具体是这样的

PORTI    EQU    0390H
CACHE    EQU    30H
ORG    0000H
JMP    MAIN
NOP
RTNI
RTNI
NOP

ORG    0005H
MAIN:
LDI    CACHE,0FH
STA    PORTI,00H
END

编译后,出现警告:memory address is out of range,truncated to 7 bits

使用特权

评论回复
地板
warm_ice| | 2007-11-20 14:42 | 只看该作者

程序里有个小错误

出现警告是正常的,是提醒您查看一下是否有错误,只要不是错误,就能编译通过。

程序中有个小错误,STA    PORTI,00H
后面的“00H”,要么省略,要么就写“07H”,否则就不能对390H赋值,只能对010H这个寄存器赋值。

解释一下:
RAM是分区的,每80H为一个分区,即00H~7FH,80H~FFH....,您用到的STA指令后面的“00H”就是指这个分区值,00H就代表00H~7FH,01H就代理80H~FFH,按这个方法计算,390H就在07H分区中,故要写上07H.

不过,我建议您省略逗号及后面的00H,因为IDE66编译仿真软件会自动计算该值(像LDA等指令也是一样的道理)

使用特权

评论回复
5
elic|  楼主 | 2007-11-20 15:50 | 只看该作者

问题解决了,非常感谢!

现在问题已经解决了,非常感谢warm_ice耐心回答我这如此弱智的问题!!

不过发现一个奇怪的问题:
如果我直接双击project文件,按照warm_ice的说法修改后编译,仍然出现上面的警告
如果我是先打开IDE66,再通过open project打开,编译,则不会出现警告

我进一步对比了下两者的区别,发现前者默认不包括扩展指令,也就是Extended pseudo_instruction选项的Enable未打勾;而后者则包括了,所以才导致了不同的编译结果!

所以再请问下warm_ice,为什么会出现的现象

使用特权

评论回复
6
warm_ice| | 2007-11-20 17:43 | 只看该作者

不用客气

无论怎么调入,编译时都会有警告出现。当然,如果程序没有改变,点击编译时,程序会跳过编译,因为之前已经编译过了,有保存相关的文件,这样可以提高效率。这时,就不会看到警告信息了。

使用特权

评论回复
7
elic|  楼主 | 2007-11-21 08:48 | 只看该作者

您没明白我的意思

我的意思是按照您的建议将上面程序的逗号及00H省略以后,两种打开方式会出现两种不同的编译结果,而不是您说的两次连续的编译

使用特权

评论回复
8
warm_ice| | 2007-11-21 15:37 | 只看该作者

这样

我明白您的意思,我试了一下,没有您所说的现象,只要设置好,Extended pseudo_instruction选项都不会有变化,编译时警告也会出现,除非您改变Assembler Setting中Warning Level的设置。

使用特权

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

本版积分规则

15

主题

72

帖子

0

粉丝