masm FPU в fasm FPU не может перевести и не работает

У меня есть этот код в masm для работы с FPU, и он отлично работает

в этом коде я получаю число из двух разных текстовых полей, затем делю их, а затем вывожу результаты в другое текстовое поле.

это локальные данные

LOCAL variable1 :QWORD
LOCAL variable2 :QWORD
LOCAL variable3 :QWORD

LOCAL string1[20]:BYTE
LOCAL string2[20]:BYTE
LOCAL string3[20]:BYTE

это код

invoke GetDlgItemText,hWin,textbox1,addr string1,9
invoke StrToFloat,addr string1,addr variable1

invoke GetDlgItemText,hWin,textbox2,addr string2,9
invoke StrToFloat,addr string2,addr variable2

finit
fld variable1
fld variable2
fdiv
fstp variable3

invoke FloatToStr,variable3,addr string3
invoke SetDlgItemText,hWin,textbox3,addr string3

Я пытаюсь преобразовать код в fasm

это то, что у меня есть до сих пор, но оно не работает, текстовое поле3 просто говорит 0

это данные (это не локальные данные, потому что я еще не научился делать это в fasm)

v1 dq ?
v2 dq ?
v3 dd ?
v4 rb 20

это код

invoke GetDlgItemTextA,[hWin],textbox1,addr v1,100 
invoke GetDlgItemTextA,[hWin],textbox2,addr v2,100 

finit
fld qword [v1]
fld qword [v2]
fdivp
fstp qword [v3]

cinvoke wsprintfA,addr v4,"%u",[v3]
invoke SetDlgItemTextA,[hWin],textbox3,addr v4

Я знаю, что этот код неверен, потому что я не преобразовываю текст в плавающий в начале, но я не знаю, как это сделать.

Я также пробовал более простой вариант, и он тоже не работал

mov [v1],5.3
mov [v2],7.1

finit
fld [v1]
fld [v2]
fdivp
fstp [v3]

cinvoke wsprintfA,addr v4,"%u",[v3]
invoke SetDlgItemTextA,[hWin],maximumoutputpowertext,addr v4

поэтому мой вопрос: может ли кто-нибудь показать мне, как читать число из двух разных текстовых полей, а затем разделять их и возвращать результат в другое текстовое поле, используя код fasm.

благодарю вас


person Darrin Woolit    schedule 04.09.2013    source источник
comment
Я не знаком ни с Windows, ни с Fasm, но переключение на dword для переменной 3 выглядит неправильно, как и %u в вашем преобразовании. Начните с этого и посмотрите, поможет ли это...   -  person Frank Kotler    schedule 04.09.2013
comment
Я не думаю, что это так, потому что я использовал эти 2 строки кода для преобразования необработанных чисел в читаемый текст в других проектах.   -  person Darrin Woolit    schedule 05.09.2013
comment
Одевают. Как это не работает? Я почти уверен, что Fasm хочет rq 1 для неинициализированного числа с двойной точностью (одно из отличий от синтаксиса Nasm) и %f для scanf, printf и им подобных. Printf определенно всегда требует двойной точности, хотя мы говорим %f. Я менее уверен в scanf.   -  person Frank Kotler    schedule 05.09.2013
comment
не могли бы вы показать мне, как это исправить. Я новичок в программировании на ассемблере, если это будет похоже на этот cinvoke wsprintfA, addr v4,% f, addr v3   -  person Darrin Woolit    schedule 05.09.2013
comment
Это выглядит правильно, но я не могу подтвердить. Это работает? Что происходит?   -  person Frank Kotler    schedule 05.09.2013
comment
Я запустил этот код mov [v1],5 mov [v2],9 finit fld [v1] fld [v2] fmulp fstp [v3] cinvoke wsprintfA,addr v4,%f,addr v3 invoke SetDlgItemTextA,[hWin],maximumoutputpowertext, addr v4, и это дало мне f, также используя qword перед инструкциями fpu, также дало мне f   -  person Darrin Woolit    schedule 05.09.2013
comment
Я также добавил этот код .if [v3] =0, вызовите MessageBoxExA, NULL, эй, эй, NULL .endif, и он дал мне окно сообщений. для меня это говорит мне, что 5 строк кода fpu не работают   -  person Darrin Woolit    schedule 05.09.2013
comment
Я только что снова посмотрел wsprintf по адресу msdn.microsoft.com/en-us/library/windows/desktop/ это не f, так что это может объяснить вывод f, но это все еще не объясняет v3 = 0   -  person Darrin Woolit    schedule 05.09.2013
comment
В синтаксисе Nasm mov [v1]. 5.0 — десятичная точка указывает на плавающую запятую. Подозреваемый Фасм такой же(?). Где Джон Фаунд, когда он нам нужен? :)   -  person Frank Kotler    schedule 05.09.2013
comment
@FrankKotler - я здесь. :) ИМО, вопрос не очень хорошо задан. Собственно в чем вопрос? mov [v1], 5.0 не будет работать, потому что вы не можете хранить непосредственные константы размером более 32 бит. mov dword [v1], 5.0 работает нормально. В 64-битном контексте mov rax, 5.0 | mov [v1], rax тоже работает.   -  person johnfound    schedule 05.09.2013


