打印

越想越迷糊,求助高手。

[复制链接]
2092|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wxj1952|  楼主 | 2008-5-9 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假设有一个函数 void func(void ), 在C51下,应该怎样编写语句才能使得编译后的汇编语句表现为各种寻址方式?例如表现为:

立即寻址:  MOV DPTR,#FUNC

直接寻址:  MOV DPH, direct+1(假设是09H) / MOV DPL,direct(08H )

间接寻址:  .....MOV A,@R0 /MOV DPH,A ......

基址+变址寻址方式:....MOV A,@A+DPTR

相关帖子

沙发
fsaok| | 2008-5-10 06:54 | 只看该作者

自己做一个C51编译器

估计不是太难,GCC不是有开放的源代码吗?

自己写的这个C51,喜欢怎么样的寻址就怎么样寻址,不过效率如何就很难说.

使用特权

评论回复
板凳
yewuyi| | 2008-5-10 08:50 | 只看该作者

有什么特殊用途吗?

使用特权

评论回复
地板
computer00| | 2008-5-10 09:18 | 只看该作者

这有什么用呢?编译器不大好控制,不如插入在线汇编。

使用特权

评论回复
5
wxj1952|  楼主 | 2008-5-10 10:36 | 只看该作者

C51完全能够实现LZ提出的要求.

2楼的意思是C51编译器没这个功能?等一等,等一等,我正在慢慢清醒过来。

有什么用途?——立即寻址和直接寻址显然代码效率最高。而间接寻址代码要长得多。指针并不是随便用的。有时很简单的目标,由于概念/方法问题,结果使代码比别人长了10倍,还不稳定,也不知道问题在哪里。

举例:两个程序员同样用C51解决上述问题,C语句两人看上去差不多,但是编译结果大不一样:

编译结果1: MOV DPTR,#FUNC

编译结果2:
MOV R0,#0X0B
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPH,R6
MOV DPTR,A

2个人差就差在:没搞清“寻址方式”的概念,以及C51中是怎么控制的。



使用特权

评论回复
6
yysmcu| | 2008-5-10 12:59 | 只看该作者

mov dptr,a?有这指令嘛?

使用特权

评论回复
7
wxj1952|  楼主 | 2008-5-10 14:02 | 只看该作者

C51编译器干的,它有它的规则。

编译器,它愿意翻译成什么就翻译成什么。反正Ax51和它同样规则,最后是机器码F582。

使用特权

评论回复
8
wxj1952|  楼主 | 2008-5-10 14:46 | 只看该作者

才想起来。

还有一个原因:5楼好像是拷的反汇编码,在REG52.H中有一条

sfr16 DPTR = 0x82;

而0x82同时也是DPL的地址。所以,反汇编DPTRDPL都一样。

使用特权

评论回复
9
yewuyi| | 2008-5-10 15:25 | 只看该作者

自说自话?

使用特权

评论回复
10
wxj1952|  楼主 | 2008-5-10 20:51 | 只看该作者

呵呵,教研室几个师兄弟共用这个ID、和这台机器。

我不同意8楼师兄!
5楼的是编译结果,不是反汇编结果。MOV DPTR,A  在Ax51下绝对能汇编通过,得到的机器码是F582。

使用特权

评论回复
11
wxj1952|  楼主 | 2008-5-14 09:29 | 只看该作者

很简单的问题,产生很复杂的后果。

由此可见,中国为什么做不出自己的OS。不是没做,是做出来了无法运行,或者动不动崩溃。动辄几万行的程序会有多少这样的不稳定因素?结果原因是基础概念还不清楚。

这跨越式/飞跃式追赶,把基础的东西跨漏了。空中建阁楼。

使用特权

评论回复
12
dld2| | 2008-5-14 10:54 | 只看该作者

使用特权

评论回复
13
| | 2008-5-14 11:36 | 只看该作者

晕啊。.

使用特权

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

本版积分规则

38

主题

757

帖子

1

粉丝