AVR XYZ寄存器

Kuz*_*S.A 0 compiler-construction ram microcontroller avr

AVR微控制器中的Beatwean X,Y和Z寄存器有什么区别。它们每个适合C编译器?编译器在哪里存储堆指针,堆栈指针,帧指针?该寄存器是否具有相同的功能或在不同的空间(例如EEPROM,RAM)中提供寻址。

Ate*_*Lux 5

XY和Z寄存器实际上是r27:r26,r29:r28和r31:r30寄存器对。它们每个都可用作指向SRAM的间接指针:

ld r16, X
Run Code Online (Sandbox Code Playgroud)

后增加或前减少:

ld r16, -Y
st Z+, r16
Run Code Online (Sandbox Code Playgroud)

但是只有Y和Z可以在位移下使用

ldd r16, Y + 10
std Z + 5, r16
Run Code Online (Sandbox Code Playgroud)

并且只能使用Z来间接读取闪存,并且不存在预减量或位移量:

lpm r16, Z+
lpm r17, Z
Run Code Online (Sandbox Code Playgroud)

因此,没有特别的方式可以使编译器使用它们,以及应该存储哪些信息。考虑所有这些限制,这在很大程度上取决于编译器。例如,Z可以保留以访问闪存,而Y可以存储堆栈帧,因为可以通过位移来访问它。同样,例如,GCC将X和Z寄存器用作“由调用方保留”,而Y寄存器用作“由被调用程序保留”。此约定有助于最大程度地减少推送操作,从而允许调用程序将Y分配为指针迭代器或堆栈框架,还允许被调用的例程自由使用X和Z,而无需花费时间来推送和弹出它们。但是同样,如何使用这些寄存器在很大程度上取决于编译器。没有什么可以强迫它以一种或另一种方式使用寄存器。

堆栈指针总是存储在SPH:SPL I / O寄存器(0x3E的,的0x3D)它们由核心本身处理,在执行调用或返回,压入和弹出。编译器无需将其存储在其他位置。

AVR中没有。因此,如果编译器以某种方式实现堆内存管理,则取决于实现在何处以及如何分配堆。但是说到像AVR这样的小型MCU,通常根本没有意义存储堆,因为不需要动态分配。