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

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

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

Написал программу для примера сдвигов, сдвигает нормально, вот только выводит каскадом (с начала выводит все переменные sent а потом только значение после сдвига), не знаю как исправить это - как после вывода нужного sent, прекратить вывод остальных + ещё для разных введённых [A] структура вывода меняется
Листинг программы
  1. format PE console 4.0
  2. include 'win32a.inc'
  3. start:
  4. cinvoke printf, sent0, 'A'
  5. cinvoke scanf, sent4, A
  6. mov eax, [A]
  7. shl eax, 2d
  8. cinvoke printf, sent1, eax
  9. cinvoke printf, endl
  10. mov eax, [A]
  11. rol eax, 2d
  12. cinvoke printf, sent2, eax
  13. cinvoke printf, endl
  14. mov eax, [A]
  15. rcl eax, 2d
  16. cinvoke printf, sent3, eax
  17. cinvoke printf, endl
  18. invoke sleep, 50000
  19.  
  20. sentences:
  21. invoke exit, 0
  22. sent0 db 'Enter %c: ', 0
  23. sent1 db 'shl [A] by 2 = '
  24. sent2 db 'rol [A] by 2 = '
  25. sent3 db 'rcl [A] by 2 = '
  26. sent4 db '%d', 0
  27. endl db '', 10
  28. A dd ?
  29.  
  30. data import
  31. library msvcrt,'MSVCRT.DLL',\
  32. kernel32,'KERNEL32.DLL'
  33. import kernel32,\
  34. sleep,'Sleep'
  35. import msvcrt,\
  36. puts,'puts',\
  37. scanf,'scanf',\
  38. printf,'printf',\
  39. exit,'exit'
  40. end data

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

textual
Листинг программы
  1.     format  PE console 4.0
  2.     include 'win32a.inc'
  3.  
  4. start:  cinvoke printf, sent0
  5.     cinvoke scanf, sent4, A
  6.     mov eax, [A]
  7.     mov ebx, eax
  8.     mov ecx, eax
  9.     shl eax, 2
  10.     rol ebx, 2
  11.     rcl ecx, 2
  12.     cinvoke printf, sent1, eax, ebx, ecx
  13.  
  14. ;   cinvoke printf, endl
  15. ;
  16. ;   mov eax, [A]
  17. ;   rol ebx, 2d
  18. ;   cinvoke printf, sent2, eax
  19. ;   cinvoke printf, endl
  20.  
  21. ;   mov eax, [A]
  22. ;   rcl eax, 2d
  23. ;   cinvoke printf, sent3, eax
  24. ;   cinvoke printf, endl
  25.  
  26. ;   invoke  sleep, 50000
  27.     invoke  _getch
  28. ;   jmp start   ; eсли не ctr/c
  29.  
  30. sentences:
  31.  
  32.     invoke  exit, 0
  33. ;
  34.     sent0   db 'Enter A:', 0
  35.     sent1   db 'shl [A] by 2 = %d', 0Dh, 0Ah
  36.     sent2   db 'rol [A] by 2 = %d', 0Dh, 0Ah
  37.     sent3   db 'rcl [A] by 2 = %d', 0Dh, 0Ah,0
  38.     sent4   db '%d', 0
  39. ;   endl    db '', 10
  40.     A   dd ?
  41.  
  42.  
  43.     data    import
  44.  
  45.     library msvcrt,'MSVCRT.DLL';,\
  46. ;   kernel32,'KERNEL32.DLL'
  47.  
  48. ;   import  kernel32,\
  49. ;   sleep,'Sleep'
  50.  
  51.     import  msvcrt,\
  52.     _getch,'_getch',\
  53.     scanf,'scanf',\
  54.     printf,'printf',\
  55.     exit,'exit'
  56.     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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы