複製鏈接
請複製以下鏈接發送給好友

地址計數器

鎖定
在彙編源程序時,使用地址計數器保存正在彙編的指令在當前段內的偏移地址,用户可以用$來引用地址計數器的值。$是一個數值常量,它可以出現在一切允許出現的位置。例如,利用$可以求當前位置與某變量之間的距離等。
中文名
地址計數器
外文名
Address Counter
簡    稱
AC
作    用
保存指令在當前段內的偏移地址
符號表示
$
用    法
用户可在程序中直接使用$
類    型
計算機術語

地址計數器定義

用數據定義偽指令分配的數據是按照順序一個一個存放在數據段中的,但有時候希望能夠控制數據的偏移地址,例如,使數據對齊可以加快數據的存取速度。而可以使用地址計數器和定位偽指令來控制數據的偏移地址。
地址計數器負責計數寫到CGRAMDDRAM數據的地址,或從DDRAM、CGRAM讀出數據的地址。使用地址設定指令寫到IR寄存器後,則地址數據會經過指令解碼器,再存入AC。當MCU從DDRAM或CGRAM存取資料時,AC依照MCU對LCM的操作而自動修改它的地址計數值。 [1] 
另一方面,在彙編源程序時,使用地址計數器保存正在彙編的指令在當前段內的偏移地址。當開始彙編或在每一段開始時,把地址計數器初始化為零,以後在彙編過程中,每處理一條指令,地址計數器就增加一個值,此值為該指令所需要的字節數。當前地址計數器的值可用符號$表示,用户可在程序中直接使用$,表示引用當前彙編地址計數器的值。$是一個數值常量,它可以出現在一切允許出現的位置。例如,利用$可以求當前位置與某變量之間的距離等。 [2] 

地址計數器地址

地址計數器偏移地址

實模式下用段地址和段內地址,即偏移地址的組合訪問內存單元。所有實模式內存單元的地址都是由段地址加偏移地址組成。裝在段寄存器內的段地址為任何64KB內存段的起始地址高16位,其低4位為0000。偏移地址用於在64KB內存段內選擇任一單元。偏移地址F000H是存儲單元到段起始地址的距離,稱為段內偏移地址,簡稱偏移地址。 [3] 

地址計數器邏輯地址

一個內存單元的地址由段地址和偏移地址兩部分組成,用冒號連接段地址和偏移地址,即段地址:偏移地址。像這樣的地址稱為邏輯地址,此處的段地址仍然指的是段的起始地址的高16位。 [3] 

地址計數器物理地址

內存的實際地址,或稱物理地址為:
物理地址=段的起始地址+偏移地址=段地址×10H+偏移地址
有些尋址方式將多個寄存器和一個偏移量組合構成偏移地址。這種情況下,這些值之和可能超過FFFFH。 [3] 

地址計數器當前地址計數器

任何時候在使用存儲器時,先要給出存儲單元地址。彙編程序在彙編時給出一個隱含的地址計數器,用符號$表示地址計數器的當前值,地址計數器用來記錄正在被彙編程序翻譯的指令目標代碼存放在當前段內的偏移量,也就是當前所使用的存儲單元的偏移地址。因此,段內定義的所有標號和變量的偏移地址就是機制計數器的當前值。 [4] 

地址計數器AC用法舉例

地址計數器程序框架

STR    DB 'Hello world!'

LENGTH   EQU $-STR;            /*給出字符串STR的長度*/

...

JMP    $+8;               /*輸出地址是JMP指令的首地址加上8*/

地址計數器注意事項

(1)當$用在指令中時,它表示本條指令的第一個字節的地址,這裏$+8必須是另一條指令的首地址,否則,彙編程序將指示出錯信息。
(2)當$用在偽指令的參數字段時,則和它用在指令中的情況不同,它所表示的是地址計數器的當前值。 [2] 

地址計數器設置當前AC的值

可使用定位偽指令ORG用來設置當前地址計數器的值。

地址計數器格式1

ORG 數值表達式
此時直接將表達式的值送入地址計數器。

地址計數器格式2

QRG $+數值表達式
此時,將ORG偽指令前,地址計數器的現行值$加上表達式的值後才送入地址計數器。

地址計數器功能

定位偽指令ORG的功能是將數值表達式的值賦給地址計數器。數值表達式具體給出下一條指令或下一個數據的位置,它的值必須是0~65535之間的非負整數。 [2] 

地址計數器實例

DATA SEGMENT
       
      ORG  10;              /*置$的值為10*/
     
      VAR1 DW 100H,200H;         /*VAR1的偏移地址為0AH*/
     
      ORG  $+5;             /*置$的值為14+5,即為19*/
     
      VAR2 DB 1,2,$+1,$+2;       /*$的值為23,N的值為23-19=4*/

DATA  ENDS

...

ORG   100H     /*$的值為100H,使其後面的指令從偏移地址100H處開始存放*/


START:   ...



參考資料
  • 1.    周興華編著.手把手教你學單片機 .北京:北京航空航天大學出版社 ,2007:209-209
  • 2.    馬興錄,宋廷強,曲英傑編著.32位微機原理與應用 .北京:清華大學出版社,2015:115-116
  • 3.    郭蘭英,趙祥模編著.微機原理與接口技術 Win彙編、接口及設備驅動.北京:清華大學出版社,2015:14-16
  • 4.    馬爭主編.微計算機與單片機原理及應用.北京:高等教育出版社,2009:119-120