Не могу понять как исправить (код на 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):
- Объявление формата PE console 4.0
- Включение файла 'win32a.inc'
- Начало работы программы
- Использование функции scanf для ввода значения переменной A
- Передача значения переменной A в качестве аргумента для функции printf
- Выполнение операции сдвига влево на 2 позиции для переменной A
- Выполнение операции сдвига вправо на 2 позиции для переменной B
- Выполнение операции сдвига вправо на 2 позиции с заполнением для переменной C
- Использование функции printf для вывода значений переменных A, B и C
- Выполнение операции сдвига влево на 2 позиции для переменной A
- Использование функции printf для вывода значения переменной A после операции сдвига влево
- Использование функции printf для вывода значения переменной A после операции сдвига вправо на 2 позиции
- Использование функции printf для вывода значения переменной A после операции сдвига вправо на 2 позиции с заполнением
- Использование функции sleep для задержки выполнения программы на 50 секунд
- Использование функции _getch для приостановки выполнения программы до нажатия клавиши
- Проверка наличия нажатия клавиши Ctrl+C и переход к началу программы при его отсутствии
- Объявление переменных A, B, C и D
- Определение строки, которую необходимо вывести при вводе значения переменной A
- Определение строки, которую необходимо вывести после операции сдвига влево на 2 позиции для переменной A
- Определение строки, которую необходимо вывести после операции сдвига вправо на 2 позиции для переменной A
- Определение строки, которую необходимо вывести после операции сдвига вправо на 2 позиции с заполнением для переменной A
- Определение строки, которую необходимо вывести после ввода значения переменной A
- Определение строки, которую необходимо вывести для завершения работы программы
- Импорт необходимых функций из библиотек msvcrt и kernel32
- Определение библиотеки msvcrt
- Определение библиотеки kernel32
- Завершение работы программы с помощью функции exit
- Конец списка элементов кода