AVR XYZ 寄存器
AVR XYZ Registers
AVR 微控制器中的 X、Y 和 Z 寄存器有什么区别。他们每个人适合 C 编译器的是什么?编译器在哪里存储堆指针、堆栈指针、帧指针?该寄存器是否具有相同的功能或在不同空间(例如 EEPROM、RAM)中提供寻址。
X Y 和 Z 寄存器实际上是一对 r27:r26、r29:r28 和 r31:r30 寄存器。它们中的每一个都可以用作指向 SRAM 的间接指针:
ld r16, X
with post-increment, or pre-decrement:
ld r16, -Y
st Z+, r16
但是只有Y和Z可以配合位移使用
ldd r16, Y + 10
std Z + 5, r16
而且只有Z可以用来间接读取flash memory,不能预减或位移:
lpm r16, Z+
lpm r17, Z
因此,编译器应该如何使用它们以及应该存储哪些信息没有特定的方式。考虑到所有这些限制,它非常依赖于编译器。
比如Z适合用来访问flash memory,而Y适合用来存放stack frame,因为可以位移访问。
又例如,GCC 将 X 和 Z 寄存器用作 "preserved by the caller",而将 Y 寄存器用作 "preserved by the called routine"。此约定有助于最大限度地减少压栈操作,允许调用例程将 Y 分配为指针迭代器或堆栈帧,还允许被调用例程自由使用 X 和 Z 而无需花费时间来压栈和弹出它们。
但是同样,如何使用这些寄存器在很大程度上取决于编译器。没有强制它以这种或那种方式使用寄存器。
堆栈指针总是存储在SPH:SPLI/O寄存器(0x3E,0x3D)中,它们由内核本身处理,同时执行调用, returns,推动和弹出。编译器不需要将它存储在其他地方。
AVR 中没有 heap 这样的东西。因此,如果编译器以某种方式实现堆内存管理,则取决于堆分配位置和方式的实现。但是对于像AVR这样的小型MCU来说,通常根本没有存储堆的意义,因为不需要动态分配。
AVR 微控制器中的 X、Y 和 Z 寄存器有什么区别。他们每个人适合 C 编译器的是什么?编译器在哪里存储堆指针、堆栈指针、帧指针?该寄存器是否具有相同的功能或在不同空间(例如 EEPROM、RAM)中提供寻址。
X Y 和 Z 寄存器实际上是一对 r27:r26、r29:r28 和 r31:r30 寄存器。它们中的每一个都可以用作指向 SRAM 的间接指针:
ld r16, X
with post-increment, or pre-decrement:
ld r16, -Y
st Z+, r16
但是只有Y和Z可以配合位移使用
ldd r16, Y + 10
std Z + 5, r16
而且只有Z可以用来间接读取flash memory,不能预减或位移:
lpm r16, Z+
lpm r17, Z
因此,编译器应该如何使用它们以及应该存储哪些信息没有特定的方式。考虑到所有这些限制,它非常依赖于编译器。 比如Z适合用来访问flash memory,而Y适合用来存放stack frame,因为可以位移访问。 又例如,GCC 将 X 和 Z 寄存器用作 "preserved by the caller",而将 Y 寄存器用作 "preserved by the called routine"。此约定有助于最大限度地减少压栈操作,允许调用例程将 Y 分配为指针迭代器或堆栈帧,还允许被调用例程自由使用 X 和 Z 而无需花费时间来压栈和弹出它们。 但是同样,如何使用这些寄存器在很大程度上取决于编译器。没有强制它以这种或那种方式使用寄存器。
堆栈指针总是存储在SPH:SPLI/O寄存器(0x3E,0x3D)中,它们由内核本身处理,同时执行调用, returns,推动和弹出。编译器不需要将它存储在其他地方。
AVR 中没有 heap 这样的东西。因此,如果编译器以某种方式实现堆内存管理,则取决于堆分配位置和方式的实现。但是对于像AVR这样的小型MCU来说,通常根本没有存储堆的意义,因为不需要动态分配。