次に、数値

文字列は、はりぼてのお陰で、さっくりと用意出来ましたが、
数値を表示するには、更に、もう一捻り必要になります。
いや、シンプルに出来るのかもしれないけれど、
僕の発想では、やはり、一捻り必要に思えるのです。
ひとまず、自分のやり方でやってみて、良い方法が見付かったら、書き直しましょう。


とにかく、最低限の要求から考えていきます。
とりあえず、欲しいのは、レジスタの内容を表示出来れば良いので、
パラメータは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