代码之家  ›  专栏  ›  技术社区  ›  user16401

平均asm标签*2

  •  3
  • user16401  · 技术社区  · 12 年前

    嗨,我是avr asm编程的新手,在 example 下面,我有几个问题:

    1) 标签是8位还是16位长?

    2) 为什么需要带2的乘法标签?

    3) 指令LPM将其结果放入寄存器R0?如果是这样,那与Z有什么关系?

    4) 你能解释一下所提供链接中引用的文字吗

    “如果地址不乘以2,并且标签位于字节地址0x60(字地址0x30),Z将指向存储在那里的代码。我希望这能澄清寻址问题。其他版本是”

    ldi ZL, low(2*label)
    ldi ZH, high(2*label)
    
    label:
    .db "Hello world", 0
    lpm
    

    谢谢

    2 回复  |  直到 12 年前
        1
  •  5
  •   Jester    12 年前
    1. 标签为16位。
    2. 因为汇编程序使用的是字地址,但是 LPM 需要字节地址。请注意,并不是所有的汇编程序都这样做,特别是 gas 由使用 avr-gcc ,没有。那么你就不需要乘法了。
    3. 是,的无操作数版本 线性调频 自动加载到 R0 ,并且它从 Z 。请参阅指令集参考。
    4. 这不是太清楚的LOL,但请参阅上面的#2。
        2
  •  2
  •   Haswell    12 年前

    它是这样的。按照下图操作。。图表对可视化有很大帮助。

    单词地址。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。字节地址

    |--(0d)---;--(0c)---|06                         |--------|06
    |--(0b)---;--(0a)---|05                         |--------|05                          
    |--(09)---;--(08)---|04                         |--------|04
    |--(07)---;--(06)---|03                         |--------|03
    |--(05)---;--(04)---|02                         |--------|02
    |--(03)---;--(02)---|01                         |--------|01
    |--(01)---;--(00)---|00                         |--------|00
    

    因此,您可以看到0x01字地址对应于0x02字节地址 0x04字地址将对应于0x08字节地址

    因此乘以2。假设您已将消息存储在位置。

    .org 0x0200
    message:
    .db "1234567890#"
    

    如果您正在使用avr studio,请检查程序内存部分。那么您会发现它存储在0x400中,而不是0x200中。

    推荐文章