Assembly 字节存储器

Assembly 字节存储器,assembly,avr,atmega,Assembly,Avr,Atmega,嘿,我是AVR系列汇编编程新手,但熟悉uC,比如PIC。我现在感到困惑的是以下一些示例代码的摘录 .dseg .org 0x0100 RegA: .byte 1 RegB: .byte 1 RegC: .byte 1 .... 对于PIC系列,您可以在定义标签后立即指定带标签寄存器的地址。然而,在AVR系列中,使用这种语法,我不确定RegC存储在哪里。据我所知,ATMega328P上的SRAM为16位宽,因此这意味着RegA和RegB存储在0x0100?因此,堆栈指针会自动递增并将RegC

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

.dseg
.org 0x0100

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

....

对于PIC系列,您可以在定义标签后立即指定带标签寄存器的地址。然而,在AVR系列中,使用这种语法,我不确定
RegC
存储在哪里。据我所知,ATMega328P上的SRAM为16位宽,因此这意味着
RegA
RegB
存储在
0x0100
?因此,堆栈指针会自动递增并将RegC存储在地址
0x0101

中。看起来,该代码在数据内存(RAM)中定义了三个单字节变量

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

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

第一行是否真的是
.desg
,而不是
.dseg
?你用什么工具链来编译这个?@DavidGrayson对不起,输入错误和avr gcc工具链我会尽快验证,但是编译器会自动增加地址吗?在ATMega 328P手册中有什么地方你可以指给我或者任何描述增量的手册吗?这是GNU汇编程序中
.byte
的文档:没有太多文档,但我认为很明显它需要增加当前地址,否则就没有必要使用多个表达式,因为每个表达式都会覆盖最后一个表达式。它不是递增的。列出一项的字节大小为一个字节,如果你说我有三个字节,每个都有标签,那么第一个标签在0x100,在这种情况下,它的大小是一个字节,所以下一个是地址0x101,大小是一个字节,以此类推。将其中一个更改为.byte 1,7,并查看它现在消耗2个字节