在语句中使用它们时,程序计数器的值是多少? (集会)

What's the value of program counter when use them in a statement? (Assembly)

目前我有一个小的(ARM Cortex M4)汇编程序,我有问题摘录如下:

PC    Instruction
0x9c  MOV    R0, #0
0x9e  LDR.N  R1, [PC, #0x20]
0xa0  STR.N  R0, [R1]

在第二行PC = 0x9e。但是,当访问 PC 作为操作数之一时,它有什么价值呢? 0x9e0xa0?

显示的 PC 值几乎肯定不是绝对值。它们通常相对于模块的开头。

不同版本的ARM有不同的PC读取行为。早期版本的值相当于 0x9e。更高版本具有相当大的 "lookahead",因此它们的值为 0xa0 或更大。也就是说,在对 PC 进行采样时,它已经进一步排序以获取下一条指令。 因为@Notlikethat 找到了 1985 年的参考资料,说它们都是 +8 高级.

所以第二个指令源操作数PC, #0x20将PC的值加32,但是PC的绝对地址(大致)是指令所在的位置,可以通过上面的数十亿字节重定位0x9e.