AVR 汇编语言 - 堆栈指针问题
AVR Assembly language - Stack pointer question
来自 AVR 指令集手册:
-- 开始--
PUSH - 压栈寄存器
说明:
该指令将寄存器 Rr 的内容存储在堆栈中。堆栈指针在 PUSH 之后 post-减 1。
操作:
堆栈 ← Rr
语法:操作数:程序计数器:堆栈:
PUSH Rr 0 ≤ r ≤ 31 PC ← PC + 1 SP ← SP - 1
-- 结束--
如果我错了请纠正我,根据我的理解,它会将寄存器 Rr 中的任何内容移动到堆栈。 所以现在因为堆栈正在认证(SP ← SP - 1),这是否意味着它正在向下增长?
此外,由于当前程序计数器(递增之前)有 Push 指令。这是执行的所以我们想转到下一条指令,所以我们增加程序计数器(PC ← PC + 1)。我说的对吗?
谢谢
如果您想使用更专业的术语,您可以说堆栈是 empty descending。
Descending 表示堆栈指针递减,empty 表示堆栈指针指向堆栈中的下一个位置(因此为空位置)。
让堆栈向下增长让我们把它们放在数据区域的远端。
AVR是空降,x86是全降,ARM四种组合都有,但一般都是全降
程序计数器注释很有用,因为像 cpse
(ComPare Skip if Equal)或 sbis
/sbrc
/sbrs
这样的指令会将程序计数器递增多于 1(基于条件)。
通用AVR芯片除call
、jmp
、eicall
、eijmp
、icall
、ijmp
、ret
外的所有指令, reti
递增程序计数器(rcall
和 rjmp
还向其添加一个常量,这可能导致最终值较低)。
请注意,虽然 AVR 数据存储器字是 8 位,但指令存储器字是 16 位,程序计数器寻址字。
这对于微控制器来说并不罕见,例如 PIC 的一些变体有 14 位指令字。
来自 AVR 指令集手册:
-- 开始--
PUSH - 压栈寄存器 说明: 该指令将寄存器 Rr 的内容存储在堆栈中。堆栈指针在 PUSH 之后 post-减 1。
操作: 堆栈 ← Rr
语法:操作数:程序计数器:堆栈: PUSH Rr 0 ≤ r ≤ 31 PC ← PC + 1 SP ← SP - 1
-- 结束--
如果我错了请纠正我,根据我的理解,它会将寄存器 Rr 中的任何内容移动到堆栈。 所以现在因为堆栈正在认证(SP ← SP - 1),这是否意味着它正在向下增长?
此外,由于当前程序计数器(递增之前)有 Push 指令。这是执行的所以我们想转到下一条指令,所以我们增加程序计数器(PC ← PC + 1)。我说的对吗?
谢谢
如果您想使用更专业的术语,您可以说堆栈是 empty descending。
Descending 表示堆栈指针递减,empty 表示堆栈指针指向堆栈中的下一个位置(因此为空位置)。
让堆栈向下增长让我们把它们放在数据区域的远端。
AVR是空降,x86是全降,ARM四种组合都有,但一般都是全降
程序计数器注释很有用,因为像 cpse
(ComPare Skip if Equal)或 sbis
/sbrc
/sbrs
这样的指令会将程序计数器递增多于 1(基于条件)。
通用AVR芯片除call
、jmp
、eicall
、eijmp
、icall
、ijmp
、ret
外的所有指令, reti
递增程序计数器(rcall
和 rjmp
还向其添加一个常量,这可能导致最终值较低)。
请注意,虽然 AVR 数据存储器字是 8 位,但指令存储器字是 16 位,程序计数器寻址字。
这对于微控制器来说并不罕见,例如 PIC 的一些变体有 14 位指令字。