【问题标题】:AVR Assembly language - Stack pointer questionAVR 汇编语言 - 堆栈指针问题
【发布时间】:2018-10-31 15:17:33
【问题描述】:

来自 AVR 指令集手册:

-- 开始--

PUSH - 将寄存器压入堆栈 说明: 该指令将寄存器 Rr 的内容存储在堆栈上。堆栈指针在 PUSH 之后后减 1。

操作: 堆栈←Rr

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

--结束--

如果我错了,请纠正我,据我了解,它会将寄存器 Rr 中的任何内容移动到堆栈中。 那么现在因为堆栈在进行凭证(SP ← SP - 1),是否意味着它正在向下增长?

另外,由于当前程序计数器(在递增之前)有推送指令。这是为了执行下一条指令,所以我们增加程序计数器(PC ← PC + 1 )。我说的对吗?

谢谢

【问题讨论】:

  • 是的,堆栈正在向下增长。是的,PC 增加了。

标签: assembly avr


【解决方案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外的所有指令都会增加程序计数器(@9876543534@和@9876 @ 还向其添加一个可能导致较低最终值的常量。
请注意,虽然 AVR 数据存储器字是 8 位,但指令存储器字是 16 位,程序计数器寻址字。
这对于微控制器来说并不少见,例如 PIC 的某些变体具有 14 位指令字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2012-04-05
    • 2013-05-17
    • 2018-04-28
    • 2011-07-08
    • 2011-02-13
    • 2014-12-10
    相关资源
    最近更新 更多