- 締切済み
アセンブラで System.out.print(x); をする方法
x dw 5000 例えばこのように宣言した時、x の値 5000 を dos 窓に表示するには どうするのでしょうか? Java で言う System.out.print(x); をしたいのですが... 環境は masm32、interrupt のリストはこちらです ↓ http://www.ctyme.com/intr/int.htm
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ralf124c
- ベストアンサー率52% (232/446)
以前の質問で回答しましたRalf124cというものです。 お返事見て回答しようと思ったら都合で遅れてしまいすいませんでした。 この場合ふつうはMACROを組みますが、単純に組むとなるととかいいながらサンプルを作っているとまた出遅れるので手順だけ書きます。 ・数値は16進数(実際は2進数)なので10進数に変換する手順を使います。 ・大きな位から10の位まで順に、元の値の商(1000の位なら1000で割る→その余りを100で割って100の位を求めるやり方)をASCIIコードに変えてDOSのファンクションコール(INT21hまたは高速表示のINT29h)で出力し、余を次の位の計算に使います。10の位まで処理して残った余りが1の位です。 ※8ビットCPU時代には割り算がなかったので、100の位は何回100を引けるかをカウントして出してました。この手法が一般的みたいですが、8086の割り算命令と処理時間の比較をしたことがないのでどちらが効率的かはわかりません。近年のCPUにも割り算命令がないものがありますので引き算に置き換えるやり方の方が移植性(?)は良くなるかも・・・。 ・1桁の数値を数文字に変えるには30hを足してやればよいのです。 ソースコードは「simtel(ftp.simtel.net)」の「/.2/simtelnet/msdos/asmutl/stdlib.zip」の「ITOA.ASM」で処理内容がわかるかも・・・って、高機能なので逆にわかりにくかったりして。
- ultraCS
- ベストアンサー率44% (3956/8947)
最近、86のアセンブラを使っていないので、ちょっと自信がないので、ソースはご勘弁 数値をそのまま表示することはできません 5000を'5'、'0'、'0'、'0'に変換し キャラクタをdlに格納 int 21h/AH=02 を繰り返します。 または int 21h/AH=06 キャラクタをdlに格納 でも同じかと 前者のようにSTANDARD OUTPUTに出力した方がリダイレクトが使えるし、行儀としても良いでしょう。 必要であれば、改行や改ページ、位置指定などを(エスケープシーケンスの出力などで)を行います。
お礼
回答ありがとうございます 数字を出力するだけでもかなり大変なんですね >5000を'5'、'0'、'0'、'0'に変換し これはどうすれば良いのでしょうか? バイナリに変換したり 割ったりするような気がするのですが ヒントを頂けると助かります...