【问题标题】:AVR Byte StorageAVR 字节存储
【发布时间】:2019-02-19 18:06:04
【问题描述】:

嘿,我是 AVR 系列汇编编程的新手,但熟悉 PIC 等 uC。我现在感到困惑的是一些示例代码的以下摘录。

.dseg
.org 0x0100

RegA: .byte 1
RegB: .byte 1
RegC: .byte 1

....

对于 PIC 系列,您可以在定义标签后立即指定标签寄存器的地址。但是在 AVR 系列中,使用这种语法我不确定RegC 的存储位置。我知道 ATMega328P 上的 SRAM 是 16 位宽,所以这意味着 RegARegB 存储在 0x0100?结果堆栈指针自动递增并将RegC存储在地址0x0101

【问题讨论】:

  • 第一行真的是.desg而不是.dseg吗?你用什么工具链来编译这个?
  • @DavidGrayson 抱歉,错字和 avr-gcc 工具链

标签: assembly avr atmega


【解决方案1】:

看起来这段代码在数据存储器 (RAM) 中定义了三个单字节变量。

  • RegA 将存储在 0x0100(这是一个 byte 在 RAM 中的地址,而不是 16 位字或类似的东西)
  • RegB 将存储在 0x0101
  • RegC 将存储在 0x0102

如果您能够编译和链接此代码,您应该能够查看反汇编列表或映射文件来验证这一点。

【讨论】:

  • 我会尽快验证,但是编译器会自动增加地址吗? ATMega 328P 手册中是否有您可以指出我的地方或任何描述增量的手册?
  • 这里是 GNU 汇编器中.byte 的文档:sourceware.org/binutils/docs-2.32/as/Byte.html#Byte 它的文档不多,但我认为它很清楚它需要增加当前地址,否则就在那里采用多个表达式是没有意义的,因为每个表达式都会覆盖最后一个。
  • 它不会递增,.byte 列出一个项目的大小是一个字节,所以如果你说我有三个字节并且每个都有标签,那么第一个标签在 0x100 在这种情况下它是一个字节大小,所以下一件事是地址 0x101,大小为一个字节,依此类推。将其中一个更改为 .byte 1,7 并看到它现在消耗 2 个字节
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2019-10-02
  • 2019-02-21
相关资源
最近更新 更多