Решение функции и отображение решения в консоли - 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

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

  1. .386 - идентификатор модели языка Assembler
  2. .model flat,stdcall - описание модели памяти и способа вызова функций
  3. option casemap:none - настройка соответствия регистра букв и символов
  4. include \masm32\include\kernel32.inc - подключение файла с определениями функций API Windows
  5. include \masm32\include\msvcrt.inc - подключение файла с определениями функций API Windows
  6. include \masm32\macros\macros.asm - подключение файла с макросами
  7. includelib \masm32\lib\msvcrt.lib - подключение библиотеки с функциями API Windows
  8. includelib \masm32\liv\kernel32.lib - подключение библиотеки с функциями API Windows
  9. .data - начало блока данных
  10. _x dd ? - объявление переменной типа double с именем _x
  11. _a dd 2 - объявление переменной типа double с именем _a
  12. _b dd 3 - объявление переменной типа double с именем _b
  13. _c dd 4 - объявление переменной типа double с именем _c
  14. _y dd ? - объявление переменной типа double с именем _y
  15. tpt db Result _y = %d,0 - определение строки для вывода результата
  16. req db Enter X:,0 - определение строки для запроса значения переменной X
  17. treq db %d,0 - определение строки для ввода значения переменной X
  18. tpts db %s,0 - определение строки для вывода значения переменной Y
  19. .code - начало блока кода
  20. start: - определение точки входа в программу
  21. invoke crt_printf, ADDR tpts, ADDR req - вывод строки запроса на ввод значения X
  22. invoke crt_scanf, ADDR treq, ADDR _x - ввод значения X из консоли
  23. mov eax, [_x] - присвоение значения X переменной EAX
  24. cmp eax, 2 - сравнение значения X с 2
  25. jle @F - переход к блоку кода для случая, когда X <= 2
  26. imul eax, [_a] - умножение значения X на A
  27. mov ebx, [_b] - присвоение значения B переменной EBX
  28. imul ebx, [_c] - умножение значения B на C
  29. add eax, ebx - сложение результатов умножения X на A и B на C
  30. jmp done - переход к завершению программы
  31. @@: cmp eax, -2 - сравнение результата предыдущей операции с -2
  32. jl @F - переход к блоку кода для случая, когда X < -2
  33. mov eax, [_a] - присвоение значения A переменной EAX
  34. add eax, [_b] - сложение значения A с B
  35. add eax, [_c] - сложение результата предыдущей операции с C
  36. done: invoke crt_printf, ADDR tpt, eax - вывод результата на экран
  37. invoke ExitProcess, 0 - завершение работы программы
  38. end start - завершение блока кода
  39. .data - конец блока данных
  40. .code - конец блока кода

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


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

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

8   голосов , оценка 3.5 из 5