解释此指令集和Z-Register

时间:2015-04-23 20:28:39

标签: assembly avr

我不太了解以下代码。具体来说,带问号的两行有什么作用? seg_table<<1做了什么?

一般来说,z-register的目的是什么?

nc1_m:
    lpm r21, z
    ldi zh, high(seg_table<<1) <--?
    ldi zl, low(seg_table<<1)  <--?
    add zl, r20
    brcc nc2_m
    inc zh

seg_table:      
    .dw 0xeb09              ; 1, 0
    .dw 0xc185              ; 3, 2
    .dw 0x5163              ; 5, 4
    .dw 0xcb11              ; 7, 6
    .dw 0x4101              ; 9, 8 
    .dw 0x00ff              ; on, off

如果有帮助,我使用的微处理器是ATtiny48

1 个答案:

答案 0 :(得分:1)

document you linked描述了Z寄存器的用途:

32个寄存器中的6个可以用作3个16位间接地址寄存器&gt;数据指针 空间寻址 - 实现高效的地址计算。其中之一 地址指针 也可以用作Flash程序中查找表的地址指针 记忆。这些 添加的功能寄存器是16位X,Y和Z寄存器,如下所述 在本节后面。

X寄存器,Y寄存器和Z寄存器

寄存器R26:R31对其通用用途有一些附加功能。 这些寄存器 是用于间接寻址数据空间的16位地址指针。 [...]

在不同的寻址模式中,这些地址寄存器具有固定位移功能, 自动递增和自动递减(有关详细信息,请参阅指令集参考)。

代码示例的目的是在seg_table中将偏移量为R20的字节地址加载到Z寄存器中。您的示例示例不完整,示例代码将是从程序存储器中获取字节的LPM指令。

segtable的地址需要向左移位(相当于乘以2),因为汇编器/链接器将程序存储器视为字(16位)可寻址,而LPM指令按字节寻址程序存储器。换句话说,对于汇编程序,segtable的地址是从程序存储器的起始处以16位字测量的偏移量。对于LPM指令,Z寄存器中包含的值被解释为从程序存储器起始处以8位字节测量的偏移。要将segtable的地址转换为LPM可用的偏移量,需要乘以2。

如果不清楚,segtable中的值是7段LED显示屏的位掩码。