Определить наиболее длинную последовательность одинаковых символов, входящих в строку - Assembler
Формулировка задачи:
Дана строка. Определить наиболее длинную последовательность одинаковых
символов, входящих в нее.
Решение задачи: «Определить наиболее длинную последовательность одинаковых символов, входящих в строку»
textual
Листинг программы
.486 .model flat, stdcall option casemap :none include d:\masm32\include\windows.inc include d:\masm32\include\user32.inc include d:\masm32\include\kernel32.inc include d:\masm32\include\masm32.inc includelib d:\masm32\lib\user32.lib includelib d:\masm32\lib\kernel32.lib includelib d:\masm32\lib\masm32.lib .data aszPressLeftAlt db 0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0 aszMsgResult db 'Result: ', 0 aszForProcess db '//////tyvnbvghhhknxz@@@@@@@76767676****', 0 Result dd ? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Buffer db 1024 dup(?) BufLen dd ? .code start: ; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax ;очистка экрана invoke ClearScreen lea esi, [aszForProcess] mov ecx, 0 ;длина текущей последовательности mov ebx, 0 ;длина максимальной последовательности mov al, [esi] ; not al jmp @@WhileCondition @@While: @@TestSequence: cmp al, ah jne @@NewSequence inc ecx jmp @@TestMaxLen @@NewSequence: mov ecx, 1 @@TestMaxLen: cmp ecx, ebx ;ebx=max(ebx, ecx) jbe @@WhileCondition mov ebx, ecx @@WhileCondition: mov ah, al lodsb or al, al jnz @@While mov [Result], ebx ;вывод результата invoke WriteConsole, hConsoleOutput, ADDR aszMsgResult,\ LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL invoke ltoa, [Result], ADDR Buffer invoke StrLen, ADDR Buffer mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL ;ожидание нажатия Left Alt invoke WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\ LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL @@WaitForLAlt: invoke GetAsyncKeyState, VK_LMENU and eax, 8000h jz @@WaitForLAlt invoke ExitProcess, 0 end start
Объяснение кода листинга программы
- Определение наиболее длинной последовательности одинаковых символов, входящих в строку
Код выполняет данную задачу путем поиска наибольшей возможной последовательности одинаковых символов в строке
aszForProcess
. Для этого используется цикл, который сравнивает текущий символ с предыдущим и, если они совпадают, увеличивает счетчик длины последовательности. Когда находится новый символ, счетчик сбрасывается, и цикл продолжается. В конце выводится результат. - Остальные действия кода
- Код получает дескрипторы стандартного ввода и вывода консоли с помощью функции GetStdHandle.
- Затем он очищает экран с помощью функции ClearScreen.
- Далее он ожидает, пока пользователь не нажмет клавишу
Left Alt
, и выводит результат. - В конце код вызывает функцию ExitProcess для завершения работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д