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字节,就会出问题了。
org 2000h
是使下一条指令在内存中占用的单元的偏移地址是2000h
org 2013h依此类推
main函数和中断函数Int_ADC是跳转到各自的函数区的。
其实加跳转,对于小程序来说看不出来什么,但是如果程序大了,是会对程序产生影响的。因为低位存储区有很多寄存器(组)以及栈等,程序代码太长会占用这些区域,对程序产生干扰。(而且编译器还不报错)
用跳转指令,可以跳转到数据区域,用户可以放心的使用,不用担心会产生干扰的。
org是汇编器的伪指令,是告诉编译器下一条汇编语句的偏移地址。
org 0000H #告诉汇编器这里偏移0
LJMP MAIN #跳转到main,这是要翻译为机器指令
ORG 0040H #告诉编译器这里偏移直接跳到40H
MAIN:MOV R1,#20H
org是汇编器的伪指令,是告诉编译器下一条汇编语句的偏移地址
org
0000H
#告诉汇编器这里偏移0
LJMP
MAIN
#跳转到main,这是要翻译为机器指令
ORG
0040H
#告诉编译器这里偏移直接跳到40H
MAIN:MOV
R1,#20H
===============
也就是说在ljmp指令在000处,而
main:mov指令在40H处,,,他们中间隔了一段没有的物理地址
org伪指令用来确定随后的指令或数据的起始偏移地址。
如:
org 100h----通常用来确定com文件的第一条指令的起始地址。