菜鸟问一下51 ORG用法

[复制链接]
4619|19
 楼主| forsuccess 发表于 2007-8-20 00:27 | 显示全部楼层 |阅读模式
 KEIL中仿真 把从30地址开始10个RAM单元中内容置FF
  ORG 00H
    MOV R1,#30H
    MOV R0,#10

    ORG 040 ;***********************************
LOOP:    
    MOV A,#0FFH
    MOV @R1,A
    INC R1
    DJNZ R0,LOOP
    SJMP $
      END

多了带*******************一行就不能仿真,为什么,ORG不是我自己指定
程序方的位置吗,为什么有影响,请教各位答复,谢谢。
hotpower 发表于 2007-8-20 00:45 | 显示全部楼层

40H或0x40

 楼主| forsuccess 发表于 2007-8-20 12:28 | 显示全部楼层

还是不行啊。。。。。。

oldcat8999 发表于 2007-8-20 13:46 | 显示全部楼层

这样做应该是不可以的

从00H开始存放了两条MOV指令,从40H开始存放LOOP段指令,但是在MOV后LOOP前的内容是什么呢?应该说是不确定的,或者说是没有意义的、非法的。但是MOV指令后没有跳转指令,所以单片机在执行完MOV指令后会继续执行ROM中下面的指令,这些指令本身就是非法的,因此肯定会出问题。
那么,下一个问题是:MOV后LOOP前的内容究竟是什么呢?我曾经使用野指针读取过STC8051单片机ROM中的空闲部分,结果是所有的为编程的内容都是0FFH,我没有去查找过0FFH对应的程序是什么,但可以肯定地是,这些程序肯定是没有任何意义,是非法的。
以上的解释你能明白吗?
 楼主| forsuccess 发表于 2007-8-20 22:57 | 显示全部楼层

非常感谢

我明白了,非常感谢。
好多高手,不屑于这个问题,看来这个问题还真上不了台面,惭愧。
拜师学艺 发表于 2007-8-21 00:23 | 显示全部楼层

受益了,谢谢啦

omantou 发表于 2007-8-21 08:08 | 显示全部楼层

为什么这样还是不行

     ORG 0040H
     MOV R1,#30H
     MOV R0,#10
LOOP:    
     MOV A,#0FFH
     MOV @R1,A
     INC R1
     NOP
     DJNZ R0,LOOP
DENG:SJMP DENG
     END
btiger2000 发表于 2007-8-21 08:36 | 显示全部楼层

上电复位从0000开始执行

最起码要加一句:
ORG 0000
跳转至你程序的入口
computer00 发表于 2007-8-21 08:37 | 显示全部楼层

倒塌...直接帮你写好了...

  ORG 0000H
     LJMP LOOP
;保留给中断服务
;
  ORG 0040H
     MOV R1,#30H
     MOV R0,#10
LOOP:    
     MOV A,#0FFH
     MOV @R1,A
     INC R1
     NOP
     DJNZ R0,LOOP
DENG:SJMP DENG
     END
 

我是C人,不知道忽悠对了没...
omantou 发表于 2007-8-21 08:48 | 显示全部楼层

呵呵

     ORG 0000H
     AJMP MAIN
     ORG 0040H
MAIN:MOV R1,#30H
     MOV R0,#10
LOOP:    
     MOV A,#0FFH
     MOV @R1,A
     INC R1
     NOP
     DJNZ R0,LOOP
DENG:SJMP DENG
     END

这样就对了
开始那两句不小心给忘了
谢谢
 楼主| forsuccess 发表于 2007-8-21 17:13 | 显示全部楼层

******

computer00这样写  ORG 0040H下面的两句
     MOV R1,#30H
     MOV R0,#10
在程序里始终没有执行吧??????
mannerfh 发表于 2007-8-21 17:26 | 显示全部楼层

哈哈

有意思,看来汇编忘的人不少啊!!!
hotpower 发表于 2007-8-21 18:50 | 显示全部楼层

10楼对,00忽悠过点了~~~

computer00 发表于 2007-8-21 19:55 | 显示全部楼层

倒塌...忽悠过头了...

  ORG 0000H
     LJMP CLRMEM
;保留给中断服务
;
  ORG 0040H

CLRMEM:
     MOV R1,#30H
     MOV R0,#10
LOOP:    
     MOV A,#0FFH
     MOV @R1,A
     INC R1
     NOP
     DJNZ R0,LOOP
DENG:SJMP DENG
     END
 
hyh0lh 发表于 2007-8-22 11:28 | 显示全部楼层

现在楼主知道怎么写了吧

给你点小建议:汇编代码执行都是从头(0000H)开始执行,所以起初的“ORG 0000H”可以省略掉,但“LJMP MAIN”是不可少的,这是让你的程序从你的主程序开始,当然你也可以用别的标号来代替MAIN,这是你的自由;编程最好不要占用前64个字节,那是汇编的中断入口专用地址存放。
conwh 发表于 2007-8-22 12:58 | 显示全部楼层

倒塌的编译器

cuijianmin 发表于 2007-8-22 14:45 | 显示全部楼层

为什么我的编译器能把楼主的程序编出来呢???

我用WAVE6000编译器能够把楼主那个程序汇编出来!!
楼主的KEIL是不是没有设置好啊!!
 楼主| forsuccess 发表于 2007-8-22 18:16 | 显示全部楼层

******

可以编译,但是不能运行的。。。。。。
 楼主| forsuccess 发表于 2007-8-23 08:21 | 显示全部楼层

ORG 0040H什么作用

十楼那个 ORG 0040H 在这个程序中有什么作用?
btiger2000 发表于 2007-8-23 08:24 | 显示全部楼层

ORG 0040H 后面的代码从40H开始编译,跨过中断向量区

您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

70

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部