Не могу понять как исправить (код на FASM-е), простенькая программа - Assembler

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

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

Написал программу для примера сдвигов, сдвигает нормально, вот только выводит каскадом (с начала выводит все переменные sent а потом только значение после сдвига), не знаю как исправить это - как после вывода нужного sent, прекратить вывод остальных + ещё для разных введённых [A] структура вывода меняется
format PE console 4.0
include 'win32a.inc'
 
start:
 
    cinvoke printf,  sent0, 'A'
    cinvoke scanf, sent4, A
 
    mov eax, [A]
    shl eax, 2d
    cinvoke printf, sent1, eax
    cinvoke printf, endl
 
    mov eax, [A]
    rol eax, 2d
    cinvoke printf, sent2, eax
    cinvoke printf, endl
 
    mov eax, [A]
    rcl eax, 2d
    cinvoke printf, sent3, eax
    cinvoke printf, endl
 
    invoke  sleep, 50000

sentences:
 
invoke  exit, 0
sent0 db  'Enter %c: ', 0
sent1 db  'shl [A] by 2 = '
sent2 db  'rol [A] by 2 = '
sent3 db  'rcl [A] by 2 = '
sent4 db  '%d', 0
endl db '', 10
A   dd  ?

data import
 
 library msvcrt,'MSVCRT.DLL',\
    kernel32,'KERNEL32.DLL'
 
 import kernel32,\
    sleep,'Sleep'
 
 import msvcrt,\
    puts,'puts',\
    scanf,'scanf',\
        printf,'printf',\ 
    exit,'exit'
end data

Решение задачи: «Не могу понять как исправить (код на FASM-е), простенькая программа»

textual
Листинг программы
    format  PE console 4.0
    include 'win32a.inc'
 
start:  cinvoke printf, sent0
    cinvoke scanf, sent4, A
    mov eax, [A]
    mov ebx, eax
    mov ecx, eax
    shl eax, 2
    rol ebx, 2
    rcl ecx, 2
    cinvoke printf, sent1, eax, ebx, ecx
 
;   cinvoke printf, endl
;
;   mov eax, [A]
;   rol ebx, 2d
;   cinvoke printf, sent2, eax
;   cinvoke printf, endl
 
;   mov eax, [A]
;   rcl eax, 2d
;   cinvoke printf, sent3, eax
;   cinvoke printf, endl
 
;   invoke  sleep, 50000
    invoke  _getch
;   jmp start   ; eсли не ctr/c
 
sentences:
 
    invoke  exit, 0
;
    sent0   db 'Enter A:', 0
    sent1   db 'shl [A] by 2 = %d', 0Dh, 0Ah
    sent2   db 'rol [A] by 2 = %d', 0Dh, 0Ah
    sent3   db 'rcl [A] by 2 = %d', 0Dh, 0Ah,0
    sent4   db '%d', 0
;   endl    db '', 10
    A   dd ?
 
 
    data    import
 
    library msvcrt,'MSVCRT.DLL';,\
;   kernel32,'KERNEL32.DLL'
 
;   import  kernel32,\
;   sleep,'Sleep'
 
    import  msvcrt,\
    _getch,'_getch',\
    scanf,'scanf',\
    printf,'printf',\
    exit,'exit'
    end data

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

Список элементов кода на языке Assembler (FASM):

  1. Объявление формата PE console 4.0
  2. Включение файла 'win32a.inc'
  3. Начало работы программы
  4. Использование функции scanf для ввода значения переменной A
  5. Передача значения переменной A в качестве аргумента для функции printf
  6. Выполнение операции сдвига влево на 2 позиции для переменной A
  7. Выполнение операции сдвига вправо на 2 позиции для переменной B
  8. Выполнение операции сдвига вправо на 2 позиции с заполнением для переменной C
  9. Использование функции printf для вывода значений переменных A, B и C
  10. Выполнение операции сдвига влево на 2 позиции для переменной A
  11. Использование функции printf для вывода значения переменной A после операции сдвига влево
  12. Использование функции printf для вывода значения переменной A после операции сдвига вправо на 2 позиции
  13. Использование функции printf для вывода значения переменной A после операции сдвига вправо на 2 позиции с заполнением
  14. Использование функции sleep для задержки выполнения программы на 50 секунд
  15. Использование функции _getch для приостановки выполнения программы до нажатия клавиши
  16. Проверка наличия нажатия клавиши Ctrl+C и переход к началу программы при его отсутствии
  17. Объявление переменных A, B, C и D
  18. Определение строки, которую необходимо вывести при вводе значения переменной A
  19. Определение строки, которую необходимо вывести после операции сдвига влево на 2 позиции для переменной A
  20. Определение строки, которую необходимо вывести после операции сдвига вправо на 2 позиции для переменной A
  21. Определение строки, которую необходимо вывести после операции сдвига вправо на 2 позиции с заполнением для переменной A
  22. Определение строки, которую необходимо вывести после ввода значения переменной A
  23. Определение строки, которую необходимо вывести для завершения работы программы
  24. Импорт необходимых функций из библиотек msvcrt и kernel32
  25. Определение библиотеки msvcrt
  26. Определение библиотеки kernel32
  27. Завершение работы программы с помощью функции exit
  28. Конец списка элементов кода

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


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

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

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