摘自AVR指令集手册:
-开始-
PUSH-推送堆栈注册 说明: 该指令将寄存器Rr的内容存储在堆栈中。在PUSH 之后,堆栈指针后减1。
操作: 堆栈←Rr
语法:操作数:程序计数器:堆栈: PUSH Rr 0≤r≤31 PC←PC +1 SP←SP-1
-结束-
如果我错了,请纠正我,据我了解,它将把寄存器Rr中的任何内容移动到堆栈中。 所以现在由于堆栈是凭据(SP←SP-1),是否意味着它正在向下增长?
此外,由于当前的程序计数器(递增之前)具有推送指令。这样做是为了转到下一条指令,所以我们增加了程序计数器(PC←PC +1)。我正确吗?
谢谢
答案 0 :(得分:1)
如果您想使用更多技术术语,可以说堆栈为empty descending。
Descending 表示堆栈指针递减, empty 表示堆栈指针指向堆栈上的下一个位置(因此为空位置)。
使堆栈向下增长,让我们将其放置在数据区域的远端。
当AVR为空降序时,x86为全降序,ARM具有所有四个组合,但通常用作全降序。
程序计数器注释之所以有用,是因为诸如cpse
(如果相等则跳过CompPare)或sbis
/ sbrc
/ sbrs
之类的指令会使程序计数器增加超过1(根据条件)。
通用AVR芯片的所有指令,但call
,jmp
,eicall
,eijmp
,icall
,ijmp
,ret
, reti
会增加程序计数器的值(rcall
和rjmp
还会向其添加一个常数,这可能会导致最终值降低)。
请注意,虽然AVR数据存储器字为8位,但指令存储器字为16位,程序计数器对字进行寻址。
这对于微控制器来说并不罕见,例如PIC的某些变体具有14位指令字。