Вычисление выражения по формуле - 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5