我不太了解以下代码。具体来说,带问号的两行有什么作用? 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
答案 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显示屏的位掩码。