关于汇编语言的ORG伪指令

2024-11-30 14:21:19
推荐回答(5个)
回答1:

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字节,就会出问题了。

回答2:

org是汇编器的伪指令,是告诉编译器下一条汇编语句的偏移地址
org 0000H #告诉汇编器这里偏移0
LJMP MAIN #跳转到main,这是要翻译为机器指令
ORG 0040H #告诉编译器这里偏移直接跳到40H
MAIN:MOV R1,#20H
===============
也就是说在ljmp指令在000处,而 main:mov指令在40H处,,,他们中间隔了一段没有的物理地址

回答3:

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

回答4:

org 2000h
是使下一条指令在内存中占用的单元的偏移地址是2000h
org 2013h依此类推

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

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

根据你自己的设计,数据重叠的情况很可能会有的,编译器如何处理、会不会报错,就得编译来检查了。

回答5:

org 2000h
是使下一条指令在内存中占用的单元的偏移地址是2000h
org 2013h依此类推
main函数和中断函数Int_ADC是跳转到各自的函数区的。
其实加跳转,对于小程序来说看不出来什么,但是如果程序大了,是会对程序产生影响的。因为低位存储区有很多寄存器(组)以及栈等,程序代码太长会占用这些区域,对程序产生干扰。(而且编译器还不报错)
用跳转指令,可以跳转到数据区域,用户可以放心的使用,不用担心会产生干扰的。