程序计数器保存下一个应该执行的指令的地址,而指令寄存器保存要执行的实际指令.他们中的其中一个不够吗?
这些寄存器中每一个的长度是多少?
谢谢.
在内核模式或其他模式下,可以直接读取Intel CPU上的程序计数器(即没有"技巧")吗?
我无法理解指令jal在MIPS处理器中的工作原理.我的两个问题是:
a)在"jal"之后存储在R31中的值是什么:PC + 4或PC + 8?
b)如果它真的是PC + 8,那么PC + 4上的指令会发生什么?它是在跳转之前执行还是从未执行过?
在Patterson和Hennessy(第四版),第113页:
"跳转和链接指令:跳转到并寻址并同时将下一条指令的地址保存在寄存器中的指令(MIPS中的$ ra)"
"程序计数器(PC):包含正在执行的程序中的指令地址的寄存器"
阅读完这两个陈述之后,$ ra中保存的值应为(PC + 4).
但是,在本书附带的MIPS参考数据(绿卡)中,jal指令的算法定义如下:
"跳转和链接:jal:J:R [31] = PC + 8; PC = JumpAddr"
该网站还声明"它真的是PC + 8 ",但奇怪的是,之后它说由于流水线是一个高级主题"我们假设返回地址是PC + 4 ".
我来自8086汇编,所以我知道返回地址和跟随地址之间存在很大差异,因为如果我假设某些事情并非如此,那么程序将无法工作.谢谢.
我正在阅读《 RISC-V读者:开放式体系结构图集》一书。为了解释ISA(指令集体系结构)与特定实现(即微体系结构)的隔离,作者写道:
架构师的诱惑是将说明包含在ISA中,以帮助在特定时间实现一种实现的性能或成本,但会给不同的或将来的实现带来负担。
据我了解,它指出,在设计ISA时,ISA应该理想地避免公开实现它的特定微体系结构的细节。
请牢记上面的引号:当涉及程序计数器时,在RISC-V ISA上,程序计数器(pc)指向当前正在执行的指令。另一方面,在x86 ISA上,程序计数器(eip)不包含当前正在执行的指令的地址,而是包含当前指令之后的指令的地址。
x86程序计数器是否从微体系结构中抽象出来了?
在我读到的关于 C++ 的第一本书中,它详细介绍了代码是如何在机器上实际执行的(它提到了程序计数器、调用堆栈、返回地址等)。我发现了解这些东西是如何工作的真的很有趣,尽管我知道没有必要了解计算机的工作原理来编写好的代码。
在这个问答网站上阅读相同的主题时,我发现它绝不是我以前学习的方式,因为我阅读的只是 C++ 的某个实现,这取决于某些计算机架构和特定的编译器。C++ 代码也可以在完全不同的东西上运行,只要有一个符合“正确”方式的编译器。标准和“抽象机器”的行为定义了正确的方法(我希望到目前为止我做对了)。
当然,我仍然想知道像内存的代码段或程序计数器这样的概念是否仍然在标准中“以某种方式”描绘,如果是,它们在多大程度上被描绘出来?抽象机中如何描述一个接一个执行的代码片段的概念?
由于有人在评论中询问我是否希望向我重复该标准:我无法很好地理解该标准,无法准确确定它对抽象机器的看法/或标准的哪些陈述可以被解释为关于“程序计数器”“代码存储”等抽象概念的陈述。所以是的,出于无能为力,我要求社区解释标准中的内容。这种解释的预期结果是仍然符合“抽象”标准的抽象机器内部结构的最详细概念。
在Visual Studio中,当您使用断点进行调试时,您可以通过将执行光标拖动到另一行来更改下一行代码.这可以让你跳过IF语句等.
我在想知道Delphi中是否有类似的功能,有人知道吗?
我一直在CPU窗口(Delphi 2006)中查看,但您似乎只能按顺序运行说明,而不是跳过它们.
我有一个使用STM32F103(ARM Cortex M3)的嵌入式项目,它在发布模式下偶尔会遇到硬故障.作为恢复的一部分,我想从硬故障之前检索PC值并将其存储起来以便稍后在电池备份区域中进行调试.
如何在硬故障点确定程序计数器的值?显然,PC现在设置在硬故障中断的位置.
我应该在哪里看?它有一个普通模式寄存器组的地址吗?
谢谢!
我想在MIPS上做回溯.然后,我面临一个问题:如何获得当前的PC寄存器值,因为它不属于32个普通寄存器..感谢您的建议..
链接地址是程序执行发生的地址,而加载地址是程序实际放置在内存中的地址。
现在我很困惑程序计数器的值是什么?是加载地址还是链接地址?
linker operating-system loader computer-architecture program-counter