Вычисление выражения по формуле - Assembler

Узнай цену своей работы

Формулировка задачи:

помогиите написать прогу на ассемблере, реализующую вычисление значения x по следующей формуле: x = (a / 3 + b * 2) – d / c.

Решение задачи: «Вычисление выражения по формуле»

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
        aszCrLf         db      0Dh, 0Ah, 0
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
        aszResult       db      0Dh, 0Ah, "The result: %d", 0Dh, 0Ah, 0
 
        _A              dd      11
        _B              dd      -17
        _C              dd      -5
        _D              dd      27
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        BufLen          dd      ?
        Buffer          db      1024 dup(?)
        Result          dd      ?
.code
 
start   proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
 
        mov     eax,    [_A]
        mov     ebx,    3
        cdq
        idiv    ebx
 
        mov     ebx,    [_B]
        imul    ebx,    ebx,    2
 
        add     ebx,    eax
 
        mov     eax,    [_D]
        mov     ecx,    [_C]
        cdq
        idiv    ecx
 
        sub     ebx,    eax
 
        mov     [Result],       ebx
 
        ;вывод результата
        invoke  wsprintf, ADDR Buffer, ADDR aszResult, [Result]
        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
start   endp
 
end start

Объяснение кода листинга программы

  1. .486 - это версия Assembler, которая описывает, что данный код написан для процессора Intel 80486.
  2. .model flat, stdcall - это директивы, которые определяют модель памяти и стиль вызова функций. Здесь используется модель flat, что означает, что вся память видима и доступна для использования, и стиль вызова функций stdcall, который является стандартным для Windows API.
  3. option casemap :none - это директива, которая отключает преобразование регистра символов при сравнении строк.
  4. include \masm32\include\windows.inc - это директива, которая включает в код функции и определения, относящиеся к Windows API.
  5. include \masm32\include\user32.inc - это директива, которая включает в код функции и определения, относящиеся к API пользовательского интерфейса Windows.
  6. include \masm32\include\kernel32.inc - это директива, которая включает в код функции и определения, относящиеся к API ядра Windows.
  7. include \masm32\include\masm32.inc - это директива, которая включает в код функции и определения, относящиеся к внутренним функциям ассемблера MASM32.
  8. includelib \masm32\lib\user32.lib - это директива, которая добавляет библиотеку пользовательского интерфейса Windows в связку либкода.
  9. includelib \masm32\lib\kernel32.lib - это директива, которая добавляет библиотеку ядра Windows в связку либкода.
  10. includelib \masm32\lib\masm32.lib - это директива, которая добавляет библиотеку внутренних функций ассемблера MASM32 в связку либкода.
  11. aszCrLf db 0Dh, 0Ah, 0 - это строка, которая содержит символы новой строки и возврата каретки.
  12. aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah, Press Left Alt to exit, 0 - это строка, которая содержит сообщение Press Left Alt to exit.
  13. aszResult db 0Dh, 0Ah, The result: %d, 0Dh, 0Ah, 0 - это строка, которая содержит сообщение The result: %d, где %d будет заменен на результат вычислений.
  14. _A dd 11 - это переменная, которая содержит значение 11.
  15. _B dd -17 - это переменная, которая содержит значение -17.
  16. _C dd -5 - это переменная, которая содержит значение -5.
  17. _D dd 27 - это переменная, которая содержит значение 27.
  18. hConsoleOutput HANDLE ? - это переменная, которая содержит описатель объекта ввода/вывода консоли для вывода.
  19. hConsoleInput HANDLE ? - это переменная, которая содержит описатель объекта ввода/вывода консоли для ввода.
  20. BufLen dd ? - это переменная, которая содержит длину буфера.
  21. Buffer db 1024 dup(?) - это переменная, которая содержит буфер для вывода.
  22. Result dd ? - это переменная, которая содержит результат вычислений.

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


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

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

7   голосов , оценка 4.143 из 5