; (a – d)/b + d при a=12; b=17; d=2110
.486
.model flat, stdcall
option casemap :none ; case sensitive
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\macros\macros.asm
include \masm32\include\Fpu.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Fpu.lib
.data
a db "12",0 ; текстовая запись чисел
b db "17",0
d db "2110",0
a_real dt 0 ; не обязательно - храним преобразованные в вещественные
b_real dt 0 ; можно было обойтись, но так проще и нагляднее
d_real dt 0
result db 32 dup(0) ; место для результата
res_title db "Result",0 ; заголовок окна
.code
start:
invoke FpuAtoFL, ADDR a, ADDR a_real, DEST_MEM ; преобразовываем строку в вещественное
invoke FpuAtoFL, ADDR b, ADDR b_real, DEST_MEM
invoke FpuAtoFL, ADDR d, ADDR d_real, DEST_MEM
; вычитаем из преобразованного преобразованные и запоминаем в числовом процессоре
; см. Help -> FPU Lib Help -> Available Functions
; источник1 = вещественное, источник2 = вещественное, результат в сопроцессоре
; 3 параметр поэтому игнорируется
invoke FpuSub, ADDR a_real, ADDR d_real, 0, SRC1_REAL or SRC2_REAL or DEST_FPU
; Эти аналогчно, но результат предыдущего в сопроцессоре
invoke FpuDiv, 0, ADDR b_real, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
invoke FpuAdd, 0, ADDR d_real, 0, SRC1_FPU or SRC2_REAL or DEST_FPU
; Преобразование результата в сопроцессоре в строку
; первый параметр игнорируется (в сопроцессоре источник),
; второй - сколько чисел после десятичной точки
; третий - куда сохранить
invoke FpuFLtoA, 0, 2, ADDR result, SRC1_FPU or SRC2_DIMM
; это тривально, можно было и с print сделать, но тогда нужно будет организовывать задержку
invoke MessageBox, 0, ADDR result, ADDR res_title, MB_OK
exit
end start