次に、数値
文字列は、はりぼてのお陰で、さっくりと用意出来ましたが、
数値を表示するには、更に、もう一捻り必要になります。
いや、シンプルに出来るのかもしれないけれど、
僕の発想では、やはり、一捻り必要に思えるのです。
ひとまず、自分のやり方でやってみて、良い方法が見付かったら、書き直しましょう。
とにかく、最低限の要求から考えていきます。
とりあえず、欲しいのは、レジスタの内容を表示出来れば良いので、
パラメータは1つ。
AXレジスタに表示したい数値をセットする。
出力は、AXレジスタの内容を、16進数4桁で表示する。
先に文字列出力のサブルーチンは用意しましたので、
文字列を出力する部分は、これを利用すれば良いでしょう。
そうすると、数値をヌルターミネート文字列に変換する処理が中心になりますね。
色々と悩んでみましたが、変換には、文字コードを数値順にならべたデータを用意して、
数値をインデックスとして文字コードを取り出し、
それを出力用のバッファに順番に並べるという手順になりました。
こんな感じです。
puthex: PUSH AX ; AXレジスタ退避 PUSH BX ; BXレジスタ退避 PUSH CX ; CXレジスタ退避 PUSH SI ; SIレジスタ退避 PUSH DI ; DIレジスタ退避 MOV CX, AX ; AXレジスタの内容をCXレジスタに転写 ; AXレジスタは作業用に使うので内容をCXレジスタに移す MOV BX, hexstr ; hexstrの先頭アドレスをBXレジスタに転写 LEA DI, [hexbuff] ; hexbuffの先頭アドレスをDIレジスタに転写 MOV SI, CX ; SI[1234]←CX[1234] SHR SI, 12 ; SI[>>>1] AND SI, 000Fh ; SI[0001] MOV AL, [BX+SI] ; ALレジスタに[BX+SI](数値に対応する文字コード)を転写 MOV [DI], AL ; [DI](変換バッファの指定位置)にALレジスタの内容を転写 INC DI ; DIレジスタの内容を1増やす(変換バッファの位置を次の位置へ移動) MOV SI, CX ; SI[1234]←CX[1234] SHR SI, 8 ; SI[>>12] AND SI, 000Fh ; SI[0002] MOV AL, [BX+SI] ; ALレジスタに[BX+SI](数値に対応する文字コード)を転写 MOV [DI], AL ; [DI](変換バッファの指定位置)にALレジスタの内容を転写 INC DI ; DIレジスタの内容を1増やす(変換バッファの位置を次の位置へ移動) MOV SI, CX ; SI[1234]←CX[1234] SHR SI, 4 ; SI[>123] AND SI, 000Fh ; SI[0003] MOV AL, [BX+SI] ; ALレジスタに[BX+SI](数値に対応する文字コード)を転写 MOV [DI], AL ; [DI](変換バッファの指定位置)にALレジスタの内容を転写 INC DI ; DIレジスタの内容を1増やす(変換バッファの位置を次の位置へ移動) MOV SI, CX ; SI[1234]←CX[1234] AND SI, 000Fh ; SI[0004] MOV AL, [BX+SI] ; ALレジスタに[BX+SI](数値に対応する文字コード)を転写 MOV [DI], AL ; [DI](変換バッファの指定位置)にALレジスタの内容を転写 MOV SI, hexbuff ; hexbuff(変換後16進数文字列)の先頭アドレスをSIレジスタに転写 CALL puts ; 文字列出力サブルーチンをコール POP DI ; DIレジスタ復元 POP SI ; SIレジスタ復元 POP CX ; CXレジスタ復元 POP BX ; BXレジスタ復元 POP AX ; AXレジスタ復元 RET hexstr: DB "0123456789ABCDEF" hexbuff: DB "ABCD", 0x00