Вычисление выражения по формуле - 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
Объяснение кода листинга программы
- .486 - это версия Assembler, которая описывает, что данный код написан для процессора Intel 80486.
- .model flat, stdcall - это директивы, которые определяют модель памяти и стиль вызова функций. Здесь используется модель
flat
, что означает, что вся память видима и доступна для использования, и стиль вызова функцийstdcall
, который является стандартным для Windows API. - option casemap :none - это директива, которая отключает преобразование регистра символов при сравнении строк.
- include \masm32\include\windows.inc - это директива, которая включает в код функции и определения, относящиеся к Windows API.
- include \masm32\include\user32.inc - это директива, которая включает в код функции и определения, относящиеся к API пользовательского интерфейса Windows.
- include \masm32\include\kernel32.inc - это директива, которая включает в код функции и определения, относящиеся к API ядра Windows.
- include \masm32\include\masm32.inc - это директива, которая включает в код функции и определения, относящиеся к внутренним функциям ассемблера MASM32.
- includelib \masm32\lib\user32.lib - это директива, которая добавляет библиотеку пользовательского интерфейса Windows в связку либкода.
- includelib \masm32\lib\kernel32.lib - это директива, которая добавляет библиотеку ядра Windows в связку либкода.
- includelib \masm32\lib\masm32.lib - это директива, которая добавляет библиотеку внутренних функций ассемблера MASM32 в связку либкода.
- aszCrLf db 0Dh, 0Ah, 0 - это строка, которая содержит символы новой строки и возврата каретки.
- aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah,
Press Left Alt to exit
, 0 - это строка, которая содержит сообщениеPress Left Alt to exit
. - aszResult db 0Dh, 0Ah,
The result: %d
, 0Dh, 0Ah, 0 - это строка, которая содержит сообщениеThe result: %d
, где %d будет заменен на результат вычислений. - _A dd 11 - это переменная, которая содержит значение 11.
- _B dd -17 - это переменная, которая содержит значение -17.
- _C dd -5 - это переменная, которая содержит значение -5.
- _D dd 27 - это переменная, которая содержит значение 27.
- hConsoleOutput HANDLE ? - это переменная, которая содержит описатель объекта ввода/вывода консоли для вывода.
- hConsoleInput HANDLE ? - это переменная, которая содержит описатель объекта ввода/вывода консоли для ввода.
- BufLen dd ? - это переменная, которая содержит длину буфера.
- Buffer db 1024 dup(?) - это переменная, которая содержит буфер для вывода.
- Result dd ? - это переменная, которая содержит результат вычислений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д