Нужна помощь в умножении с использованием FPU в сборке x86

По сути, я хочу умножить введенное пользователем значение на заданное значение. Код работает при умножении на пользовательские входы вместе, однако, если я задаю «число» на значение (например: 6), он не будет выполнять умножение и возвращает 0.

_start:   
finit                           ; init. the float stack

output inprompt                 ; get radius number 
input  number, 12               ; get (ascii) value of this number
pushd  NEAR32 PTR number        ; push address of number
call   atofproc                 ; convert ASCII to float in ST

fld    st                       ; value1 in ST and ST(1)

mov number, 6

; If I substitute the line above by the two lines below, it works:
; output inprompt, 0
; input number, 12   

pushd  NEAR32 PTR number        ; push address of number
call   atofproc                 ; convert ASCII to float in ST

fmul                            ; value1*value2 in ST
fst   prod_real                 ; store result


push prod_real                  ; convert the results for printing

lea eax, sum_out                ; get the ASCII string address
push eax
call ftoaproc

output outprompt

person Rijn    schedule 23.04.2016    source источник
comment
Вы уверены, что это 64-битный код MASM? Похоже на 32-битную. Я спрашиваю из-за тега, который вы добавили.   -  person Michael Petch    schedule 24.04.2016
comment
Вы не выталкиваете стек FP, когда закончите. Возможно, вам следует использовать fmulp и fstp. Я также не понимаю, почему вы дублируете первое значение с помощью fld st. Кроме того, аргумент ftoaproc может быть установлен с push offset sum_out, если только вам не нужно использовать LEA для создания кода, независимого от позиции, с использованием адресации относительно RIP. Кроме того, вместо того, чтобы сохранять в prod_real, а затем помещать его в стек, вы можете освободить место в стеке и сохранить в него.   -  person Peter Cordes    schedule 24.04.2016


Ответы (1)


Вы пытаетесь преобразовать 6 из ASCII в число с плавающей запятой, а 6 является непечатаемым символом в ASCII, поэтому его нельзя преобразовать в число с плавающей запятой. Вам нужно изменить 6 на 54, что является ASCII-представлением символа '6'. Или вы можете передать константу с плавающей запятой 6.0 и удалить вызов atofproc, если хотите.

person Carey Gregory    schedule 23.04.2016