84 lines
4.0 KiB
NASM
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
|
|
; ============================================================================
|