定义
用数据定义伪指令分配的数据是按照顺序一个一个存放在数据段中的,但有时候希望能够控制数据的偏移地址,例如,使数据对齐可以加快数据的存取速度。而可以使用地址计数器和定位伪指令来控制数据的偏移地址。
地址计数器负责计数写到CGRAM、DDRAM数据的地址,或从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用来设置当前地址计数器的值。
格式1ORG 数值表达式
此时直接将表达式的值送入地址计数器。
格式2QRG $+数值表达式
此时,将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: ...