2017-10-19 23 views
2

J'ai deux problèmes avec mon code d'assemblage. Selon les directives, je dois faire tout cela en utilisant l'opération à virgule flottante. Cela dit, il semble que je ne reçois pas la bonne réponse à partir de cela, et je ne sais pas ce qui ne va pas. La fonction est la suivante: y = 3x^3 + 2.7x^2-74x + 6.3. Je dois donner X, et il est supposé aller dans cette fonction et la sortie Y.Le virgule flottante ne sort pas la bonne réponse

Le code est également supposé se terminer lorsque je tape N, mais il continue à me donner une erreur de virgule flottante.

EDIT: J'ai trouvé mon problème avec la fonction, mais chaque fois que je tape N, elle ne saute pas et ne termine pas mon code.

input  REAL8 ?   ; user input 
result  REAL8 ?   ; result of calculation 
three  REAL8 3.0  ; constant 
twoSeven REAL8 2.7  ; constant 
seventyFour REAL8 74.0  ; constant 
sixThree REAL8 6.3  ; constant 


prompt BYTE "Enter an Integer or n to quit",0dh,0ah,0 
again BYTE "Would you like to go again? Y/N?", 0dh, 0ah, 0 
no  BYTE "N",0dh,0ah,0 
rprompt BYTE "The result of the calculation is ",0 

.code 
main PROC 
result_loop: 
finit     ; initialize the floating point stack 
mov edx,OFFSET prompt ; address of message 
call WriteString  ; write prompt 
call ReadFloat   ; read the input value 
fst input    ; save input of user 


fmul three    ; multiplies by three 
fadd twoSeven   ; Adds by 2.7 
fmul input    ; multiplies by the input 
fsub seventyFour  ; subtracts 74 
fmul input    ; multiplies by input 
fadd sixThree   ; adds by three 

fst result    ; puts value in area 
mov edx,OFFSET rprompt ; address of message 
call WriteString  ; write prompt 
call WriteFloat   ; writes the result 
call CrLf    ; prints new line 

mov edx, OFFSET again 
call WriteString 
Call ReadString 

cmp edx, 'n'   ; compares the input to n 
je end_if    ; jumps if its equal to n 
jmp result_loop   ; jumps back to the top 

end_if:     ; end statment 
call WaitMsg   ; 
exit     ; 
main ENDP 
END main 
+0

entrée 'FCOMI, « n'' n'a aucun sens. Vous voulez probablement lire une chaîne, la comparer à '" n "', et si ce n'est pas égal, la convertir en float. – Jester

+0

@jester J'ai fait un tweak mineur au code, en ajoutant input2, et en essayant de configurer la comparaison entre n et l'entrée, mais je suis toujours à court. – Unleaver

+0

'' n''est pas un nombre, tu le réalises, non? Vous ne pouvez pas le lire comme un flotteur. – Jester

Répondre

1
Call ReadString 
cmp edx, 'n'   ; compares the input to n 
je end_if    ; jumps if its equal to n 
jmp result_loop   ; jumps back to the top 
end_if:     ; end statment 

ReadString ne fonctionne pas la façon dont vous pensez qu'il fonctionne.

Vous devez le passer dans EDX un pointeur vers un tampon qui peut stocker l'entrée. Vous devez également indiquer dans ECX combien de caractères vous pouvez autoriser ce tampon à contenir.

Lorsque ReadString sera de retour, vous obtiendrez EAX le nombre de caractères effectivement entrés. Donc, définissez un tampon et configurez les paramètres.

Ensuite, votre code devient:

mov edx, offset InBuffer 
mov ecx, 1 
Call ReadString 
test eax, eax 
jz result_loop  ; Jump back if no input given! 
mov al, [edx]  ; Get the only character 
or al, 32   ; Make LCase to accept 'n' as well as 'N' 
cmp al, 'n'   ; compares the input to n 
jne result_loop  ; jumps back if its not equal to n 
end_if:    ; end statment