Pointers 使用avr编译汇编程序

Pointers 使用avr编译汇编程序,pointers,avr,stack-pointer,Pointers,Avr,Stack Pointer,为什么在AVR汇编编程的程序开始时需要初始化堆栈指针 非常简单,答案直接来自数据表-查找堆栈指针。堆栈指针初始值为0x0000,这意味着如果未初始化,它将指向寄存器R0(地址为0x0000)。您可能不希望这样,因为您使用R0和其他寄存器来执行操作。这就是为什么要将堆栈设置为其他内存区域,特别是内部SRAM(通用RAM区域)。您的汇编程序正在调用一个子例程。当您这样做时,返回地址使用堆栈指针存储在堆栈上,因此初始化它以指向RAM中的适当位置很重要。报告说: 在中断和子程序调用期间,返回地址程序计数

为什么在AVR汇编编程的程序开始时需要初始化堆栈指针


非常简单,答案直接来自数据表-查找堆栈指针。堆栈指针初始值为0x0000,这意味着如果未初始化,它将指向寄存器R0(地址为0x0000)。您可能不希望这样,因为您使用R0和其他寄存器来执行操作。这就是为什么要将堆栈设置为其他内存区域,特别是内部SRAM(通用RAM区域)。

您的汇编程序正在调用一个子例程。当您这样做时,返回地址使用堆栈指针存储在堆栈上,因此初始化它以指向RAM中的适当位置很重要。报告说:

在中断和子程序调用期间,返回地址程序计数器(PC)存储在堆栈上。这个 堆栈在通用数据SRAM中有效分配,因此堆栈大小仅受 SRAM的总大小和使用情况。所有用户程序都必须在重置例程中初始化SP (在执行子程序或中断之前)。堆栈指针(SP)可以在I/O空间中进行读/写访问。 数据SRAM可以通过AVR支持的五种不同寻址模式轻松访问 建筑


这取决于您使用的微控制器。较旧的AVR的堆栈指针由硬件初始化为0x0000。在使用子程序或中断之前,您必须将其更改为合理的(通常是
RAMEND
)。较新的AVR的堆栈指针由硬件初始化为
RAMEND
,因此不需要软件初始化


您必须检查数据表,以查看您的特定MCU是否需要该软件初始化。在有疑问的地方,无论如何都要这样做:它不会造成伤害(只需要4CPU周期),而且它可以使您的代码更具可移植性。此外,引导加载程序可能更改了堆栈指针。

我很困惑,什么链接?