Files
ovt3-masm-strings/stub/02-strings.asm
T

84 lines
4.0 KiB
NASM

; ============================================================================
; 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
; ============================================================================