2011-02-12 9 views
3

divの後に11.1を表示するにはどうすればいいですか?たとえば、32/5 = 6.4、私は6を表示する方法は6を表示する方法です6.4?アセンブリのdivの後に11.1を表示する方法

OUT23:

MOV BL,CNT ;CNT is the total number of even number 
DIV BL 
MOV DL,AL 
MOV BH,AL 
MOV AH,09H 
LEA DX,MSG23 
INT 21H 
MOV DL,BH ;print out the average, only the integer part able to display 
MOV AH,02 
ADD DL,30H 
INT 21H 

答えて

2

DIVは整数除算命令です。浮動小数点の除算が必要な場合は、FDIVを参照する必要があります。

2

すでに述べたように、DIVは整数除算を実行します。これは整数除算であるため、結果の商と剰余は別々のレジスタペアで使用できます。正確なレジスタは除数のサイズに依存します。

1バイト除数

AX - Dividend 
AH - Remainder 
AL - Quotient 

2バイト除数

DX:AX - Dividend 
DX - Remainder 
AX - Quotient 

4バイト除数

EDX:EAX - Dividend 
EDX - Remainder 
EAX - Quotient 

シンあなたは1バイトの除数 'BL'を使用しています。残りはAHレジスタにあります。 32/5のあなたのケースではALレジスタ値6が含まれ、AHはあなた6.4のあなたの答えを与える0.4ある2/5の残りの部分があることを意味値2を登録します。

あなたは、あなたがFPUオフの2つの値がポップアップ表示されますどのFDIVを呼び出した後、それぞれの値に対して一度、FLD命令を使用してFPUスタック上に二つの値325をロードする必要がありますFPU操作を使用することを決定した場合それらを分割し、その結果をFPUスタックにプッシュします。

結果は、FSTP命令を使用してスタックからメモリアドレスに移動することができます。結果が得られたら、バイナリIEEE浮動小数点表現から画面に表示できる文字列表現に変換する必要があります。

1

あなたは浮動小数点除算を使用する場合は、文字列

にフロートを変換するための多数の方法があるしかし、あなたは唯一の整数の除算を使用して結果を印刷してみたい場合は、小学校に手で割るようにそれを行います。

32/5

上記第1分割後の例を取る:

32/5 = 6 → Print out "6." 
Remainer: 2, multiply it by 10 → 2*10 = 20 
20/5 = 4 → Print out "4" 
Remainder: 0, stop here 

より複雑な分割は、単に各工程後10によって余りを乗算、等上行うことができます。結果が無限大の場合は、十分な精度が得られたら停止します。

もう一つの例:11分の25 = 2.27272727 ...

25/11 = 2 R 3 → 2. 
3*10/11 = 2 R 8 → 2 
8*10/11 = 7 R 3 → 7 
3*10/11 = 2 R 8 → 2 
8*10/11 = 7 R 3 → 7 
and so on... 
関連する問題