前へ | 次へ | 目次 | 索引 |
命令に対応したアドレス式(行番号など)を EXAMINE コマンドの中に指定した場合,デバッガはその記憶位置にある最初の命令を表示します。その後,第 4.1.8 項 で説明したとおり,現在と次と前の命令(論理要素)をそれぞれ表示するためにピリオド(.)と Return キーとサーカンフレックス(^)を使用できます。
たとえば,Alpha プロセッサでは次のとおりです
DBG> EXAMINE %LINE 12 MOD3\%LINE 12: BIS R31,R31,R2 DBG> EXAMINE MOD3\%LINE 12+4: BIS R31,R2,R0 ! 次の命令 DBG> EXAMINE MOD3\%LINE 12+8: ADDL R31,R0,R0 ! 次の命令 DBG> EXAMINE ^ MOD3\%LINE 12+4: BIS R31,R2,R0 ! 前の命令 DBG> |
行番号,ルーチン名,およびラベルは,命令に対応づけられるシンボリック・アドレス式です。また,命令はプログラムの実行時に他の各種のメモリ・アドレスや一定のレジスタに格納される場合があります。
プログラム・カウンタ(PC)は,プログラムが次に実行する命令のアドレスが入っているレジスタです。EXAMINE .%PC コマンドはその命令を表示します。ピリオド(.)は,アドレス式の直前に使用した場合には " 内容 " 演算子(アドレス式が指し示す記憶位置の内容)を表します。次の違いに注意してください。
VAX プロセッサでは,EXAMINE .%PC コマンドを入力した場合に表示される情報の量を制御するために /OPERANDS 修飾子を使用できます。
DBG> EXAMINE .%PC MOD3\%LINE 12: MOVL B^12(R11),R1 DBG> EXAMINE/OPERANDS .%PC MOD3\%LINE 12: MOVL B^12(R11),R1 B^12(R11) MOD3\K(address 1196)contains 1 R1 R1 contains 8 DBG> EXAMINE/OPERANDS=FULL .%PC MOD3\%LINE 12: MOVL B^12(R11),R1 B^12(R11) R11 contains MOD3\N(address 1184), B^12(1184)evaluates to MOD3\K(address 1196), which contains 1 R1 R1 contains 8 DBG> |
VAX プロセッサでは,/OPERANDS 修飾子は,現在の PC 命令を検査する場合にだけ使用します。他の記憶位置を指定したときには,情報が正確でない場合があります。SET MODE [NO]OPERANDS コマンドを使用すると,EXAMINE .%PC コマンドの省略時の動作を制御することができます。
前の例に示したとおり,デバッガはアドレス式が命令に対応しているかどうかを認識しています。対応している場合,EXAMINE コマンドはその命令を表示します。/INSTRUCTION 修飾子を使用する必要はありません。/INSTRUCTION 修飾子は,任意のプログラム記憶位置の内容を命令として表示するために使用します。つまり,EXAMINE/INSTRUCTION コマンドを使用すると,デバッガはあらゆるプログラム記憶位置の内容を命令として解釈し編集します(第 4.5.2 項 を参照)。
MACRO-32 プログラム内の連続した命令を検査する場合,データの記憶域が命令ストリームの中間に割り当てられていると,デバッガがデータを命令と誤って解釈することがあります。次の例はこの問題を説明したものです。この MACRO-32 コードでは,行 7 の BRB 命令の直後に 2 つのロングワード・データ記憶域が割り当てられています。行番号は説明のために加えたものです。
module TEST 1: .TITLE TEST 2: 3: TEST$START:: 4: .WORD 0 5: 6: MOVL #2,R2 7: BRB LABEL_2 8: 9: .LONG ^X12345 10: .LONG ^X14465 11: 12: LABEL_2: 13: MOVL #5,R5 14: 15: .END TEST$START |
次の EXAMINE コマンドは行 6 の開始時の命令を表示します。
DBG> EXAMINE %LINE 6 TEST\TEST$START\%LINE 6: MOVL S^#02,R2 DBG> |
次の EXAMINE コマンドは,行 7 で論理的後続データ要素を正しく解釈し,表示します。
DBG> EXAMINE TEST\TEST$START\%LINE 7: BRB TEST\TEST$START\LABEL_2 DBG> |
しかし,次の 3 つの EXAMINE コマンドは,3 つの論理的後続データを誤って命令として解釈します。
DBG> EXAMINE TEST\TEST$START\%LINE 7+2: MULF3 S^#11.00000,S^#0.5625000,S^#0.5000000 DBG> EXAMINE %DEBUG-W-ADDRESSMODE, instruction uses illegal or undefined addressing modes TEST\TEST$START\%LINE 7+6: MULD3 S^#0.5625000[R4],S^#0.5000000,@W^5505(R0) DBG> EXAMINE TEST$START+12: HALT DBG> |
VAX プロセッサでは,命令を検査するだけでなく,そこに値を格納することもできます。次のDEPOSIT コマンド構文を使用します。
DEPOSIT/INSTRUCTION address-expression = "language-expression" |
命令は,二重引用符または一重引用符で囲まなければなりません。また,この区切り文字の付いた文字列が ASCII 文字列ではなく命令であることを示すため,DEPOSIT コマンドといっしょに /INSTRUCTION 修飾子も使用しなければなりません。あるいは,複数の命令を格納する場合には,最初に SET TYPE/OVERRIDE INSTRUCTION コマンドを入力することができます(第 4.5.2 項 を参照)。そのようにすれば,DEPOSIT コマンドで /INSTRUCTION 修飾子を使用する必要がなくなります。
命令が占有するバイト数はオペランドによって異なります。任意の長さの命令を連続したメモリ記憶位置へ格納する場合,命令を格納できる次の未使用記憶位置を設定するためには論理的後続データ演算子(Return キー)を使用します。次の例はその手法を示しています。
DBG> SET TYPE/OVERRIDE/INST ! 命令に省略時の型を設定する。 DBG> DEPOSIT 730 = "MOVB #77, R1" ! 命令をアドレス 730 から格納する。 DBG> EXAMINE . ! 格納を確認するため,現在の値を検査する。 730: MOVB #77,R1 DBG> EXAMINE [Return] ! 論理的後続データを新しい現在の値にする。 734: HALT DBG> DEPOSIT . = "MOVB #66, R2" ! 次の命令を格納する。 DBG> EXAMINE . ! 格納を表示し確認する。 734: MOVB #66,R2 DBG> |
命令を置換する場合,新しい命令の長さがオペランドも含めて古い命令と同じバイト数であることを確認してください。新しい命令のほうが長い場合は,その格納は必ず重ね書きによって行われるので,次の命令が破壊されてしまいます。新しい命令が古い命令より短い場合には,置換後に未使用のまま残ったメモリのバイトに NOP 命令(ノー・オペレーション命令)を格納しなければなりません。デバッガは,格納する命令が次の命令に重ね書きされる場合でも警告を出すこともなく,またメモリ内の空のバイトを NOP で埋めるように注意を喚起することもありません。
次の例は,命令を同じ長さの命令で置換する方法を示しています。
DBG> SET STEP INSTRUCTION ! 命令ごとにステップ実行する。 DBG> STEP stepped to 1584: PUSHAL (R11) DBG> STEP stepped to 1586: CALLS #1,L^2224 ! 置き換えたい命令。 DBG> EXAMINE .%PC 1586: CALLS #1,L^2224 DBG> EXAMINE [Return] ! 次の命令の開始点を 1593: CALLS #0,L^2216 ! 判別する(1593)。 DBG> DEPOSIT/INST 1586 = "CALLS #2,L^2224" ! 新しい命令を格納する。 DBG> EXAMINE . ! その命令が格納されたことを 1586: CALLS #2,L^2224 ! 確認する。 DBG> EXAMINE [Return] ! 次の命令が 1593: CALLS #0,L^2216 ! 変更されていないことを確認する。 DBG> |
VAX アーキテクチャが 16 個の汎用レジスタと 18 個のベクタ・レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。表 4-1 に,VAX レジスタを参照するデバッガ組み込みシンボルを示します。
シンボル | 説明 |
---|---|
VAX の汎用レジスタ | |
%R0...%R11 | 汎用レジスタ(R0...R11) |
%AP(%R12) | 引数ポインタ(AP) |
%FP(%R13) | フレーム・ポインタ(FP) |
%SP(%R14) | スタック・ポインタ(SP) |
%PC(%R15) | プログラム・カウンタ(PC) |
%PSL | プロセッサ・ステータス・ロングワード(PSL) |
VAX のベクタ・レジスタおよびベクタ制御レジスタ | |
%V0...%V15 | ベクタ・レジスタ V0...V15 |
%VCR | ベクタ数レジスタ |
%VLR | ベクタ長レジスタ |
%VMR | ベクタ・マスク・レジスタ |
VAX プロセッサには次のことが該当します。
Alpha プロセッサでは,Alpha アーキテクチャが 32 個の汎用(整数)レジスタと 32 個の浮動小数点レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。表 4-2 に,Alpha プロセッサ・レジスタを参照するデバッガ組み込みシンボルを示します。
シンボル | 説明 |
---|---|
Alphaの整数レジスタ | |
%R0...%R28 | レジスタ R0...R28 |
%FP(%R29) | スタック・フレーム基底レジスタ(FP) |
%SP(%R30) | スタック・ポインタ(SP) |
%R31 | ReadAsZero/Sink(RZ) |
%PC | プログラム・カウンタ(PC) |
%PS | プロセッサ・ステータス・レジスタ(PS)(Alpha プロセッサの場合,組み込みシンボルの%PSLと%PSWは使用できない) |
Alphaの浮動小数点レジスタ | |
%F0...%F30 | レジスタ F0...F30 |
%F31 | ReadAsZero/Sink |
Alpha プロセッサには次のことが該当します。
次の例はレジスタの検査とそこに値を格納する方法を示しています。
DBG> SHOW TYPE ! コンパイラ生成型を持たない type: long integer ! 記憶位置の型を表示する。 DBG> SHOW RADIX ! 現在の基数を表示する。 input radix: decimal output radix: decimal DBG> EXAMINE %R11 ! R11 内の値を表示する。 MOD3\%R11: 1024 DBG> DEPOSIT %R11 = 444 ! R11 に新しい値を格納する。 DBG> EXAMINE %R11 ! 新しい値をチェックする。 R11: 444 DBG> EXAMINE %PC ! プログラム・カウンタ内の値を表示する。 MOD\%PC: 1553 DBG> EXAMINE %SP ! スタック・ポインタ内の値を表示する。 0\%SP: 2147278720 DBG> |
PC についての詳しい説明は 第 4.3.1 項 を参照してください。
4.4.1 プロセッサ・ステータス・ロングワード(VAX のみ)
VAX プロセッサでは,プロセッサ・ステータス・ロングワード(PSL)レジスタの値がプロセッサ・ステータス変数の数を表します。PSL の最初の 16 ビット(この 16 ビットをプロセッサ・ステータス・ワードまたは PSW という)には,現在のプロセッサ・ステータスに関する非特権情報が入っています。これらのビットの値はユーザ・プログラムによって制御できます。PSL の残りの 16 ビット(ビット 16〜31)には特権情報が入っており,ユーザ・モード・プログラムでは変更できません。
次の例は PSL の内容を検査する方法を示しています。
DBG> EXAMINE %PSL MOD3\PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C n n n n mode mode 1v n n n n n n n n DBG> |
各ビットの値も含めた PSL についての完全な説明は, 『VAX Architecture Handbook』 を参照してください。
PSL 内の情報は別の形式でも表示できます。次に例を示します。
DBG> EXAMINE/LONG/HEX %PSL MOD3\%PSL: 03C00010 DBG> EXAMINE/LONG/BIN %PSL MOD3\%PSL: 00000011 11000000 00000000 00010000 DBG> |
EXAMINE/PSL コマンドは,記憶位置の値を PSL 形式で表示します。これは,呼び出しスタック上の保存された PSL を検査するのに役立ちます。
PSL 内のすべての条件を禁止するには,次の DEPOSIT コマンドを使用してビット 0〜15 をクリアします。
DBG> DEPOSIT/WORD PSL = 0 DBG> EXAMINE/PSL MOD3\PSL: CMP TP FPD IS CURMOD PRVMOD IPL DV FU IV T N Z V C 0 0 0 0 USER USER 0 0 0 0 0 0 0 0 0 DBG> |
Alpha プロセッサでは,プロセッサ・ステータス(PS)レジスタの値がプロセッサ・ステータス変数の数を表します。PS の最初の 3 ビットは,このソフトウェアが使用するために予約されています。これらのビットの値はユーザ・プログラムで制御できます。残りのビット(ビット 4〜64)には特権情報が入っており,ユーザ・モード・プログラムでは変更できません。
次の例は PS の内容を検査する方法を示しています。
DBG> EXAMINE %PS MOD1\%PS: SP_ALIGN IPL VMM CM IP SW 48 0 0 USER 0 3 DBG> |
各ビットの値も含めた PS についての完全な説明は,『Alpha Architecture Reference Manual』を参照してください。
PS 内の情報は別の形式でも表示できます。次に例を示します。
DBG> EXAMINE/LONG/HEX %PS MOD1\%PS: 0000001B DBG> EXAMINE/LONG/BIN %PS MOD1\%PS: 00000000 00000000 00000000 00011011 DBG> |
EXAMINE/PS コマンドは,記憶位置の値を PS 形式で表示します。これは,現在の PS 値と保存された PS 値の組み合わせを検査するのに役立ちます。
4.5 検査と格納を行う場合の型の指定
ここまでの節では,シンボリック名を持ち,したがってコンパイラ生成型に対応しているプログラム記憶位置を EXAMINE コマンドと DEPOSIT コマンドで使用する方法を説明しました。
第 4.5.1 項 では,シンボリック名を持たないプログラム記憶位置用にデバッガがデータを編集(型指定)する方法と,それらの記憶位置用に型を制御する方法を説明します。
第 4.5.2 項 では,プログラム記憶位置に対応した型を上書きする方法を,シンボリック名を持つ記憶位置も含めて説明します。
4.5.1 シンボリック名を持たないプログラム記憶位置に対する型の定義
シンボリック名を持たず,したがってコンパイラ生成型に対応付けられていないプログラム記憶位置は,省略時の設定ではロングワード整数型を持ちます。この省略時の型を使用してそれらの記憶位置を検査し,それらの記憶位置へ値を格納する方法については,第 4.1.5 項 を参照してください。
SET TYPE コマンドを使用すると,省略時の型を変更できます。これは,別の型の記憶位置の内容を検査および表示したい場合や,特定の型の値を別の型に対応付けられた記憶位置へ格納したい場合に役立ちます。表 4-3 は,SET TYPE コマンドの型のキーワードの一覧です。
ASCIC | D_FLOAT | H_FLOAT1 | PACKED |
ASCID | DATE_TIME | INSTRUCTION | QUADWORD |
ASCII:n | EXTENDED_FLOAT2 | LONG_FLOAT2 | S_FLOAT2 |
ASCIW | F_LOAT | LONG_LONG_FLOAT2 | T_FLOAT2 |
ASCIZ | FLOAT | LONGWORD | TYPE=(type-expression) |
BYTE | G_FLOAT | OCTAWORD | WORD |
X_FLOAT2 |
たとえば,次のコマンドはシンボリック名を持たない記憶位置の型をバイト整数型,G 浮動小数点数型,6 バイトの ASCII データからなる ASCII 型にそれぞれ設定します。一連のSET TYPE コマンドは型を再設定します。
DBG> SET TYPE BYTE DBG> SET TYPE G_FLOAT DBG> SET TYPE ASCII:6 |
SET TYPE コマンドは,/OVERRIDE 修飾子を指定せずに使用した場合,シンボリック名を持つプログラム記憶位置(コンパイラ生成型に対応付けられた記憶位置)の型には影響を及ぼさないので注意してください。
SHOW TYPE コマンドは,シンボリック名を持たない記憶位置の現在の型を表示します。そのような記憶位置の省略時の型を復元するには,SET TYPE LONGWORD コマンドを入力します。
前へ | 次へ | 目次 | 索引 |