汇编语言:如何在分割后的下一条指令中包含小数位?

时间:2017-10-19 07:34:13

标签: assembly floating-point

美好的一天。我的项目是用英寸和磅来计算BMI。因此,用户将输入他的身高(英寸)和体重(磅)。我已经学会了划分和倍增。我只是不知道如何在分割后包含小数点,因为我必须再将它乘以703,并且只有整数乘以703。

n1 dw 0
n2 dw 0

;gets input from user

xor dx, dx
mov ax, n1    ;n1 is the weight and n2 is the height so i'm dividing them
mov bx, n2
div bx
mov bx, ax    ;answer is stored in bx

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

使用定点表示法,要获得带小数部分的除法结果,您可以写:

 Mov   AX,n1
 XOr   CX,CX
{AX:CX contains the integer number to divide by n2}
 Mov   BX,n2
{BX contains the integer number that divides}
 XOr   DX,DX
 Div   BX
 XChg  AX,CX
 Div   BX
{CX:AX contains the result of division (AX is the fractional part)}

但是,正如prl所说,首先是乘法然后除以。 然而,该部门总是与两个" div"出于这个原因的说明:当DIV指令的结果不能包含在AX的寄存器中时,"除以零"调用中断的调用。 在MUL之后你有一个32位数字DX:AX,可以按如下方式除以n2:

 Mov   CX,AX
 MOV   AX,DX
{AX:CX contains the result of multiplication}
 Mov   BX,n2
{BX contains the integer number that divides}
 XOr   DX,DX
 Div   BX
 XChg  AX,CX
 Div   BX
{CX:AX contains the result of division}

此外,要进行英寸到厘米的转换(和类似),您可以乘以代表比例因子的固定点数:

{cm=inch*028A3DH (2.54)}

 MOV AX,08A3DH
 MOV BX,Inch
 XOR CX,CX
 MUL BX
 ADD DX,BX
 ADC CX,CX
 ADD DX,BX
 ADC CX,0

{CX:DX:AX= cm (AX is the fractional part)}