【问题标题】:Explain This Instruction Set And Z-Register解释这个指令集和 Z 寄存器
【发布时间】:2015-04-23 20:28:39
【问题描述】:

我不太了解以下代码。具体来说,带问号的两行是做什么的? 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

【问题讨论】:

标签: assembly avr


【解决方案1】:

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

32个寄存器中的6个可用作三个16位间接地址寄存器>数据指针 空间寻址——实现高效的地址计算。其中之一 地址指针 也可用作 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 显示器的位掩码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    相关资源
    最近更新 更多