ai: студенческая копия ЛР №3 «Строковые операции в MASM32» из РПД (окно Win32, ввод строки, цепочечные команды)
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
; ============================================================================
|
||||
; 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
|
||||
; ============================================================================
|
||||
Reference in New Issue
Block a user