Next: , Previous: Convenience Vars, Up: Data


8.10 レジスタ

マシン・レジスタの内容は、 先頭が‘$’で始まる名前を持つ変数として、 式の中で参照することができます。 レジスタの名前は、 マシンによって異なります。 info registersコマンドを使用することで、 そのマシンで使用されているレジスタの名前を知ることができます。

info registers
(選択されたスタック・フレームにおける) 浮動小数点レジスタを除くすべてのレジスタの名前と値を表示します。


info all-registers
浮動小数点レジスタも含めてすべてのレジスタの名前と値を表示します。
info registers regname ...
指定されたレジスタregname相対化された値(relativized value)を表示します。 以下に詳しく述べるように、 レジスタの値は、 通常は、 選択されたスタック・フレームと関係を持つ相対的な値です。 regnameには、 ユーザの使用しているマシン上において有効な任意のレジスタの値が設定可能です。 先頭の‘$’は、 あってもなくてもかまいません。

GDBは、 そのマシン・アーキテクチャが持つレジスタの正規のニーモニックと衝突しない限り、 ほとんどのマシン上 (の式の中) において利用可能な、 4つの「標準的」なレジスタ名を持っています。 レジスタ名$pc$spは、 プログラム・カウンタ・レジスタとスタック・ポインタを指すために使われます。 $fpは、 カレントなスタック・フレームへのポインタを保持するレジスタを指すために使われます。 $psは、 プロセッサの状態を保持するレジスタを指すために使われます。 例えば、 プログラム・カウンタの値を16進数で表示するには、 以下のように実行します。

     p/x $pc

また、 次に実行される命令を表示するには、 以下のように実行します。

     x/i $pc

さらに、 スタック・ポインタ 1 に4を加えるには、 以下のように実行します。

     set $sp += 4

可能な場合にはいつでも、 これら4つの標準的なレジスタ名が使用可能です。 ユーザのマシンが異なる正規のニーモニックを使用している場合でも、 名前の衝突さえ起こらなければ、 使用可能です。 info registersコマンドにより、 正規名を見ることができます。 例えば、 SPARC上で info registersコマンドを実行すると、 プロセッサ・ステータス・レジスタは$psrと表示されますが、 このレジスタを$psとして参照することもできます。

レジスタがこの方法で調べられるとき、 GDBは普通のレジスタの内容を常に整数値とみなします。 マシンによっては、 浮動小数点値以外を保持できないレジスタを持つものがあります。 このようなレジスタは、 浮動小数点値を持つものとみなされます。 普通のレジスタの内容を浮動小数点値として参照する方法はありません (‘print/f $regname’により、 浮動小数点値として値を表示することはできます)。

レジスタには、 rawとvirtualの2つの異なるデータ形式を取るものがあります。 これは、 オペレーティング・システムによってレジスタの内容が保存されるときのデータ形式が、 ユーザ・プログラムが通常認識しているものと同じではないことを意味しています。 例えば、 68881浮動小数点コプロセッサのレジスタの値は常にextended (raw)形式で保存されていますが、 C言語によるプログラムは通常double (virtual)形式を想定しています。 このような場合、 GDBは通常 (ユーザ・プログラムにとって意味のある形式である) virtual形式だけを扱いますが、 info registersコマンドはデータを両方の形式で表示してくれます。

通常、 レジスタの値は、 選択されたスタック・フレーム (see Selecting a frame) と関係を持つ相対的な値です。 これは、 ユーザにレジスタの値として見えるものは、 選択されたフレームから呼び出されているすべてのスタック・フレームが終了し、 退避されたレジスタの値が復元されたときに、 そのレジスタが持つであろう値です。 ハードウェア・レジスタの本当の値を知りたければ、 最下位のフレームを (‘frame 0で) 選択しなければなりません。

しかし、 GDBは、 コンパイラが生成したコードから、 どこにレジスタが保存されているかを推論する必要があります。 退避されていないレジスタがある場合や、 GDBが退避されたレジスタを見つけることができない場合は、 どのスタック・フレームを選択していても結果は同じです。

set rstack_high_address address
AMD 29000ファミリ・プロセッサでは、 レジスタは「レジスタ・スタック」と呼ばれるところに退避されます。 GDBには、 このスタックの大きさを知ることはできません。 通常 GDBは、 スタックは十分に大きいと想定します。 このために、 実際には存在しないメモリ位置を、 GDBが参照してしまうことがありえます。 必要であれば、 set rstack_high_addressコマンドによってレジスタ・スタックの最終アドレスを指定することによって、 この問題を回避することができます。 引数はアドレスでなければなりません。 ‘0x’を先頭に記述することで、 アドレスを16進数で指定することができます。


show rstack_high_address
AMD 29000ファミリ・プロセッサにおけるレジスタ・スタックのカレントな上限を表示します。

脚注

[1] 原注:これは、 スタックがメモリの下位方向に伸長するマシン (最近のほとんどのマシンがそうです) 上において、 スタックから1ワードを取り除く方法です。 これは、 最下位のスタック・フレームが選択されていることを想定しています。 これ以外のスタック・フレームが選択されているときには、 $spに値を設定することは許されません。 マシン・アーキテクチャに依存することなくスタックからフレーム全体を取り除くには、 returnを使用します。 See Returning from a function