AVR汇编语言-堆栈指针问题

时间:2018-10-31 15:17:33

标签: assembly avr

摘自AVR指令集手册:

-开始-

PUSH-推送堆栈注册 说明: 该指令将寄存器Rr的内容存储在堆栈中。在PUSH 之后,堆栈指针后减1。

操作: 堆栈←Rr

语法:操作数:程序计数器:堆栈: PUSH Rr 0≤r≤31 PC←PC +1 SP←SP-1

-结束-

如果我错了,请纠正我,据我了解,它将把寄存器Rr中的任何内容移动到堆栈中。 所以现在由于堆栈是凭据(SP←SP-1),是否意味着它正在向下增长?

此外,由于当前的程序计数器(递增之前)具有推送指令。这样做是为了转到下一条指令,所以我们增加了程序计数器(PC←PC +1)。我正确吗?

谢谢

1 个答案:

答案 0 :(得分:1)

如果您想使用更多技术术语,可以说堆栈为empty descending
Descending 表示堆栈指针递减, empty 表示堆栈指针指向堆栈上的下一个位置(因此为空位置)。
使堆栈向下增长,让我们将其放置在数据区域的远端。
当AVR为空降序时,x86为全降序,ARM具有所有四个组合,但通常用作全降序。

程序计数器注释之所以有用,是因为诸如cpse(如果相等则跳过CompPare)或sbis / sbrc / sbrs之类的指令会使程序计数器增加超过1(根据条件)。
通用AVR芯片的所有指令,但calljmpeicalleijmpicallijmpretreti会增加程序计数器的值(rcallrjmp还会向其添加一个常数,这可能会导致最终值降低)。 请注意,虽然AVR数据存储器字为8位,但指令存储器字为16位,程序计数器对字进行寻址。
这对于微控制器来说并不罕见,例如PIC的某些变体具有14位指令字。