关于汇编语言的ORG伪指令

ORG0000HLJMPMAINORG0040HMAIN:MOVR1,#20HMOVR2,#10LOOP:MOV@R1,#00HINCR1DJNZR2,LOOPSJMP$... ORG 0000H
LJMP MAIN
ORG 0040H
MAIN:MOV R1,#20H
MOV R2,#10
LOOP:MOV @R1,#00H
INC R1
DJNZ R2,LOOP
SJMP $
END

ORG不是只要写一条,确定程序的初始地址就好了么?为什么后来还得写多一条“ORG 0040H”?
展开
 我来答
Nina_520
2010-05-24 · TA获得超过1565个赞
知道小有建树答主
回答量:1314
采纳率:41%
帮助的人:378万
展开全部
org指定绝对地址的好处是,维护代码的时候不必再行计算相应代码被安排的地址。换句话说,如果你接手一份代码的时候,尚未完全了解硬件平台,未必清楚它的中断向量表大小,如果没有org指定主程序入口地址,你又如何能快速的判断呢

举例说,你的“一般的 org 2000H;ajmp main;org 2013H;ajmp Int_ADC......”
实际上是指 ajmp main这条指令被放在rom的0x2000,ajmp Int_ADC这条指令被放在0x2013,而并不是说“main函数从0x2000开始、Int_ADC函数从0x2013开始”,所以你不必担心。只需要确保一条ajmp指令的长度不要大于0x13就没有问题(当然不会大于,64位系统的jmp也只有5字节)
如果程序强行指定那两个函数的入口地址,是这样写的:

org 2000H
main:
xxx
xxx
...

org 2013H
Int_ADC:
xxx
xxx

如果是这样写的,那么就表示main被强制指定到0x2000,Int_ADC被强制指定到0x2013,那么如果main后面的代码多于0x13字节,就会出问题了。
peeeeg
2011-10-21 · TA获得超过737个赞
知道答主
回答量:96
采纳率:0%
帮助的人:98.9万
展开全部
org是汇编器的伪指令,是告诉编译器下一条汇编语句的偏移地址
org 0000H #告诉汇编器这里偏移0
LJMP MAIN #跳转到main,这是要翻译为机器指令
ORG 0040H #告诉编译器这里偏移直接跳到40H
MAIN:MOV R1,#20H
===============
也就是说在ljmp指令在000处,而 main:mov指令在40H处,,,他们中间隔了一段没有的物理地址
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GUEL86
2011-10-21 · TA获得超过5856个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2735万
展开全部
ORG伪指令 上述程序可以2条都不用,因为程序简单,但一般程序中会有几个中断 有可能要用好几个ORG. 原因中断入口地址是固定的,如
ORG 0000H 可以省
LJMP MAIN 如果本条指令3字节 可以省下一条 ORG 0003H
ORG 0003H
LJMP INT0 如果本条指令8字节 可以省下一条 ORG 000BH
ORG 000BH
LJMP T0
ORG 0013H
LJMP INT1
ORG 001BH
LJMP T1
程序开始一般安排在 所有中断入口地址 后面 如ORG 0040H
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Ron2018
2010-05-22 · TA获得超过3285个赞
知道小有建树答主
回答量:338
采纳率:0%
帮助的人:500万
展开全部
org 2000h
是使下一条指令在内存中占用的单元的偏移地址是2000h
org 2013h依此类推

org伪指令告诉编译程序在将程序代码加载到内存时,按指定的立即数的值作为下一条指令的代码的偏移地址来分配内存空间

放在这里
是ajmp main指令的偏移地址为2000h
是ajmp int_ADC指令的偏移地址为2013h
它们不是紧挨着的
中间跳过了13h个字节的单元,至于中间13h个单元你想要放些什么数据或者代码,就得看你自己了,

根据你自己的设计,数据重叠的情况很可能会有的,编译器如何处理、会不会报错,就得编译来检查了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Natural_force
2010-05-22 · TA获得超过255个赞
知道答主
回答量:48
采纳率:0%
帮助的人:92.4万
展开全部
org 2000h
是使下一条指令在内存中占用的单元的偏移地址是2000h
org 2013h依此类推
main函数和中断函数Int_ADC是跳转到各自的函数区的。
其实加跳转,对于小程序来说看不出来什么,但是如果程序大了,是会对程序产生影响的。因为低位存储区有很多寄存器(组)以及栈等,程序代码太长会占用这些区域,对程序产生干扰。(而且编译器还不报错)
用跳转指令,可以跳转到数据区域,用户可以放心的使用,不用担心会产生干扰的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(8)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式