Задание:
ввести 2 дробных числа и сложить их и вывести на консоль и в MessageBox.
.686; Директива определения типа микропроцессора
. Model flat, stdcall; задачи линейной модели памяти
; И соглашения ОС Windows
option casemap: none; отличие малых и больших букв
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\fpu.inc
include \masm32\include\msvcrt.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\fpu.lib
include \ masm32 \ include \ windows.inc
include \ masm32 \ include \ kernel32.inc
include \ masm32 \ include \ fpu.inc
include \ masm32 \ include \ user32.inc
include \ masm32 \ include \ msvcrt.inc
includelib \ masm32 \ lib \ user32.lib
includelib \ masm32 \ lib \ kernel32.lib
includelib \ masm32 \ lib \ msvcrt.lib
includelib \ masm32 \ lib \ fpu.lib
. Data ;директива определения данных
frmt db "% d",0
buf db 30 dup (0)
buf2 db 20 dup (0)
stdout DWORD?
stdin DWORD?
const dd 10
temp1 dd 0.0
temp2 dd 0.5
temp3 dd 0.5
temp4 dd 0.5
identif1 dd 1
identif2 dd 1
st1 db "Vvedyte a",0
st2 db "Vvedyte b",0
st3 db "Результат вычисления a + b",
st4 db "a + b ="
. Code; директива начала кода
_start:
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov stdout,eax
invoke GetStdHandle,STD_INPUT_HANDLE
mov stdin,eax
invoke WriteConsoleA, stdout, ADDR st1, 11, NULL,NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead,ULL ; чтения числа как символ
invoke crt_atoi, ADDR buf ; преобразовать символ в число
mov temp1, eax
lea edi, buf
mov ecx, 30
m1:
mov al, '.'
mov bl, [edi]
xor al, bl
jz m2
inc edi
loop m1
m2:
lea esi, buf2
mov ecx, 20
m3:
inc edi
mov ebx, [edi]
mov [esi], ebx
inc esi
loop m3
invoke crt_atoi, ADDR buf2 ;преобразовать символ в число
mov temp2, eax
id1:
mov eax, identif1
mov ebx, const
mul ebx
SHL edx, 16; делаем сдвиг на 16
mov dx, ax
mov identif1, edx
mov ecx, temp2
sub ecx, edx
jc id_end1
jmp id1
id_end1:
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov stdout, eax
invoke GetStdHandle, STD_INPUT_HANDLE
mov stdin, eax
invoke WriteConsoleA, stdout, ADDR st2, 11, NULL, NULL; VIVOD ST1
invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтения числа как символ
invoke crt_atoi, ADDR buf; преобразовать символ в число
mov temp3, eax
lea edi, buf
mov ecx, 30
m4:
mov al, '.'
mov bl, [edi]
xor al, bl
jz m5
inc edi
loop m4
m5:
lea esi, buf2
mov ecx, 20
m6:
inc edi
mov ebx, [edi]
mov [esi], ebx
inc esi
loop m6
invoke crt_atoi, ADDR buf2; преобразовать символ в число
mov temp4, eax
id2:
mov eax, identif2
mov ebx, const
mul ebx
SHL edx, 16;делаем сдвиг на 16
mov dx, ax
mov identif2, edx
mov ecx, temp4
sub ecx, edx
jc id_end2
jmp id2
id_end2:
finit
fild temp1
fiadd temp3
fild temp2
fidiv identif1
fadd st (0), st (1)
fild temp4
fidiv identif2
fadd st (0), st (1)
invoke FpuFLtoA, 0, 10, ADDR st4, SRC1_FPU or SRC2_DIMM
invoke MessageBox, NULL, addr st4, addr st3, MB_OK
invoke ExitProcess, NULL ;возврат управления Windows
; И освобождения ресурсов
end _start; директива окончания программы с именем start
Результат работы: