web-dev-qa-db-ja.com

Intel 8086アセンブリのCSおよびIPレジスタの目的は何ですか?

したがって、質問が述べるように、インテルの8086のCSおよびIPレジスタの目的は何ですか

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

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

iPの場合:

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

私はこれが基本的に何を意味するのか本当に理解していないので、誰かがより「生き生きとした」説明を提供できれば、それは素晴らしいことです:)

21
idjuradj

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

16
user1666959

物理アドレスは2つの部分から計算されます。 i)セグメントアドレス。 ii)オフセットアドレス。 CS(コードセグメントレジスタ)は、メモリのコードセグメント、つまりコードが格納されているメモリ内の場所をアドレス指定するために使用されます。 IP(命令ポインター)には、メモリのコードセグメント内のオフセットが含まれます。したがって、CS:IPは、メモリ内のコードの場所を指す(つまり、物理アドレスを計算する)ために使用されます。

25
kiran james

次に実行される命令は、メモリアドレスが次の命令に等しい場合です。

16 * CS + IP

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

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

[〜#〜] cs [〜#〜]

CSを変更する手順は次のとおりです。

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

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

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は、その命令のエンコードの長さだけ命令が実行されるたびに自動的に増加します。これが、プログラムが前進する理由です!

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

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

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

例:

cSの値は1234Hex(hexa decimal)

iPの値は5678Hexです

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

1
Amrish Ak

アセンブリプログラムテキストに.codeを記述すると、その.codeはcs値を指します。ファイル内のそれ以降のコマンドは、cs:ipに従ってアドレス指定されます。ipは、csからのオフセット値です。

もちろん、アセンブリコンパイラは最初にテキストをマシンコード命令に変換することに注意してください。

1
zeimer

IPレジスタ-IPは命令ポインターです。その機能は、他のマイクロプロセッサのPC(プログラムカウンタ)と同じで、EUUユニットに供給するBIUユニットによってフェッチされる次の命令を指します。

0
masood qazi