この章の目次にもどる
前頁:第1章 デバッグモードにもどる
次頁:第3章 IMSにすすむ

第2章 BMS

2.1 概要

BMS は、RAM モニタで、以下の機能を持っています。

ユーザプログラムデバッグ機能
プログラム/データのロード
ブレークポイント
トレース(ステップ)実行
例外処理
ユーザプログラムサポート機能
システムサービス関数

BMS はデバッグモードでシステムが起動されたときに動作し、 デバッグ用コンソールとの間で入出力を行います。

2.2 コンソールとの接続

BMS はシリアルポート経由で 外部のデバッグ用コンソールと接続して使用します。

通信ポートCOM1 (I/O アドレス 0x3F8 固定)
通信速度19200 bps
データ長8 ビット
ストップビット1 ビット
パリティなし
 
受信行末CR (0x0d)
送信行末CRLF (0x0d, 0x0a)
 
使用コードASCII

2.3 コマンドの形式

コマンド

モニタはコマンド入力待ちのときに、 プロンプトとして以下の文字列を表示します。

        BMS>

モニタのコマンドは以下の形式で入力します。 1 行は最大 256 文字です。

        <コマンド名>  <パラメータ 1>, <パラメータ 2>, ...  <改行>

<コマンド名>の大文字/小文字は区別されません。

<コマンド名>と<パラメータ>は空白またはタブで区切ります。

<パラメータ>は、',' で区切ります。 パラメータの一部を省略するときは、 ',' のみを入力することによって<パラメータ>の対応を示します。

コマンドを ';' で区切って 1 行に複数のコマンドを書くことができます。

'*' で始まる行はコメント行として無視されます。 改行だけの空行も無視されます。

特殊キー

以下の特殊キーが使用できます。

