ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:yasu182 アセンブラで System.out.print(x); をする方法
困り度:
  • 困っています
x dw 5000

例えばこのように宣言した時、x の値 5000 を
dos 窓に表示するには どうするのでしょうか?

Java で言う System.out.print(x); をしたいのですが...
環境は masm32、interrupt のリストはこちらです ↓

http://www.ctyme.com/intr/int.htm
質問投稿日時:08/04/07 04:44
質問番号:3928633
最新から表示回答順に表示

回答

 

回答者:ralf124c 以前の質問で回答しました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」で処理内容がわかるかも・・・って、高機能なので逆にわかりにくかったりして。
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:08/04/09 02:35
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:ultraCS 最近、86のアセンブラを使っていないので、ちょっと自信がないので、ソースはご勘弁

数値をそのまま表示することはできません

5000を'5'、'0'、'0'、'0'に変換し

キャラクタをdlに格納
int 21h/AH=02
を繰り返します。

または
int 21h/AH=06
キャラクタをdlに格納
でも同じかと

前者のようにSTANDARD OUTPUTに出力した方がリダイレクトが使えるし、行儀としても良いでしょう。


必要であれば、改行や改ページ、位置指定などを(エスケープシーケンスの出力などで)を行います。
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/04/07 08:48
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼回答ありがとうございます
数字を出力するだけでもかなり大変なんですね

>5000を'5'、'0'、'0'、'0'に変換し

これはどうすれば良いのでしょうか? 
バイナリに変換したり 割ったりするような気がするのですが
ヒントを頂けると助かります...
 
最新から表示回答順に表示