2017-10-19 15 views
0

Bonne journée. Mon projet consiste à calculer l'IMC en utilisant des pouces et des livres. Ainsi, l'utilisateur saisira sa taille en pouces et son poids en livres. J'ai déjà appris à diviser et à multiplier. Je ne sais pas comment inclure les chiffres après la virgule après la division, parce que je dois multiplier à nouveau par 703, et seul le nombre entier est multiplié par 703.Assembly Language: Comment inclure les décimales dans l'instruction suivante après la division?

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 

Toute aide serait grandement appréciée merci !

+2

En supposant l'architecture x86, vous effectuez une division entière (et probablement aussi une multiplication). L'arithmétique à virgule flottante dans l'assembleur utilise des instructions spéciales (et des registres spéciaux). –

+0

Je ne trouve aucun bon programme de référence utilisant l'arithmétique en virgule flottante. J'ai trouvé les instructions mais je ne trouve pas de programme les utilisant. –

+5

Si vous multipliez avant de diviser, vous pouvez tout faire avec des nombres entiers. – prl

Répondre

1

En utilisant la notation de point fixe, pour obtenir un résultat de la division avec une partie fractionnaire, vous pouvez écrire:

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)} 

Mais, comme le dit PRL, vaut mieux d'abord multiplier puis diviser. Cependant, la division est toujours accompagnée de deux instructions "div" pour cette raison: lorsque le résultat d'une instruction DIV ne peut pas être contenu dans le registre d'AX, un appel d'interruption "division par zéro" est appelé. Après MUL-vous un numéro 32 bits DX: AX, qui peut être divisé par n2 comme suit:

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} 

De plus, pour faire un pouce à cm conversion (et similaire), vous pouvez multiplier pour un point fixe nombre qui représente le facteur d'échelle:

{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)}