我知道这个问题看起来非常通用,因为它可能取决于平台,
但是我理解过程/函数调用,用于在堆栈上推送返回地址的汇编代码和局部变量等可以是调用函数或被调用函数的一部分。
当发生硬件异常或中断时,程序计数器将通过异常表获取异常处理程序的地址,但是存储状态,返回地址等的实际代码在哪里。或者这是在中断和异常的硬件级别?
提前致谢
答案 0 :(得分:2)
既然你在询问手臂和你标记的微控制器,你可能会谈论arm7tdmi,但可能正在讨论其中一个cortex-ms。这些工作与全尺寸手臂架构不同。如同与这些内核相关的架构参考手册(armv6-m或armv7-m,取决于内核)中所记录的,它记录了硬件符合ABI,以及中断的内容。因此psr的寄存器地址和寄存器0到4加上其他一些都被放在堆栈上,这对于架构来说是不寻常的。 R14而不是获取返回地址得到一个特定模式的无效地址,这是所有体系结构的一部分,不像其他处理器ip,地址空间上的cortex-ms鼓励或由arm指示,这就是为什么你看到ram开始于0x20000000通常在这些和闪存上小于,有一些例外,他们将ram置于“可执行”范围,当真正修改哈佛时假装是哈佛。这有助于0xFFFxxxxx链接寄存器返回地址,具体取决于他们yada yada在返回地址上的手册,或者他们会详细说明您找到的模式的含义。
同样地,向量表中的地址拼写出类似于前16个是系统/臂异常然后中断之后的中断,其中可能有多达128或256个可能的中断,但你必须看看芯片供应商(没有武器的文件,以了解他们暴露了多少以及与什么有关。如果你没有使用那些中断,你不必在你的闪存中留下一个巨大的漏洞用于向量,只需使用该闪存进行你的程序(只要你确保你永远不会解雇该异常或中断)。
答案 1 :(得分:1)
对于在程序中定义良好(同步)位置发生的函数调用,编译器生成可执行指令以管理返回地址,寄存器和局部变量。这些说明与功能代码集成在一起。详细信息是硬件和编译器特定的。
对于可能在程序中的任何位置(异步)发生的硬件异常或中断,管理返回地址和寄存器都是在硬件中完成的。细节是特定于硬件的。
考虑在程序执行期间的任何时刻如何发生硬件异常/中断。然后考虑如果硬件异常/中断需要集成到可执行代码中的特殊指令,则必须在整个程序中的所有地方重复这些特殊指令。这没有意义。硬件异常/中断管理由硬件处理。
答案 2 :(得分:0)
“代码”根本不是软件;根据定义,CPU必须在内部自行完成,因为中断是异步发生的。 (或者对于由执行指令引起的同步异常,那么该指令的内部处理就是有效触发它的原因。)
因此,CPU内部的微码或硬连线逻辑会在异常上生成返回地址的存储,并执行架构定义为执行异常/中断的任何其他内容
在执行call
指令时,代码所在的位置可以推送返回地址,在x86上,例如the call
instruction pushes return info onto the stack而不是覆盖链接寄存器(大多数RISC执行的方式)