Решение функции и отображение решения в консоли - Assembler
Формулировка задачи:
Дана функция, построить по ней программу. Вот я значит попытался что-то тут написать, но я не знаю, как всё это вывести, ответ, как я понимаю, должен быть _y... плюса да, надо это всё ещё через консоль вывести, как именно это сделать я не знаю.
.386 .model flat,stdcall option casemap:none include d:\masm32\include\kernel32.inc includelib d:\masm32\liv\kernel32.lib .data _x dw -4 _a dw 2 _b dw 3 _c dw 4 _y dw ? stdout dd ? cWritten dd ? .code start: invoke GetStdHandle, -11 mov stdout, eax push _x mov ax,_x .IF ax>0 mov dx,ax .ELSE .IF ax<0 mul ax,-1 mov dx,ax pop ax .IF dx<=2 mul ax add _b mul ax add _c .ELSE .IF dx<-2 add a,b add c .ELSE .IF dx>2 mul _a sub _b mul _c .ENDIF invoke WriteConsoleA, stdout, ADDR_y, sizeof _y, ADDR cWritten, 0 invoke ExitProcess, 0 end start
Решение задачи: «Решение функции и отображение решения в консоли»
textual
Листинг программы
.386 .model flat,stdcall option casemap:none include \masm32\include\kernel32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\msvcrt.lib includelib \masm32\liv\kernel32.lib .data _x dd ? _a dd 2 _b dd 3 _c dd 4 _y dd ? tpt db 'Result _y = %d',0 req db 'Enter X:',0 treq db '%d',0 tpts db '%s',0 .code start: invoke crt_printf, ADDR tpts, ADDR req invoke crt_scanf, ADDR treq, ADDR _x mov eax, [_x] cmp eax, 2 jle @F ; _x > 2 imul eax, [_a] ; eax = x*a mov ebx, [_b] imul ebx, [_c] ; ebx = b*c add eax, ebx ; eax =x*a+b*c jmp done ; @@: cmp eax, -2 jl @F ; -2 <= x <= 2 mov ebx, eax imul eax, eax ; imul eax, [_a] ; eax = x^2*a add eax, [_c] imul ebx, [_b] add eax, ebx ; eax = x^2*2+b*x+c jmp done ; x < -2 @@: mov eax, [_a] add eax, [_b] add eax, [_c] ; done: invoke crt_printf, ADDR tpt, eax invoke ExitProcess, 0 end start
Объяснение кода листинга программы
- .386 - идентификатор модели языка Assembler
- .model flat,stdcall - описание модели памяти и способа вызова функций
- option casemap:none - настройка соответствия регистра букв и символов
- include \masm32\include\kernel32.inc - подключение файла с определениями функций API Windows
- include \masm32\include\msvcrt.inc - подключение файла с определениями функций API Windows
- include \masm32\macros\macros.asm - подключение файла с макросами
- includelib \masm32\lib\msvcrt.lib - подключение библиотеки с функциями API Windows
- includelib \masm32\liv\kernel32.lib - подключение библиотеки с функциями API Windows
- .data - начало блока данных
- _x dd ? - объявление переменной типа double с именем
_x
- _a dd 2 - объявление переменной типа double с именем
_a
- _b dd 3 - объявление переменной типа double с именем
_b
- _c dd 4 - объявление переменной типа double с именем
_c
- _y dd ? - объявление переменной типа double с именем
_y
- tpt db
Result _y = %d
,0 - определение строки для вывода результата - req db
Enter X:
,0 - определение строки для запроса значения переменной X - treq db
%d
,0 - определение строки для ввода значения переменной X - tpts db
%s
,0 - определение строки для вывода значения переменной Y - .code - начало блока кода
- start: - определение точки входа в программу
- invoke crt_printf, ADDR tpts, ADDR req - вывод строки запроса на ввод значения X
- invoke crt_scanf, ADDR treq, ADDR _x - ввод значения X из консоли
- mov eax, [_x] - присвоение значения X переменной EAX
- cmp eax, 2 - сравнение значения X с 2
- jle @F - переход к блоку кода для случая, когда X <= 2
- imul eax, [_a] - умножение значения X на A
- mov ebx, [_b] - присвоение значения B переменной EBX
- imul ebx, [_c] - умножение значения B на C
- add eax, ebx - сложение результатов умножения X на A и B на C
- jmp done - переход к завершению программы
- @@: cmp eax, -2 - сравнение результата предыдущей операции с -2
- jl @F - переход к блоку кода для случая, когда X < -2
- mov eax, [_a] - присвоение значения A переменной EAX
- add eax, [_b] - сложение значения A с B
- add eax, [_c] - сложение результата предыдущей операции с C
- done: invoke crt_printf, ADDR tpt, eax - вывод результата на экран
- invoke ExitProcess, 0 - завершение работы программы
- end start - завершение блока кода
- .data - конец блока данных
- .code - конец блока кода
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д