定義
用數據定義偽指令分配的數據是按照順序一個一個存放在數據段中的,但有時候希望能夠控制數據的偏移地址,例如,使數據對齊可以加快數據的存取速度。而可以使用地址計數器和定位偽指令來控制數據的偏移地址。
地址計數器負責計數寫到
CGRAM、
DDRAM數據的地址,或從DDRAM、CGRAM讀出數據的地址。使用地址設定指令寫到IR
暫存器後,則地址數據會經過指令
解碼器,再存入AC。當MCU從DDRAM或CGRAM存取資料時,AC依照
MCU對LCM的操作而自動修改它的地址計數值。
另一方面,在彙編
源程式時,使用地址計數器保存正在彙編的指令在當前段內的偏移地址。當開始彙編或在每一段開始時,把地址計數器初始化為零,以後在彙編過程中,每處理一條指令,地址計數器就增加一個值,此值為該指令所需要的位元組數。當前地址計數器的值可用符號$表示,用戶可在程式中直接使用$,表示引用當前彙編地址計數器的值。$是一個數值常量,它可以出現在一切允許出現的位置。例如,利用$可以求當前位置與某變數之間的距離等。
地址
偏移地址
實模式下用
段地址和段內地址,即偏移地址的組合訪問
記憶體單元。所有實模式記憶體單元的地址都是由段地址加偏移地址組成。裝在
段暫存器內的段地址為任何64KB記憶體段的起始地址高16位,其低4位為0000。偏移地址用於在64KB記憶體段內選擇任一單元。偏移地址F000H是存儲單元到段起始地址的距離,稱為段內偏移地址,簡稱偏移地址。
邏輯地址
一個記憶體單元的地址由段地址和偏移地址兩部分組成,用冒號連線段地址和偏移地址,即段地址:偏移地址。像這樣的地址稱為
邏輯地址,此處的段地址仍然指的是段的起始地址的高16位。
物理地址
物理地址=段的起始地址+偏移地址=段地址×10H+偏移地址
有些定址方式將多個暫存器和一個偏移量組合構成偏移地址。這種情況下,這些值之和可能超過FFFFH。
當前地址計數器
任何時候在使用
存儲器時,先要給出存儲單元地址。彙編程式在彙編時給出一個隱含的地址計數器,用符號$表示地址計數器的當前值,地址計數器用來記錄正在被
彙編程式翻譯的指令目標代碼存放在當前段內的偏移量,也就是當前所使用的存儲單元的
偏移地址。因此,段內定義的所有標號和變數的偏移地址就是機制計數器的當前值。
AC用法舉例
程式框架
STR DB 'Hello world!'LENGTH EQU $-STR; /*給出字元串STR的長度*/...JMP $+8; /*輸出地址是JMP指令的首地址加上8*/
注意事項
(1)當$用在指令中時,它表示本條指令的第一個位元組的地址,這裡$+8必須是另一條指令的首地址,否則,彙編程式將指示出錯信息。
(2)當$用在
偽指令的參數欄位時,則和它用在指令中的情況不同,它所表示的是地址計數器的當前值。
設定當前AC的值
可使用定位偽指令ORG用來設定當前地址計數器的值。
格式1
ORG 數值表達式
此時直接將表達式的值送入地址計數器。
格式2
QRG $+數值表達式
此時,將ORG偽指令前,地址計數器的現行值$加上表達式的值後才送入地址計數器。
功能
定位偽指令ORG的功能是將數值表達式的值賦給地址計數器。數值表達式具體給出下一條指令或下一個數據的位置,它的值必須是0~65535之間的非負整數。
實例
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: ...