; ============================================================================ ; 02-strings.asm — каркас обработки строки цепочечными командами ; Лабораторная №3 «Строковые операции в MASM32», Задания 2–3 ; ---------------------------------------------------------------------------- ; Это ЗАГОТОВКА: показан типовой проход по строке цепочечными командами, ; но ЛОГИКА ВАРИАНТА не реализована (см. TODO). Впиши свой алгоритм. ; ; Регистры цепочечных команд: ; ESI — источник (DS:[ESI]), EDI — приёмник (ES:[EDI]), ECX — счётчик. ; Направление задаёт флаг DF: CLD — вперёд, STD — назад. ; Команды: MOVS (копирование), LODS (в AL/AX/EAX), STOS (запись), ; SCAS (поиск), CMPS (сравнение). Префиксы: REP, REPE, REPNE. ; ============================================================================ ; ФИО: ____________________ Вариант: ____ Группа: ______ ; Дата: ____.__.____ Выдано: (лаботряс) ; ============================================================================ ; ------------------------------------------------- пример 1: копирование ; Скопировать строку из buffer в buffer2 (N — длина) ; CLD ; MOV ECX, N ; LEA ESI, buffer ; LEA EDI, buffer2 ; REP MOVSB ; ------------------------------------------------- пример 2: сравнение строк ; Равны ли buffer и buffer2? ; CLD ; MOV ECX, N ; LEA ESI, buffer ; LEA EDI, buffer2 ; REPE CMPSB ; JNE NO_SAME ; ; ... равны ; NO_SAME: ; ; ... не равны ; ------------------------------------------------- пример 3: поиск символа ; Заменить все '$' на '_' (ECX — длина строки) ; CLD ; MOV AL, '$' ; LEA EDI, buffer ; MOV ECX, N ; LO: ; REPNE SCASB ; JNZ DONE ; MOV BYTE PTR [EDI-1], '_' ; JMP LO ; DONE: ; ============================================================================ ; TODO(вариант): реализуй обработку в процедуре process_string. ; Вход: buffer — строка (ASCIIZ), sizestr — её длина без терминатора 0 ; Выход: buffer — результат (переписать на месте) ; Обязательно: минимум ДВЕ цепочечные команды и префикс REP*/CLD. ; ============================================================================ .code process_string proc ; ---- защита от пустой строки ---- mov ecx, sizestr test ecx, ecx jz done ; пустая строка — выходим CLD ; ------------------------------------------------------------------ ; TODO 1: настроить регистры (LEA ESI/EDI, MOV ECX, ...) ; ------------------------------------------------------------------ ; TODO 2: выполнить обработку цепочечными командами МОВS/LODS/STOS/ ; SCAS/CMPS + REP*/REPE/REPNE согласно варианту ; ------------------------------------------------------------------ ; TODO 3: уложить результат в buffer (можно на месте) done: ret process_string endp ; ============================================================================ ; TODO(интеграция): вызвать process_string из обработчика кнопки в ; 01-window.asm (в ветке BN_CLICKED), например: ; invoke GetWindowText, hwndEdit, ADDR buffer, 512 ; mov sizestr, eax ; call process_string ; invoke SetWindowText, hwndEdit, ADDR buffer ; ============================================================================