关于定位操作的总结

       昨天在51单片机的课程上,老师说:

 单片机程序一般开头就是 ORG 0000H AJMP MAIN ORG 0030H
        这个ORG什么作用呢?可以让接下来的代码在ORG指定的地址运行。以前就有接触ORG,不过一直有一个误区,把它当做是能让程序直接拷贝到指定地址。其实不是,先让我们来看看“汇编金手指”对它的解释:

  定位伪操作 ORG
 
 格式: ORG<数值表达式>
 ----
 
 功能: 该指令把位置计数器的值设置成表达式的值.
 ----

把位置计数器置成后面的值,什么是位置计数器,是pc嘛?

不是,来看下面一段来自《微机》里的解释:


(1)指定起始位置伪指令


  格式:ORG 表达式


  其中,ORG(origin)是操作码,不可省略。表达式给出偏移地址值,即ORG语句后的指令或数据以表达式给出的值作为起始的偏移地址。表达式必须是一个可计算得到的正整数,数值范围在0~65 535之间。


  ORG伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。汇编程序汇编时把语句中表达式的值作为起始地址,连续存放ORG语句之后的程序和数据,直到出现一个新的ORG指令。若省略ORG语句,则从本段起始地址开始连续存放。


  在大多数情况下,不需要用ORG语句设置位置指针。由于段定义语句是段的起点,它的偏移地址为0000H,以后每分配一个字节,位置指针自动加1,所以每条指令都有确定的偏移地址。只有程序要求改变这个位置指针时,才需要安排ORG语句。通常ORG语句可以出现在程序中任何位置上。


【例4.21】


SDATA SEGMENT
ORG   0010H 
D1    DB 00H, 5AH, 80H, 24H
ORG   30H

D2    DW 4142H, 6162H, 0A0DH  
SDATA ENDS


  如果不设置ORG语句,字节变量D1的第一个元素00H的偏移地址为0000H,字变量D2的第一个元素4142H的偏移地址应为0004H。由于ORG的设置,D1的第一个元素00H的偏移地址为0010H,而D2的第一个元素4142H的偏移地址为0030H。 



(2)当前位置计数器


  在汇编程序对源程序进行汇编的过程中,使用地址计数器来保证当前正在汇编的指令地址。地址计数器值可用“$”来表示,汇编语言也允许用户直接用“$”来引用地址计数器的当前值,因此,ORG $+5可表示从当前地址开始跳过5个字节存储单元,在指令和伪指令中,也可直接用“$”表示地址计数器的当前值。


  例如: JGE $+8


  表明满足条件时要转移的地址是JGE指令的首地址加上8,指令中使用的“$”表示本指令中第一个字节的偏移地址。

 

好的,到这里我们就应该很清楚了,ORG是伪指令,只作用于编译阶段,它其实指定的是下一句程序在编译后的偏移地址。记住,是偏移地址。也就是说,它只能改变一句代码在程序中的相对位置。那在51单片机中呢?因为51没有分段的机制,所以这里的偏移地址,在程序烧进去以后,就相当于是物理地址。

你可能感兴趣的:(关于定位操作的总结)