48

ARM ICによると。

ARM 状態では、PC の値は現在の命令のアドレスに 8 バイトを加えたものです。

Thumb 状態:

  • B、BL、CBNZ、および CBZ 命令の場合、PC の値は、現在の命令のアドレスに 4 バイトを加えたものです。
  • ラベルを使用する他のすべての命令の場合、PC の値は、現在の命令のアドレスに 4 バイトを加えたものであり、結果のビット [1] が 0 にクリアされてワード境界に揃えられます。

簡単に言えば、PC レジスタの値は、次の命令の次の命令を指します。これは私が得られないものです。通常 (特に x86 では) プログラム カウンター レジスタは、次に実行する命令のアドレスを指すために使用されます。

では、その根拠となる根拠は何だろうか。条件付き実行、多分?

4

2 に答える 2

2

それは本当だ...

一例を以下に示します: C プログラム:

int f,g,y;//global variables
int sum(int a, int b){
     return (a+b);
}
int main(void){
    f = 2;
    g = 3;
    y = sum(f, g);
    return y;
}

アセンブリにコンパイル:

    00008390 <sum>:
int sum(int a, int b) {
return (a + b);
}
    8390: e0800001 add r0, r0, r1
    8394: e12fff1e bx lr
    00008398 <main>:
int f, g, y; // global variables
int sum(int a, int b);
int main(void) {
    8398: e92d4008 push {r3, lr}
f = 2;
    839c: e3a00002 mov r0, #2
    83a0: e59f301c ldr r3, [pc, #28] ; 83c4 <main+0x2c> 
    83a4: e5830000 str r0, [r3]
g = 3;
    83a8: e3a01003 mov r1, #3
    83ac: e59f3014 ldr r3, [pc, #20] ; 83c8 <main+0x30>
    83b0: e5831000 str r1, [r3]
y = sum(f,g);
    83b4: ebfffff5 bl 8390 <sum>
    83b8: e59f300c ldr r3, [pc, #12] ; 83cc <main+0x34>
    83bc: e5830000 str r0, [r3]
return y;
}
83c0: e8bd8008 pop {r3, pc}
83c4: 00010570 .word 0x00010570
83c8: 00010574 .word 0x00010574
83cc: 00010578 .word 0x00010578

上記の LDR の PC 値を参照してください。ここでは、変数 f、g、y のアドレスを r3 にロードするために使用されます。

    83a0: e59f301c ldr r3, [pc, #28];83c4 main+0x2c
    PC=0x83c4-28=0x83a8-0x1C = 0x83a8

PC の値は、現在実行中の命令の次の次の命令です。ARM は 32 ビット命令を使用しますが、バイト アドレスを使用しているため、+ 8 は 8 バイト、2 命令の長さを意味します。

ARM Archi の 5 段階のパイプラインフェッチ、デコード、実行、メモリ、ライトバックを添付

ARM の 5 ステージ パイプライン

PC レジスタは各クロックで 4 ずつ追加されるため、命令がバブリングして実行されたとき、つまり現在の命令では、PC レジスタはすでに 2 クロック経過しています。これは実際には、PC は「フェッチ」命令を指し、現在の命令は「実行」命令を意味するため、PC は次に実行される命令を意味します。

ところで:写真はHarrisのDigital Design and Computer Architecture ARM Editionの本からのものです

于 2018-04-10T10:41:45.930 に答える