33

それで、質問が述べているように、Intelの8086のCSとIPレジスタの目的は何ですか

私はこの説明を見つけました:

コード セグメント (CS) は、プロセッサ命令を含む 64 KB セグメントのアドレスを含む 16 ビット レジスタです。プロセッサーは、命令ポインター (IP) レジスターによって参照される命令へのすべてのアクセスに CS セグメントを使用します。CS レジスタを直接変更することはできません。CS レジスタは、ファー ジャンプ、ファー コール、ファー リターン命令中に自動的に更新されます。

そしてこれはIPの場合:

命令ポインタ (IP) は 16 ビットのレジスタです。

これが基本的に何を意味するのかよくわからないので、誰かがより「鮮やかな」説明を提供できれば、それは素晴らしいことです:)

4

6 に答える 6

25

命令ポインター (IP) は 16 ビットであるため、64k の命令 (2^16) しか使用できないことを意味します。したがって、アドレス空間を拡張するために、64k ブロックをアドレス指定する 2 つ目のレジスタがあります。まとめて、2 ^ 32バイトをアドレス指定できる1つの32ビットレジスタと見なすことができcs:ipます...つまり、32ビットアドレスを使用するプロセッサで得られる4Gです。8086 は 20 ビットのアドレスを使用していたので、1M のメモリにアクセスできました。

于 2013-07-22T01:53:50.813 に答える
19

次に実行される命令は、次のメモリ アドレスにある命令です。

16 * CS + IP

これにより、レジスタが 16 ビット幅しかないにもかかわらず、20 ビットのメモリをアドレス指定できます (また、ほとんどのアドレスをエンコードする 2 つの異なる方法が作成されます)。

CS の効果は、他のセグメント レジスタの効果と類似しています。たとえば、DSデータ アクセス (別のセグメント レジスタを指定しない) を だけインクリメントします16 * DS

CS

CS を変更する命令は次のとおりです。

  • ljmp (ファージャンプ)
  • ipとcs をスタックにプッシュしてから far jump する lcall (far call)
  • lref (far return)、far 呼び出しを逆にします
  • 割り込みベクタ テーブルから IP / CS を読み取る int
  • int を反転する iret

movCS は、他のセグメント レジスタのように変更することはできません。CSの標準識別子でエンコードしようとしています.GNU GAS 2.24は、次のように書いても文句を言わずに行います:

mov %ax, %cs

実行時に無効なコード例外が発生します。

CS の効果を観察するには、ここで説明されているように、ブート セクターに以下を追加して QEMU で実行してみてください https://stackoverflow.com/a/32483545/895245

/* $1 is the new CS, $1f the new IP. */
ljmp $1, $after1
after1:
/* Skip 16 bytes to make up for the CS == 1. */
.skip 0x10
mov %cs, %ax
/* cs == 1 */

ljmp $2, $after2
after2:
.skip 0x20
mov %cs, %ax
/* cs == 2 */

知財

命令が実行されるたびに、その命令のエンコードの長さだけ IP が自動的に増加します。これが、プログラムが前進する理由です。

IP は、CS を変更するのと同じ命令によって変更され、それらの命令の非 far バージョンによっても変更されます (より一般的なケース)。

IP を直接観察することはできないため、それを操作するのは困難です。代替案については、この質問を確認してください: プログラムカウンターを直接読み取る

于 2015-10-16T18:27:25.713 に答える
3

8086 プロセッサは 20 ビットのアドレス指定を使用するため、1MB のメモリにアクセスできますが、8086 のレジスタは 16 ビットしかないため、メモリからデータにアクセスするには、コード セグメント レジスタと命令ポインタ レジスタに存在する値を組み合わせて、物理アドレスは、CS 4 ビットの値を左に移動し、値 IP を追加することによって行われます。

例:

CS の値は 1234Hex(16 進数)

IP の値は 5678Hex です

現在、4 ビットを左に移動した後の CS の値は 12340Hex であり、IP 値を追加すると、物理アドレスである 179B8Hex になります。

于 2015-07-02T16:58:55.413 に答える