Ctrl-X (0x18), Ctrl-U (0x15) 入力行の取り消し
Ctrl-H (0x08), DEL (0x7f) 入力文字の 1 文字の取り消し
Ctrl-S (0x13) 表示の一時中断
Ctrl-Q (0x11) 表示の再開
Ctrl-C (0x03) コマンドの強制終了
Ctrl-F (0x06), ESC [ C カーソルを右に移動(→)
Ctrl-B (0x02), ESC [ D カーソルを左に移動(←)
Ctrl-P (0x10), ESC [ A 前の入力行の呼び出し(↑)
Ctrl-N (0x0e), ESC [ B 次の入力行の呼び出し(↓)
Ctrl-K (0c0b) カーソル以降を削除

Ctrl-C により、ユーザプログラムの実行を中断することはできません。

数値定数

数値定数は以下の形式で記述します。

16 進数H'<16進数字列> h'<16進数字列> '<16進数字列>
0x<16進数字列> <0~9> <16進数字列>
10 進数D'<数字列> d'<数字列>
8 進数Q'<8進数字列> q'<8進数字列>
2 進数B'<2進数字列> b'<2進数字列>
<数字>:'0'~'9'
<2 進数字>:'0','1'
<8 進数字>:'0'~'7'
<16 進数字>:'0'~'9','A'~'F','a'~'f'

先頭に何も付けない数字列は 16 進数とみなされますが、 先頭が数字でない場合は、シンボルと判断されますので注意が必要です。

    (例)    以下はすべて同じ値となります。

        h'b123      'B123       0xb123      0b123
        d'45347     Q'130443    b'1011000100100011

※ b123 はシンボルと判断されます。

文字列定数

文字列定数は、'"' で囲まれた任意の文字列で、 特殊なパラメータとして使用されます。

    (例)    "abcedf"

シンボル

シンボルは、英字, '_', '$, '@' で始まり、英字, 数字, '_', '$, '@' で 構成される最大 255 文字の文字列です。

任意の名前のシンボルを定義して値を設定することができます。 シンボル名中の大文字/小文字は区別されます。
シンボル '@' はメモリ操作コマンドの開始アドレスを示すシンボルとして モニタ内で使用されますので、使用することはできません。

定義できるシンボルの最大数はシンボルの文字数に依存しますが、 平均 16 文字として約 2300 個程度まで定義できます。

    (例)    start    @Base    $X    _main_

式は、数値定数やシンボルを '+', '-', '*', '/' の演算子でつなげたもので、 コマンドのパラメータとして記述できます。 '*', '/' を含む演算も常に左から行われます。 また、式中にレジスタ名を記述すると、 レジスタの値を意味します。

    (例)    H'8000000 + h'250   @B + 102    data + d'10
            a + b * c   は (a + b) * c の意味となります。
            EAX + 100   は レジスタ EAX の値 + h'100 となります。

'&' は間接参照を示す演算子で、 それまでの式の値のメモリアドレスの内容(ワード)を式の値とします。 '&' を連続して書くことにより多段の間接参照もできます。

    (例)    H'8000000 + h'250 &
                H'8000250 のメモリ内容を値とする。
            aaaa & + H'8 &
                シンボル aaaa の値のメモリ内容 + 8 をアドレスとする
                メモリ内容が式の値となる。

2.4 コマンドリファレンス

ここでは各コマンドの具体的な説明を行います。

コマンドの説明では以下の表記を使用しています。

[~ ] 省略可能を示す
[~].. 省略可能の繰り返しを示す
{~|~} 選択を示す

以下にコマンドの一覧を示します。

<コマンド名><コマンド説明>
D, DB, DC, DH, DWDump Memory メモリ内容の表示
M, MB, MH, MW Modify Memory メモリ内容の変更
F, FB, FH, FW Fill Memory メモリ内容の埋め込み(フィル)
SC, SCB, SCH, SCWSearch Memory メモリ内容のサーチ
CMP Compare Memory メモリ内容の比較
MOV Move Memory メモリ内容の転送
DA Disassemble 逆アセンブル
R Register Dump/Modify レジスタの表示/変更
G Go Program プログラムの実行
B, BC Set/Clear Break Point プレークポイント設定/クリア
T, S, N, TA Trace Program トレース実行
BTR Back Trace バックトレース表示
IB, IH, IW Input I/O ポートからの入力
OB, OH, OW Output I/O ポートへの出力
LO Load Program/Data プログラム/データのロード
KILL Kill Process 現在プロセスの強制終了
H, ? Help Message ヘルプメッセージの表示
VER Display Monitor Version モニタのバージョンの表示
P Print Value 値の表示
SYM, SYMC Set/Clear Symbol シンボルの設定/クリア
INIT Initialize モニタの初期化
PROMPT Set Prompt プロンプト文字列の設定
SERR System Error Informationシステム障害情報の表示
EXIT Exit Monitor モニタの終了


Dump MemoryD DB DC DH DW
 
メモリ内容の表示

【形式】

D   [<開始アドレス>][, {<終了アドレス>|#<データ数>}]
DB  [<開始アドレス>][, {<終了アドレス>|#<データ数>}]
DH  [<開始アドレス>][, {<終了アドレス>|#<データ数>}]
DW  [<開始アドレス>][, {<終了アドレス>|#<データ数>}]

【説明】

指定したアドレス範囲のメモリ内容を以下の<単位>で表示します。

D, DBバイト単位 <データ数>はバイト数
DH ハーフワード単位<データ数>はハーフワード数
DW ワード単位 <データ数>はワード数

対象となるアドレス範囲は以下のいずれかです。

    <開始アドレス> ~ <終了アドレス> + <単位> - 1
    <開始アドレス> ~ <開始アドレス> + <データ数> * <単位> - 1

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。

<開始アドレス>を省略すると、前回の D, DB, DH, DW コマンドの次のアドレスから表示します。

<終了アドレス>を省略すると、<単位>にかかわらず 64 バイト分表示します。

【使用例】

BMS> D 80100000
80100000: 00 09 80 04 45 03 E0 05 E0 09 00 0A 00 0B 56 0C ....E.........V.
80100010: 04 0D 00 0E 03 01 E0 03 E1 05 E8 FF 8E 00 00 00 ................
80100020: 1B D6 1B D6 1B D6 1B D6 9E 00 00 00 8E 00 01 C0 ................
80100030: C6 16 D0 0C 00 FF 80 46 80 10 00 00 88 12 22 4C .......F......"L
80100040: FF BF FE F0 1E 4C 80 10 00 00 D0 66 9C 00 8E 10 .....L.....f....
80100050: 02 B8 AF E5 46 56 D0 0C 00 FF 80 66 9C 00 8C F6 ....FV.....f....
80100060: 9E 00 03 80 8E 00 00 C0 1A 4C FF BF FE F0 1A 76 .........L.....v
80100070: 1E 4C 80 10 00 1C AA 37 52 D6 00 00 00 01 C2 16 .L.....7R.......
BMS>
BMS> DH 80100000, 80100010
80100000: 0900 0480 0345 05E0 09E0 0A00 0B00 0C56  ....E.........V.
80100010: 040D                     ..
BMS>
BMS> DW 80100000, #9
80100000: 04800900 05E00345 0A0009E0 0C560B00  ....E.........V.
80100010: 0E000D04 03E00103 FFE805E1 0000008E  ................
80100020: D61BD61B                 ....
Modify MemoryM MB MH MW
 
メモリ内容の変更

【形式】

M   [<開始アドレス>][, <設定データ>]..
MB  [<開始アドレス>][, <設定データ>]..
MH  [<開始アドレス>][, <設定データ>]..
MW  [<開始アドレス>][, <設定データ>]..

【説明】

指定した<開始アドレス>のメモリ内容を以下の<単位>で変更します。

M, MBバイト単位
MH ハーフワード単位
MW ワード単位

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。
<開始アドレス>を省略すると、 前回の M, MB, MH, MW コマンドの次のアドレスから変更します。

<設定データ>には<式>または<文字列>を指定します。
<式>は<単位>バイトのデータとして設定され、 <文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。
<設定データ>は最大 128 バイト分まで続けて指定できます。

<設定データ>を省略すると、対話形式によりメモリ内容を変更します。

対話形式では以下の入力は特別な意味となります。

'.'コマンドを終了する。
'^'1 つ前のアドレスに戻る。
(改行のみ)設定せずに次のアドレスに進む。

【使用例】

BMS> MB 80100000
80100000: 00 -> 12
80100001: 09 -> 34
80100002: 80 -> ^
80100001: 34 -> .
BMS>
BMS> MH 80100000, "ABCD", 56, 78
BMS>
BMS> MW 80100000
80100000: 41424344 ->
80100004: 56007800 -> .
BMS>
Fill MemoryF FB FH FW
 
メモリ内容の埋め込み(フィル)

【形式】

F   <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>]..
FB  <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>]..
FH  <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>]..
FW  <開始アドレス>,{<終了アドレス>|#<データ数>},<設定データ>[,<設定データ>]..

【説明】

指定したアドレス範囲のメモリに<設定データ>列を 以下の<単位>で繰り返して埋め込みます。

F, FBバイト単位 <データ数>はバイト数
FH ハーフワード単位<データ数>はハーフワード数
FW ワード単位 <データ数>はワード数

対象となるアドレス範囲は以下のいずれかです。

    <開始アドレス> ~ <終了アドレス> + <単位> - 1
    <開始アドレス> ~ <開始アドレス> + <データ数> * <単位> - 1

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。

<設定データ>には<式>または<文字列>を指定します。 <式>は<単位>バイトのデータとして設定され、 <文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。 <設定データ>は最大 128 バイト分まで続けて指定できます。

【使用例】

BMS> F 80101000, #10, 57
BMS>
BMS> D 80101000, #12
80101000: 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 57 WWWWWWWWWWWWWWWW
80101010: 00 00                       ..
BMS>
BMS> FW 80101000, 8010101f, 12, 34
BMS>
BMS> D 80101000, #22
80101000: 12 00 00 00 34 00 00 00 12 00 00 00 34 00 00 .......4.......4
80101010: 12 00 00 00 34 00 00 00 12 00 00 00 34 00 00 .......4.......4
80101020: 00 00                       ..
BMS>
Search MemorySC SCB SCH SCW
 
メモリ内容のサーチ

【形式】

SC   <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>]..
SCB  <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>]..
SCH  <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>]..
SCW  <開始アドレス>,{<終了アドレス>|#<データ数>},<検索データ>[,<検索データ>]..

【説明】

指定したアドレス範囲のメモリ内容に<検索データ>列があるかどうかを 以下の<単位>で検索し、 <検索データ>列が見つかったときは、その先頭のアドレスを表示します。 最大 64 個の表示を行った時点で検索を打ち切ります。

SC, SCBバイト単位 <データ数>はバイト数
SCH ハーフワード単位<データ数>はハーフワード数
SCW ワード単位 <データ数>はワード数

対象となるアドレス範囲は以下のいずれかです。

    <開始アドレス> ~ <終了アドレス> + <単位> - 1
    <開始アドレス> ~ <開始アドレス> + <データ数> * <単位> - 1

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。

<検索データ>には<式>または<文字列>を指定します。 <式>は<単位>バイトのデータとして設定され、 <文字列>は<単位>にかかわらず常にバイトデータ列として設定されます。 <検索データ>は最大 128 バイト分まで続けて指定できます。

【使用例】

BMS> SC 80101000, 8010101f, 12
80101003:
8010100B:
80101013:
8010101B:
BMS>
BMS> SCW 80101000, #20, 12, 34
80101000:
80101008:
80101010:
80101018:
BMS>
Compare MemoryCMP
 
メモリ内容の比較

【形式】

CMP <開始アドレス>, {<終了アドレス>|#<バイト数>}, <比較先アドレス>

【説明】

指定したアドレス範囲のメモリ内容を<比較先アドレス>からのメモリ内容と比較し、 内容が異なっているアドレスとメモリ内容をバイト単位で表示します。 最大 64 個の表示を行った時点で比較を打ち切ります。

対象となるアドレス範囲は以下のいずれかです。

    <開始アドレス> ~ <終了アドレス>
    <開始アドレス> ~ <開始アドレス> + <バイト数> - 1

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。

【使用例】

BMS> CMP 80100000, 80100fff, 80110000
BMS>
BMS> CMP 80100000, 80100fff, 80120000
80100020: 34 -> 80120000: 00
80100021: 56 -> 80120000: 00
    :   :
(More)
BMS>
Move MemoryMOV
 
メモリ内容の転送

【形式】

MOV <開始アドレス>, {<終了アドレス>|#<バイト数>}, <転送先アドレス>

【説明】

指定したアドレス範囲のメモリ内容を<転送先アドレス>に転送します。

対象となるアドレス範囲は以下のいずれかです。

    <開始アドレス> ~ <終了アドレス>
    <開始アドレス> ~ <開始アドレス> + <バイト数> - 1

指定した<開始アドレス>はシンボル "@" に自動的に設定されます。

【使用例】

BMS> MOV 80100000, #1000, 80110000
BMS>
DisassembleDA
 
逆アセンブル

【形式】

DA  [<開始アドレス>][, <ステップ数>]

【説明】

指定した<開始アドレス>から、 指定した<ステップ数>分を逆アセンブルした結果を表示します。

<開始アドレス>を省略すると、 前回の DA コマンドの次のアドレスから逆アセンブルします。 ただし、ユーザプログラムの実行後にブレークや例外などでモニタに戻ってきた時は、 その時点の EIP レジスタの値が DA コマンドの<開始アドレス>になります。

<ステップ数>を省略すると、16 ステップ分逆アセンブルします。

【使用例】

BMS> DA 801000d8
 ...
BMS>
Register Dump/ModifyR
 
レジスタの表示/変更

【形式】

R   [<レジスタ名>[, <設定データ>]]

【説明】

指定した<レジスタ名>の内容を変更します。 <設定データ>を省略すると、指定した<レジスタ名>の内容を表示します。

指定可能な<レジスタ名>は以下の通りで、大文字/小文字は区別されません。

汎用レジスタ:EIP, EFLAGS, EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI, CS, DS, ES, FS, GS, SS
制御レジスタ:LDTR, TR, CR0, CR2, CR3, GDTR, IDTR

<レジスタ名>を省略すると、汎用レジスタ全部を表示します。 <レジスタ名>として 'C'を指定すると、制御レジスタ全部を表示します。

【使用例】

Bms≫ R
 ...
Bms>
BMS> R C
 ...
BMS>
BMS> R EAX, 1234567
BMS> R EAX
EAX    :01234567
BMS>
Go ProgramG
 
プログラムの実行

【形式】

G   [<実行開始アドレス>][, <実行終了アドレス>]

【説明】

指定した<実行開始アドレス>からプログラムを実行します。 <実行終了アドレス>は一時的なソフトウェアブレークポイントとして設定され、 <実行終了アドレス>に到達した時点でモニタに戻ります。

<実行開始アドレス>を省略すると、現在の EIP レジスタから実行します。

ユーザプログラムからは以下のいずれかの場合にモニタに戻ります。

【使用例】

BMS> G 801000d8, 8010434
Break (S) at 8010434        ※ at XXXX は次に実行される命令の EIP
BMS>
Set/Clear Break PointB BC
 
プレークポイントの設定/クリア

【形式】

B   [<ブレークアドレス>[,<ブレーク属性>][, <実行コマンド>]]
BC  [<ブレークアドレス>][, <ブレークアドレス>]..

【説明】

B コマンドは、指定した<ブレークアドレス>に指定した <ブレーク属性>のブレークポイントを設定します。 パラメータを省略すると、設定されている全てのブレークポイントを表示します。

<ブレーク属性>は以下のいずれかを指定します。省略すると S になります。

S :ソフトウェアブレークポイント
<ブレークアドレス>の命令を実行する直前にブレークする。
I :命令ブレークポイント
<ブレークアドレス>の命令を実行した直後にブレークする。
W :オペランドブレークポイント
<ブレークアドレス>のメモリをライトした直後にブレークする。
RW :オペランドブレークポイント
<ブレークアドレス>のメモリをリードまたはライトした直後にブレークする。

ソフトウェアブレークポイントと命令ブレークポイントは両方で 8 点まで、 オペランドブレークポイントは 4 点まで設定可能です。

<実行コマンド>はブレークしたときに実行するモニタの コマンド文字列を最大 80 文字で指定します。
<実行コマンド>に G コマンドを入れるとブレーク後に自動的に継続して実行されます。

BC コマンドは、指定した<ブレークアドレス>の設定をクリアします。
パラメータを省略すると、設定されている全てのブレークポイントをクリアします。

【使用例】

BMS> B 80100100, "R EAX; G"
 ...
BMS>
Trace ProgramT S N TA
 
トレース実行

【形式】

T   [<開始アドレス>][, <ステップ数>]
S   [<開始アドレス>][, <ステップ数>]
N   [<開始アドレス>][, <ステップ数>]
TA  [<トレース属性> [, <実行コマンド>]]

【説明】

T コマンドは、指定した<実行終了アドレス>からプログラムを指定した<ステップ数> だけ、TA コマンドで設定したトレース属性に基づいてトレース実行します。 <ステップ数>を省略すると 1 ステップとなります。 <実行開始アドレス>を省略すると、 現在の EIP レジスタからトレース実行します。 トレース実行中はすべてのブレークポイントは無効になります。

S コマンドはトレース属性を全トレース、 N コマンドはステップトレースとしてトレース実行します。

TA コマンドは、トレースの属性を指定します。 パラメータを省略すると、現在設定されているトレース属性を表示します。 <トレース属性>は以下のいずれかを指定します。
トレースの属性のデフォールトはステップトレースです。

ステップトレース(1 命令実行ごとにトレース。 ただし CALL/INT 命令の時は、 サブルーチン全体を 1 つの命令とみなし、 CALL/INT命令の次の命令でトレースする)
全トレース(1 命令実行ごとにトレース)

<実行コマンド>はトレースごとに実行するモニタのコマンド 文字列を最大 80 文字で指定します。 <実行コマンド>に G コマンドを入れる必要はありません。

【使用例】

BMS> TA S
 ...
BMS>
Back TraceBTR
 
バックトレース表示

【形式】

BTR [フレームポインタ]

【説明】

BTR コマンドは、現在の EBP レジスタ またはパラメータで指定したフレームポインタの値から スタック内に保存されている関数呼び出しの履歴を表示します。

現在の EIP レジスタからの履歴表示の場合は、 最初に現在の EIP レジスタの値を表示します (フレームポインタを指定した場合には、EIP レジスタは表示されません)。 続いて関数呼び出しのリターンアドレスの履歴をさかのぼって表示します。 シンボルが定義されているときは、シンボルからの相対アドレスも表示します。

この機能は、 ブレークポイントや例外発生によりモニタに制御が戻った時に、 その時の状態を知るために使います。

【使用例】

BMS> BTR
EIP = 80101758  [test_func + 52]
 <-- 80100420  [main + 232]
 <-- 80100016  [start + 16]
BMS>
InputIB IH IW
 
I/O ポートからの入力

【形式】

IB  <I/Oアドレス>
IH  <I/Oアドレス>
IW  <I/Oアドレス>

【説明】

指定した<I/Oアドレス>からデータを読み込んで表示します。

IBバイトデータ (8 bits) の読み込み
IHハーフワードデータ (16 bits) の読み込み
IWワードデータ (32 bits) の読み込み
OutputOB OH OW
 
I/O ポートへの出力

【形式】

OB  <I/Oアドレス>,<バイトデータ>
OH  <I/Oアドレス>,<ハーフワードデータ>
OW  <I/Oアドレス>,<ワードデータ>

【説明】

指定した<I/Oアドレス>にデータを書き込みます。

OBバイトデータ (8 bits) の書き込み
OHハーフワードデータ (16 bits) の書き込み
OWワードデータ (32 bits) の書き込み
Load Program/DataLO
 
プログラム/データのロード

【形式】

LO  <プロトコルデータ形式>[, <ロード開始アドレス>]

【説明】

コンソールの通信回線からプログラム、 データまたはシンボルテーブルをメモリ上にロードします。

<プロトコルデータ形式>は以下のいずれかを指定します。
<プロトコル><データ形式>
XS XMODEMS-フォーマット(S3)
S 無手順S-フォーマット(S3)
XO XMODEMオブジェクトプログラム(A.OUT フォーマット)
XM XMODEMメモリイメージデータ(無変換)
XSYMXMODEMシンボルテーブル
SYM 無手順シンボルテーブル

<ロード開始アドレス>は、ロードするメモリアドレスを指定します。

XO 省略可 (省略時はデータに含まれるアドレスが適用される)
XM 省略不可
XSYM, SYM指定可(指定時はシンボルの値に加算される)
リンク時の指定と異なる場所にロードしたときは指定する必要があります。

シンボルテーブルは、以下の形式のテキストファイルです。

    NNNNNNNN T SSSSSSSSSSSSSSSSSSSSSSSS <改行>
        :   :
N:8 文字の 16 進数値
T:シンボルタイプ (T, D, B 以外は無視される)
S:シンボル文字列 (先頭 32 文字が有効となる)

無手順のシンボルテーブルのロードの時は、ロード終了後に、Ctrl-C または Ctrl-X を入力してロードを終了させる必要があります。

【使用例】

BMS> LO XO
Loaded: 80100000 -> 801023f8
BMS> LO XM, 80120000
Loaded: 80120000 -> 8012FFFF
Kill ProcessKILL
 
現在プロセスの強制終了

【形式】

KILL

【説明】

例外やブレークポイント等で BMS に移行したときに動作していたプロセスを強制終了し、 OS に制御を戻します。この機能は、OS に依存しています。

割込ハンドラ等のプロセス以外から BMS へ移行した場合には、 KILL コマンドを実行したことで OS システムダウンとなることがあります。

【使用例】

BMS> KILL
Help MessageH ?
 
ヘルプメッセージの表示

【形式】

H  [<コマンド名>]
?  [<コマンド名>]

【説明】

指定した<コマンド名>のコマンドの使用方法を表示します。

<コマンド名>を省略したとき、 あるいは<コマンド名>が間違っているときは、 コマンドの一覧を表示します。

【使用例】

BMS> ? DB
DB   [<start_addr>][, {<end_addr>|#<data_cnt>}]
BMS>
Display Monitor VersionVER
 
モニタのバージョンの表示

【形式】

VER

【説明】

モニタのバージョンを表示します。

【使用例】

BMS> VER
BMS Version 1.20
BMS>
Print ValueP
 
値の表示

【形式】

P  <式>

【説明】

指定した<式>の値を 16, 10, 8, 2 進数、 および<式>の値以下で最も大きな値のシンボル+オフセットの形式で表示します。

【使用例】

BMS> P 1023
H'1023  D'4131  Q'10043  [sample + 23]
B'1 0000 0010 0011
BMS>
Set/Clear SymbolSYM SYMC
 
シンボルの設定/クリア

【形式】

SYM  [<シンボル名>[, <式>]]
SYMC  [<シンボル名>[, <シンボル名>]..]

【説明】

SYM コマンドは、 指定した<シンボル名>に<式>の値を設定します。 <シンボル名>を省略すると、定義されている全シンボルとその値を表示します。 <式>を省略すると、 指定した<シンボル名>で始まるすべてのシンボルとその値を表示します。

<シンボル名>ではなく<数値>のみを指定すると、 その数値のシンボルからの相対値を表示します。

SYMC コマンドは、指定した<シンボル名>をクリアします。
パラメータを省略すると、定義されているすべてのシンボルをクリアします。

【使用例】

BMS> SYM Base, 1234
BMS>
BMS> SYM
Base            :     1234
BMS>
BMS> SYM 1240
[Base + 0C]
BMS>
BMS> SYMC Base
BMS>
BMS> SYM
BMS>
Initialize MonitorINIT
 
モニタの初期化

【形式】

INIT

【説明】

以下の初期化を行い、モニタを初期起動時の状態に戻します。

【使用例】

BMS> INIT
BMS>
Set Prompt PROMPT
 
プロンプト文字列の設定

【形式】

PROMPT  <プロンプト文字列>

【説明】

指定した<プロンプト文字列>をプロンプトとして表示します。 最大 32 文字まで有効です。

【使用例】

BMS> PROMPT  "BB1: "
BB1:
BB1: PROMPT  "BMS> "
BMS>
System Error InformationSERR
 
システム障害情報の表示

【形式】

SERR

【説明】

システム障害により CPU が停止した場合に レジスタに保存されていたシステム障害情報を表示します。

システム障害情報の内容は、 システム障害により CPU が停止した後に、 システムスタート(リセット)した場合にのみ意味を持ちます。

【使用例】

BMS> SERR
System Error Information
 ...
BMS>
Exit MonitorEXIT
 
モニタの終了

【形式】

EXIT    [<パラメータ>]

【説明】

モニタを終了します。

EXIT		電源オフ
EXIT 1		再起動
EXIT -1		リセット

EXIT のとき、ソフトウエアで電源オフできない機種の場合は、画面に電源を切るように促す表示を行って、システムを停止します。

【使用例】

BMS> EXIT


2.5 システムサービス関数

モニタでは、 ユーザプログラムで使用するためのいくつかの システムサービス関数を提供しています。

ユーザプログラムは、 以下の方法でシステムサービス関数を使用できます。 または、それぞれのシステムサービス関数に対応した C ライブラリ関数を使用することもできます。

    EAX     <-- 機能番号
    EDA     <-- パラメータへのポインタ(必要な場合のみ)
    INT 131
    EAX     --> リターン値(必要な場合のみ)
<機能番号><機能>
0x00Enter Monitor モニタへ入る
0x01Power Off 電源 OFF
0x0BGet Machine Informationマシン情報の取り出し
0x10Get Character コンソールから 1 文字入力(入力を待たない)
0x11Get Character コンソールから 1 文字入力(入力を待つ)
0x12Put Character コンソールへ 1 文字出力
0x13Get Line コンソールから 1 行入力
0x14Put String コンソールへ文字列出力
0x1FExecute Command モニタコマンドの実行
0x40Execute APM BIOS APM BIOS の実行
0x41System Reset システムリセット
0x80Clear Symbol シンボルのクリア
0x81Get Symbol シンボル取り出し
0x82Set Symbol シンボル設定

システムサービス関数からのエラーコード(負の値)は以下のとおりです。

-1パラメータエラー
-2アドレスが不正(範囲外)


Enter Monitor
 
モニタへ入る

【アセンブラ呼び出し形式】

MOVL    #0x00, %EAX
INT 131

【C ライブラリ関数呼び出し形式】

void    _Monitor(void)

【リターン値】

リターンしない

【説明】

ユーザプログラムからモニタへ入ります。

モニタの G コマンドによりユーザプログラムを再開できます。

Power Off
 
電源 OFF

【アセンブラ呼び出し形式】

MOVL    #0x01, %EAX
INT 131

【C ライブラリ関数呼び出し形式】

void    _PowerOff(void)

【リターン値】

リターンしない

【説明】

モニタを終了し、電源をオフします。 電源をオフできないときでもリターンしません。

Get Machine Information
 
マシン情報の取り出し

【アセンブラ呼び出し形式】

PUSH    (マシン情報を格納するアドレス)
MOVL    #0x0B, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _GetMachineInfo(void *info)

【リターン値】

EAX:= 0: 正常終了
< 0: エラーコード

【説明】

以下の 256 バイトのマシン情報を取り出します。

<バイトオフセット><内容>
0 ~ 63コピーライト表記(ASCII コード 64 文字)
64 ~ 95BMS バージョン表記(ASCII コード 32文字)
96 ~ 99BMS バージョン(1 ワード: 16 進数)
100 ~ 255予約
Get Character
 
コンソールから 1 文字入力

【アセンブラ呼び出し形式】

MOVL    #0x10, %EAX     (A:入力を待たない)
INT 131

【C ライブラリ関数呼び出し形式】

int _GetCharNW(void)

【アセンブラ呼び出し形式】

MOVL    #0x11, %EAX     (B:入力を待つ)
INT 131

【C ライブラリ関数呼び出し形式】

int _GetChar(void)

【リターン値】

EAX:>= 0: 入力した文字コード
= -1: (A)で入力なし

【説明】

コンソールから 1 文字を入力します。入力した文字はエコーバックしません。

入力がないときは、(A) では -1 を戻しますが、(B) では入力されるまで待ちます。

Put Character
 
コンソールへ 1 文字出力

【アセンブラ呼び出し形式】

PUSH    (出力する文字コード)
MOVL    #0x12, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _PutChar(int c) または、int _PutCh(int c)

【リターン値】

EAX:= -1: Ctrl-C が入力された
= 0: Ctrl-C は入力されていない
※ _PutChar(_PutCh) 関数では :
EAX:= -1: Ctrl-C が入力された
>= 0: 出力した文字コード
となる。

【説明】

コンソールへ 1 文字を出力します。

Ctrl-S(XOFF) を入力したときは Ctrl-Q(XON) を入力するまで待ちます。

文字が LFコード(0x0A) の時は、改行(0x0d) と LFコード(0x0A) の 2 文字を出力します。

Get Line
 
コンソールから 1 行入力

【アセンブラ呼び出し形式】

PUSH    (入力文字列を格納するメモリの先頭アドレス)
MOVL    #0x13, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _GetString(char *buff)

【リターン値】

EAX:>= 0: 入力した文字数
= -1: Ctrl-C が入力された

【説明】

コンソールから改行(0x0d)、または Ctrl-C(0x03) が入力されるまでの 1 行を入力 して、指定されたメモリアドレスに格納します。
文字列の最後には NULLコード(0) を格納します。改行、Ctrl-C は格納されません。

入力した文字はエコーバックするとともに、以下の特殊キーの処理を行います。

Ctrl-X (0x18),Ctrl-U (0x15)入力行の取り消し
Ctrl-H (0x08),DEL (0x7f) 入力文字の 1 文字の取り消し
Ctrl-F (0x06),ESC [ C カーソルを右に移動(→)
Ctrl-B (0x02),ESC [ D カーソルを左に移動(←)
Ctrl-P (0x10),ESC [ A 前の入力行の呼び出し(↑)
Ctrl-N (0x0e),ESC [ B 次の入力行の呼び出し(↓)
Ctrl-K (0c0b) カーソル以降を削除
Put String
 
コンソールへ文字列出力

【アセンブラ呼び出し形式】

PUSH    (出力文字列を格納しているメモリの先頭アドレス)
MOVL    #0x14, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _PutString(char *buff) または、int _PutStr(char *buff)

【リターン値】

EAX:= -1: Ctrl-C が入力された
= 0: Ctrl-C は入力されていない

【説明】

指定されたメモリアドレスから 1 文字ずつ NULLコード(0) までの文字をコンソール に出力します。 文字列内の LFコード(0x0A) に対しては、改行(0x0d) と LFコード(0x0A) の 2 文字 を出力します。 Ctrl-S(XOFF) を入力した時は Ctrl-Q(XON) を入力するまで待ちます。
Execute Command
 
モニタコマンドの実行

【アセンブラ呼び出し形式】

PUSH    (モニタコマンド文字列を格納しているメモリの先頭アドレス)
MOVL    #0x1F, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _ExecCommand(char *buff)

【リターン値】

EAX:= 0: モニタコマンドを実行した
リターンしない: モニタへ移行した

【説明】

指定されたメモリアドレスに格納されている文字列をモニタコマンドとして実行後、 ユーザプログラムへ戻ります。

文字列が空の場合は、モニタへ移行し、ユーザプログラムへは戻りません。

Execute APM BIOS
 
APM BIOS の実行

【アセンブラ呼び出し形式】

PUSH    (パラメータバッファのアドレス)
MOVL    #0x40, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

int _APMfunc(int *par)

【リターン値】

EAX:= 0: 正常終了
> 0: APM BIOS エラーコード
= -1: APM BIOS 実行不可

【説明】

システムの APM BIOS を実行します。 パラメータバッファは 4 ワードのバッファであり、APM BIOS に渡す EAX, EBX, ECX, EDX の各レジスタの値を設定します。リターン時には、APM BIOS から戻された各レ ジスタの値がパラメータバッファに戻されます。

System Reset
 
システムリセット

【アセンブラ呼び出し形式】

PUSH    (パラメータ[予約])
MOVL    #0x41, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*1,%ESP

【C ライブラリ関数呼び出し形式】

void    _SysReset(int par)

【リターン値】

リターンしない

【説明】

システムをリセットして、再起動します。

Clear Symbol
 
シンボルのクリア

【アセンブラ呼び出し形式】

PUSH    (シンボル文字数)
PUSH    (シンボルへのポインタ)
MOVL    #0x80, %EAX     (A:指定シンボルクリア)
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*2,%ESP

【C ライブラリ関数呼び出し形式】

int _ClrSymbol(char *symbol, int nchar)

【リターン値】

EAX:= 0: 正常終了
< 0: エラーコード

【説明】

指定したシンボルをクリアします。シンボルへのポインタが NULL (0) のときは、全 シンボルをクリアします。
Get Symbol
 
シンボル取り出し

【アセンブラ呼び出し形式】

PUSH    (シンボルの値を格納するポインタ)
PUSH    (シンボル文字数)
PUSH    (シンボルへのポインタ)
MOVL    #0x81, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*3,%ESP

【C ライブラリ関数呼び出し形式】

int _GetSymbol(char *symbol, int nchar, int *val)

【リターン値】

EAX:= 0:正常終了
< 0: エラーコード

【説明】

指定したシンボルの値を取り出します。

Set Symbol
 
シンボル設定

【アセンブラ呼び出し形式】

PUSH    (シンボルの値)
PUSH    (シンボル文字数)
PUSH    (シンボルへのポインタ)
MOVL    #0x82, %EAX
LEAL    0(%ESP), %EDX
INT 131
ADDL    #4*3,%ESP

【C ライブラリ関数呼び出し形式】

int _SetSymbol(char *symbol, int nchar, int val)

【リターン値】

EAX:= 0:正常終了
< 0: エラーコード

【説明】

指定したシンボルを設定します。

2.6 ハードウェアリソース

BMS で使用しているハードウェアリソースは以下の通りです。

割り込みベクトル

<ベクトル番号><内容>
1デバッグ例外 (トレース用)
3ブレークポイント
8ダブルフォールト(未定義例外処理用)
14ページフォールト(未定義例外処理用)
131システムサービス関数用

I/O ポート

<I/O アドレス><内容>
0x3F8~0x3FFシリアルポート(COM1)
外部デバッグコンソールとの入出力用
0x92, 0x64システム制御ポート、KB ポート
システムリセット用(システムサービス関数)
0x70, 0x71リアルタイムクロック
LO コマンドでの XMODEM のタイムアウト用
※ BCD 24H モードで動作している前提

この章の目次にもどる
前頁:第1章 デバッグモードにもどる
次頁:第3章 IMSにすすむ