为什么在用单片机汇编编程时,开头都要写上 ORG 0000H AJMP MAIN ORG 0030H这些呢?请各位大侠多多指点!

如题所述

原因:单片机中,0000H单元为系统启动地址,ORG 0000H AJMP MAIN 就是在该地址存放一条绝对跳转指令,转入主程序的入口地址。ORG 0030H 是为了把用户程序定位到用户RAM区(30H-7FH),0000H-0030H存储单元地址是有其他特殊功能的。

汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。程序从ROM的0000开始存放程序,但是AJMP  MAIN是一条无条件跳转指令,也就是说,单片机上电之后首先从0000处开始执行程序。

但是,AJMP直接将程序跳转到MAIN标号指向的存储区域开始取指令,并执行,而一般MAIN标号是放在语句ORG 0030之后的,也即,主程序是从0030这个地址开始存放的。

扩展资料:

单片机数据存储器的特殊区段:

1、工作寄存器区(00H-1FH)

在00H-1FH共32个单元,被均匀地分为四组工作寄存器堆:RB0、RB1、RB2、RB3,每组寄存器堆包含8个工作寄存器,均以R0-R7来命名,这些寄存器被称为通用寄存器。工作寄存器用于临时存放8位信息。在使用时,由程序状态字寄存器中的RS0、RS1来选择工作寄存器堆。

2、位寻址区(20H-2FH)

片内数据存储器的20H-2FH存储区为位寻址区,既可作为一般单元按字节寻址,也可按位进行寻址。位寻址区有16个字节,位地址为00H-7FH。

参考资料来源:百度百科-单片机存储器

参考资料来源:百度百科-org

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-24
ORG是伪指令,告诉编译器,程序从ROM的0000开始存放程序,但是AJMP MAIN是一条无条件跳转指令,也就是说,单片机上电之后首先从0000处开始执行程序,但是,AJMP直接将程序跳转到MAIN标号指向的存储区域开始取指令,并执行,而一般MAIN标号是放在语句ORG 0030之后的,也即,主程序是从0030这个地址开始存放的;

这是因为,单片机内部有几个中断源,默认内部中断(包含几个定时器中断,还有外部中断)的入口是在0000-0030之间的,每个中断大概占用两个字节还是四个字节,记不清楚了。而这些内部中断一旦产生,指针必然立刻指向0004-0030之间,如果你的程序有语句放在这个地址内,程序必然跑飞!!!

因此,在8051这个MCU的设计中,已经将0004-0030分配给内部使用了,所以,你的程序只能从0030之后的任何存储区域开始存放,AJMP MAIN就是为了在MCU上电的时候知道从ROM中的那个地址开始取指令

而如果你使用到中断,也必然要在已经定义为中断入口的地址0004--0030写上AJMP,以便于跳转到你自己编写的相应的中断程序中

说的有点乱,希望能有助于你理解本回答被提问者采纳
第2个回答  2011-05-28
我们在程序一开始都会用到伪指令比如“ORG 0000H ”定义起始地址,汇编完成后执行代码就会在单片机的程序存储器中从地址0000H开始存储。某些情况下我们不想把执行代码从0000H开始存储。如楼上所说的,

为什么在用单片机汇编编程时,开头都要写上 ORG 0000H AJMP MAIN ORG 0...
ORG是伪指令,告诉编译器,程序从ROM的0000开始存放程序,但是AJMP MAIN是一条无条件跳转指令,也就是说,单片机上电之后首先从0000处开始执行程序,但是,AJMP直接将程序跳转到MAIN标号指向的存储区域开始取指令,并执行,而一般MAIN标号是放在语句ORG 0030之后的,也即,主程序是从0030这个地址开始存放的...

单片机中为什么是0000H开始执行程序?
原因:单片机中,0000H单元为系统启动地址,ORG 0000H AJMP MAIN 就是在该地址存放一条绝对跳转指令,转入主程序的入口地址。ORG 0030H 是为了把用户程序定位到用户RAM区(30H-7FH),0000H-0030H存储单元地址是有其他特殊功能的。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址...

单片机程序第一句ORG 0030H什么意?
AJMP MAIN指令为无条件跳转指令,单片机上电时从0000地址开始执行程序。AJMP指令将程序跳转到MAIN标号指向的存储区域开始取指令。MAIN标号通常位于ORG 0030指令之后,意味着主程序存放于0030地址开始。这是因为在单片机内部有若干中断源,其默认入口位于0000-0030之间。每个中断占用2个字节或4个字节,具体不详。

汇编语言中第一行有ORG 地址;表示什么啊!
MAIN: MOV A,#6BH ;表示强行指定main程序,从1000H开始 若是没有ORG指定地址,程序就从0000H开始。

汇编程序的开头第二个org指令的作用?
第二条是控制汇编时将MOV C,P0.0从0030H处开始存放。之所以AJMP MAIN和MOV C,P0.0没有挨着存放,是因为单片机的中断入口地址需要占用0003H\\000BH\\0013H\\001BH\\0023H\\等,还要看你的单片机有几个中断源。

org汇编指令的疑惑。。
所以单片机程序一般开头就是 ORG 0000H AJMP MAIN ORG 0030H 这里的ORG 0000H指令,使得程序链接成HEX文件时,AJMP MAIN这条指令的机器码就在HEX文件的0x0位置。这是链接器的工作。至于x86 dos和win 32 exe,ORG的实现就复杂了,我也不清楚,ORG不再是绝对定位,只能在一个段里相对定位。

org 0000h
ORG 是汇编中的伪指令。ORG 0000H 表示后面紧跟的那条指令的地址是 0000H 如常用的:ORG 0000H AJMP MAIN ;AJMP MAIN 这条指令的地址是0000 ORG 0030H MAIN:AJMP $ ;AJMP $ 这条指令的地址是0030H END

单片机流水灯汇编求指教,请大神解释每行代码的意思
ORG 0000H 程序从0000h这开始运行 AJMP MAIN 然后跳到 main ORG 0030H mian从0030h开始运行 MAIN:mov P2 ,00 ;这不知道干嘛用,p2口接的什么?mov P0 ,01h ;p0口送出,01h,最 左边 的 小灯 亮 MOV A ,P0 LOOP:RL A ;01h循环左移一位,变成00000010b LCALL DELAY 调用延时程序,...

单片机中org 这程序指定的是什么的起始,可否举几个应用的例子_百度知 ...
LJMP X0_INT ;转到X0中断入口 ORG 0013H LJMP X1_INT ;转到X1中断入口 org 0030h START:程序从00h开始运行。跳转到start开始执行,然后当中断0来到的时候,会跳转到x0_int这里.start真正开始存储的位置是从0030h开始的。你说的64k的32位地址,是不是指32位的cpu,程序存储器大小是...

流水灯单片机程序代码
单片机流水灯程序代码(汇编语言):ORG0000HAJMPMAINORG0030HMAIN:MOVP1,#11111110BACALLDELAY;跳转到子程序MOVP1,#11111101BACALLDELAYMOVP1,#11111011BACALLDELAYMOVP1,#11110111BACALLDELAYMOVP1,#11101111BACALLDELAYMOVP1,#11011111BACALLDELAYMOVP1,#10111111BACALLDELAYMOVP1,#01111111BACALLDELAYAJMP...

相似回答