Разработайте программу, вычисляющую заданное целочисленное выражение - Assembler/FASM

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

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

ос (windows 7 32 bit) Заранее спасибо

Решение задачи: «Разработайте программу, вычисляющую заданное целочисленное выражение»

textual
Листинг программы
format PE console 4.0
entry start
 
include 'win32ax.inc'
 
section '.text' code readable executable
 
  start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     [hConsoleInput],        eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     [hConsoleOutput],       eax
 
        mov     eax,    [L]     ;(L-A)^2
        sub     eax,    [A]
        imul    eax
 
        idiv    dword [C]       ;(L-A)^2 / C
 
        add     eax,    [K]     ;(L-A)^2 / C + K
        sub     eax,    [L]     ;(L-A)^2 / C + K - L
 
        mov     ebx,    eax
 
        mov     eax,    [C]     ; C/2
        cdq
        mov     ecx,    2
        idiv    ecx
 
        add     eax,    ebx     ;(L-A)^2 / C + K - L + C/2
 
        mov     [Result],       eax
        cinvoke printf, aszFmt, [Result]
        ;ожидание нажатия ENTER
        cinvoke printf, aszPressEnter
        invoke  ReadConsole, [hConsoleInput], Buffer,\
                100, BufLen, NULL
        invoke  ExitProcess, 0
 
section '.data' data readable writeable
        aszFmt  db      'Result=%d', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
 
        A               dd      1234
        L               dd      -456
        C               dd      789
        K               dd      -654
 
section '.bss' readable writeable
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
        hConsoleOutput  dd      ?
        hConsoleInput   dd      ?
 
        Result          dd      ?
 
section '.idata' import data readable writeable
 
        library kernel32,'KERNEL32.DLL',\
                user32,'USER32.DLL',\
                msvcrt, 'msvcrt.dll'
 
        include 'api\kernel32.inc'
        include 'api\user32.inc'
        import  msvcrt,\
                printf, 'printf'

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

  1. Получение описателей ввода и вывода консоли: Здесь программа получает описатели для стандартного ввода и вывода, используя функции GetStdHandle и STD_INPUT_HANDLE и STD_OUTPUT_HANDLE. Эти функции позволяют программе взаимодействовать с консолью.
  2. Вычисление выражения (L-A)^2 / C + K - L: Здесь выполняется основная вычислительная работа программы. Сначала вычисляется значение выражения (L-A)^2, затем оно делится на значение переменной C, и результат сохраняется в переменной eax. Затем к этому значению добавляется значение переменной K, и результат сохраняется в переменной eax. Затем от этого значения отнимается значение переменной L, и результат сохраняется в переменной ebx.
  3. Вывод результата: Здесь программа выводит результат вычислений на консоль, используя функцию printf. Формат вывода задается в строке, которая передается в функцию printf в качестве первого аргумента.
  4. Ожидание нажатия ENTER: Здесь программа ожидает, пока пользователь не нажмет ENTER, используя функцию ReadConsole. Данные, введенные пользователем, сохраняются в буфере, который затем выводится на консоль.
  5. Завершение работы программы: Здесь программа завершает свою работу, вызывая функцию ExitProcess с аргументом 0.
  6. Импортирование функций: Здесь программа импортирует несколько функций из различных библиотек. Функции printf и ReadConsole импортируются из библиотеки msvcrt, а функции GetStdHandle и STD_INPUT_HANDLE и STD_OUTPUT_HANDLE импортируются из библиотеки kernel32.

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


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

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

15   голосов , оценка 3.6 из 5
Похожие ответы