Ответы (1)


В продемонстрированном коде есть несколько проблем.

Сначала непонятно, что такое StrToFloat процедура? Он импортирован из какой-то DLL, является частью кода или какой-то другой библиотеки?

Если эта процедура импортируется, ее также необходимо импортировать в программу FASM. В противном случае его можно написать с нуля или портировать в виде исходного кода из программы MASM.

Немедленной остановкой здесь является инструкция mov [v1], FLOAT_CONSTANT. Причина в том, что v1 является переменной qword, а mov может перемещать только непосредственные значения dword (даже в 64-битной среде).

mov dword [v1], 5.0 работает нормально, но, конечно, это не то, что нужно ОП. Плавающие константы qword также могут быть определены сразу во время компиляции: v1 dq 3.2

Если мы действительно хотим установить некоторую плавающую константу qword во время выполнения, мы должны сделать это двумя инструкциями следующим образом:

    a = 5.3

    mov  dword [var], (a and $ffffffff)
    mov  dword [var+4], (a shr 32)

    var dq ?

Исходный код FPU в синтаксисе FASM будет таким:

    finit
    fld  [variable1]
    fdiv [variable2]
    fstp [variable3]
person johnfound    schedule 05.09.2013
comment
вопрос в том, как я могу прочитать одно число из одного текстового поля, другое число из другого текстового поля, умножить их с помощью FPU, а затем показать результаты в третьем текстовом поле - person Darrin Woolit; 05.09.2013
comment
strtofloat - это особая библиотека masm. в основном мне нужна помощь с 2 частями. первая часть — чтение текста из текстового поля и преобразование его в число с плавающей запятой для отправки в FPU. вторая часть использует FPU для умножения. У меня уже есть третья часть кода, которая должна преобразовать число с плавающей запятой в текст. спасибо - person Darrin Woolit; 05.09.2013
comment
в основном мне просто нужно узнать, как преобразовать эти 5 строк инструкций fpu из masm в fasm - person Darrin Woolit; 05.09.2013
comment
@DarrinWoolit - про код FPU - все просто - ответ редактируется. - person johnfound; 05.09.2013
comment
но это то, что я уже устал, и это не сработало. Я пробовал finit fld [v1] fld [v2] fdivp fstp [v3], если я меняю его на fdiv, он говорит, что недопустимый операнд - person Darrin Woolit; 05.09.2013
comment
@DarrinWoolit Извините, вероятно, странный синтаксис masm. Ответ снова отредактирован и теперь ИМХО правильный. :) - person johnfound; 05.09.2013
comment
Я заставил его отображать целые числа, но не числа с плавающей запятой mov [v5], 10.1 mov [v6], 5.2 finit fild dword [v5] fild dword [v6] fdivp fistp dword [esp] ; результат теперь в eax pop eax mov [v3],eax cinvoke wsprintfA,addr v4,%u,[v3] вызывает SetDlgItemTextA,[hWin],maximumoutputpowertext,addr v4 это дает мне 1 как мне получить 1.94230769231 - person Darrin Woolit; 05.09.2013