Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


4.3.1 命令の検査

命令に対応したアドレス式(行番号など)を 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> 

4.3.2 命令への値の格納(VAX のみ)

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> 

4.4 レジスタの検査と値の格納

VAX アーキテクチャが 16 個の汎用レジスタと 18 個のベクタ・レジスタを備えており,それらの一部は一時的なアドレスやデータの記憶域として使用されます。表 4-1 に,VAX レジスタを参照するデバッガ組み込みシンボルを示します。

表 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 プロセッサ・レジスタを参照するデバッガ組み込みシンボルを示します。

表 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> 

4.4.2 プロセッサ・ステータス(Alphaのみ)

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 コマンドの型のキーワードの一覧です。

表 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


1VAX 固有
2Alpha 固有

たとえば,次のコマンドはシンボリック名を持たない記憶位置の型をバイト整数型,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 コマンドを入力します。


前へ 次へ 目次 索引