Вычисление выражения по формуле - Assembler (248301)
Формулировка задачи:
Нужно решить задачу на ассемблере, самую простую.. а я в нем не жу жу.
Z=a^2*sqrt((c*d)/b) Вот задача.
Решение задачи: «Вычисление выражения по формуле»
textual
Листинг программы
.486 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data aszPromptA db 0Dh, 0Ah, 'Enter the A: ', 0 aszPromptB db 0Dh, 0Ah, 'Enter the B: ', 0 aszPromptC db 0Dh, 0Ah, 'Enter the C: ', 0 aszPromptD db 0Dh, 0Ah, 'Enter the D: ', 0 aszMsgResult db 0Dh, 0Ah, 'Result: ', 0 aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0 .data? var_A dq ? var_B dq ? var_C dq ? var_D dq ? Result dq ? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? BufLen dd ? Buffer db 1024 dup(?) .code ;ввод числа в формате double ReadFloat proc lptrPrompt:DWORD, iLengthPrompt:DWORD, lptrFloat:DWORD invoke WriteConsole, hConsoleOutput, lptrPrompt,\ iLengthPrompt, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL lea esi, [Buffer] ;удаление из буфера add esi, [BufLen] ;символов перевода строки mov [esi-2],word ptr 0 finit invoke StrToFloat, ADDR Buffer, lptrFloat ret ReadFloat endp main proc ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax ;очистка экрана invoke ClearScreen ;ввод A invoke ReadFloat, ADDR aszPromptA, \ LENGTHOF aszPromptA - 1, \ ADDR var_A ;ввод B invoke ReadFloat, ADDR aszPromptB, \ LENGTHOF aszPromptB - 1, \ ADDR var_B ;ввод C invoke ReadFloat, ADDR aszPromptC, \ LENGTHOF aszPromptC - 1, \ ADDR var_C ;ввод D invoke ReadFloat, ADDR aszPromptD, \ LENGTHOF aszPromptD - 1, \ ADDR var_D ;вычисление с использованием трансцендентных команд сопроцессора finit fld [var_A] ;a^2 fmul st(0), st(0) fld [var_C] fld [var_D] fmulp st(1), st(0) ;c*d fld [var_B] ;c*d/b fdivp st(1), st(0) fsqrt ;sqrt(c*d/b) fmulp st(1), st(0) ;a^2*sqrt(c*d/b) ;сохранение результата fstp [Result] ;вывод результата на экран invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\ LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL invoke FloatToStr2, [Result], ADDR Buffer invoke StrLen, ADDR Buffer mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL ;ожидание нажатия Left Alt invoke WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\ LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL @@WaitForLAlt: invoke GetAsyncKeyState, VK_LMENU and eax, 8000h jz @@WaitForLAlt ;завершение программы invoke ExitProcess, 0 main endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д