问题标签 [program-counter]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
eclipse - 在没有可用调试信息或程序代码之外的地址“0xXXXXXX”处中断
配置:
使用 Nucleo-L476RG。使用 GNU ARM Eclipse。我从 STM32CubeMX 生成了一个极简代码。我已经在我的板载 ST-Link 中刷新了 J-link 驱动程序。
一直在尝试为我的代码运行调试器,但我的程序计数器未设置为 main()。相反,它无法读取某个内存地址。错误“在地址“0xXXXXXXXX”中断,没有可用的调试信息,或在程序代码之外。” 出现。
我已经包含了屏幕截图和调试器日志,我们可以在其中看到错误。
请帮忙
图片:
https ://ibb.co/bBRHxn https://ibb.co/mGDKA7 https://ibb.co/mE4gOS https://ibb.co/fh5AHn https://ibb.co/jNFMOS https:// /ibb.co/ibmT3S https://ibb.co/gpJaiS https://ibb.co/jgaMOS
日志:
kernel-mode - 陷阱指令:为什么必须原子地改变程序计数器和处理器状态寄存器?
我在操作系统课上的一次考试中遇到了以下问题。
考虑一个架构,其中 TRAP 指令有两个效果:加载包含用户/内核模式位的处理器状态寄存器 (PCR) 的预定义值,将程序计数器 (PC) 的值保存到特殊的 Save PC注册并将预定义的值加载到 PC 中。解释为什么在同一指令周期内不改变 PC 就为 PCR 加载一个新值是不安全的。
我知道 PCR 将设置为内核模式,内存管理关闭。是否因为 PC 仍在用户程序中而不安全?如果是这样,哪里会出错?如果不是,为什么不安全?为什么先换电脑也不安全?
arm - 堆栈指针和程序计数器有什么区别?
众所周知,微处理器执行任务的过程只是从内存中逐条执行二进制指令,并且有一个程序计数器保存下一条指令的地址。因此,如果我没记错的话,这就是处理器执行其任务的方式。但是还有另一个名为 Stack Pointer 的指针,它的作用与程序计数器几乎相同。我的问题是为什么我们需要一个堆栈指针来指向内存(堆栈)的地址?有人可以告诉我堆栈指针和程序计数器之间的主要区别吗?
assembly - 如何在没有 0x00 或 0xFF 字节的情况下获取 x86_64 中的指令指针?
有没有一种方法可以访问指令指针 (RIP) 中的值,而无需在汇编语言中使用 acall
后跟 a ?pop
还是有可以做到的机器码操作码?
我一直在谷歌搜索没有明确的结果。
我的问题是机器代码中不能有任何零,否则我会收到 SIGSEGV 错误。这是由于服务器加载代码并从一串字节执行它的方式。近距离调用与子程序的距离为零,因此不能选择使用调用。
我在 linux 上,64 位,并且有 nasm 和 yasm。
assembly - 在汇编的情况下,编程模型与程序计数器和堆栈指针之间的区别是什么?
处理器型号 I
处理器型号 II
上述两张幻灯片是在 x86/MIPS 讲座期间展示的。我没太明白。
我唯一理解的是,有两种使用堆栈调用函数的模型,以及分配/释放堆。一个使用PC,另一个使用SP。
它是在谈论两个不同处理器(x86/MIPS)的模型吗?哪个是给谁的?
任何人都可以解释一下吗?
x86 - fetch完成后PC寄存器指向什么?
fetch完成后PC寄存器指向什么?
是要执行的下一条指令的地址,还是别的什么?
x86 - 从微体系结构中抽象出来的 x86 程序计数器?
我正在阅读《RISC-V 读者:开放架构图集》一书。为了解释 ISA(指令集架构)与特定实现(即微架构)的隔离,作者写道:
架构师的诱惑是在 ISA 中包含指令,这些指令有助于在特定时间提高一个实现的性能或成本,但会给不同的或未来的实现带来负担。
据我了解,它指出在设计 ISA 时,ISA 应该避免暴露实现它的特定微架构的细节。
记住上面的引用:当谈到程序计数器时,在 RISC-V ISA 上,程序计数器 ( pc
) 指向当前正在执行的指令。另一方面,在 x86 ISA 上,程序计数器 ( eip
) 不包含当前正在执行的指令的地址,而是包含当前指令之后的指令的地址。
x86 程序计数器是从微架构中抽象出来的吗?
c++ - 为什么我们在这里将 0 添加到双 void 指针?
对于上下文,这是从应该引导到主应用程序的引导加载程序调用的代码。此片段来自一个函数,该函数带有一个参数,该参数uintptr_t address
指定了主应用程序的写入地址。我相信sp
和pc
分别是堆栈指针和程序计数器。
这是代码:
完整的上下文在这里
然后我去打印了地址、sp和pc,发现如下:
这让我很困惑。我不确定为什么这sp
条线有一个+ 0
。该sp
行是否可以重写为:
并做同样的事情?
我的理解是该地址已被静态转换为双空指针,然后sp
被赋予地址的取消引用值(0x08010000),pc
并被赋予地址的取消引用值(0x08010001)。然后,在我的 printf 语句中,显示的这些值是这些地址的取消引用值。
我的理解在这里正确吗?
assembly - 执行 ADDS PC, #-4 时会发生什么?无限循环?
所以我试图在特殊的上下文中为 Arm 指令编写一个模拟器,我想了解 Arm 处理器中程序计数器的完整行为。规格有以下声明
程序计数器 (PC) 作为 PC(或 R15)访问。它以所执行指令的大小递增(在 ARM 状态下始终为 4 个字节)。分支指令将目标地址加载到 PC 中。您也可以使用数据处理指令直接加载 PC。例如,要跳转到通用寄存器中的地址,使用: MOV PC, R0 在执行期间,PC 不包含当前执行指令的地址。当前执行指令的地址通常是 ARM 的 PC-8 或 Thumb 的 PC-4。
由此,我了解到当执行 ADDS PC 时,#-4 PC 将处于 +4 或 +8,所以如果它处于 +4,程序会进入无限循环吗?
assembly - Mips 参考表上的“PC”
我正在练习根据 Mips 参考表将 Mips 指令(beq $t5, $s0, loop)转换为二进制,并且有一系列指令(PC=PC + 4 + 分支地址)用于计算“I”类型指令,它一直引用“PC”。
PC指的是什么?似乎我应该寻找“循环”标签存储在内存中的位置 - :特别是找到那个内存地址。