From b38aaa434bc9eed08bbfb5dfbd561281fea8c1fb Mon Sep 17 00:00:00 2001 From: mss Date: Thu, 5 Nov 2026 19:48:11 +0400 Subject: [PATCH] =?UTF-8?q?ai:=20=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=9B=D0=A0=20=E2=84=963=20=C2=AB=D0=A1=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B2=20MASM32=C2=BB=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=A0=D0=9F=D0=94=20(=D0=BE=D0=BA=D0=BD=D0=BE=20Win32,=20?= =?UTF-8?q?=D0=B2=D0=B2=D0=BE=D0=B4=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= =?UTF-8?q?,=20=D1=86=D0=B5=D0=BF=D0=BE=D1=87=D0=B5=D1=87=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 104 +++++ ...ical-lab3-strokovye-operatsii-student.docx | Bin 0 -> 45964 bytes stub/01-window.asm | 149 +++++++ stub/02-strings.asm | 83 ++++ task.md | 411 ++++++++++++++++++ 5 files changed, 747 insertions(+) create mode 100644 README.md create mode 100644 print/methodical-lab3-strokovye-operatsii-student.docx create mode 100644 stub/01-window.asm create mode 100644 stub/02-strings.asm create mode 100644 task.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..a4a4fae --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# ОВТ3 — Строковые операции в MASM32 + +Репозиторий студента для одной лабораторной работы. + +**Дисциплина:** Основы вычислительной техники и операционные системы +автоматизированных технологических комплексов (Б1.В.01) +**Специальность:** 15.03.06 «Мехатроника и робототехника» +**Семестр:** 3 · **Объём:** 4 часа + +Название репозитория расшифровывается так: + +| Часть | Значение | +|---|---| +| `ovt` | ОВТ — основы вычислительной техники | +| `3` | третья лабораторная работа | +| `masm` | среда MASM32, язык Assembler | +| `strings` | строковые (цепочечные) операции | + +> Черновик. Требует проверки преподавателем перед выдачей студентам. + +--- + +## О чём работа + +Вы пишете GUI-приложение на языке Assembler для Win32 в среде MASM32: +в диалоговом окне Windows вводится строка, над ней выполняется +преобразование по индивидуальному варианту (Приложение А), результат +выводится обратно. В основе обработки — **цепочечные команды** +`MOVS`, `LODS`, `STOS`, `SCAS`, `CMPS` и префиксы `REP`/`REPE`/`REPNE`. + +Полное задание, теория, 27 вариантов и вопросы допуска/защиты — +в **[task.md](task.md)**. + +--- + +## Что в репозитории + +``` +ovt3-masm-strings/ +├── README.md ← этот файл +├── task.md ← задание, теория, варианты, вопросы +├── stub/ ← заготовки (выдаёт преподаватель по лестнице) +│ ├── 01-window.asm ← каркас окна: edit + button, WM_CREATE/WM_COMMAND +│ └── 02-strings.asm ← каркас обработки строки (TODO по варианту) +└── print/ ← брошюра задания (DOCX) + └── methodical-lab3-strokovye-operatsii-student.docx +``` + +### Что в заготовках + +| Файл | Что внутри | Что доделать | +|---|---|---| +| `stub/01-window.asm` | регистрация класса окна, создание главного окна, поле ввода (`edit`), кнопка (`button`), обработка `WM_CREATE`/`WM_COMMAND`/`WM_DESTROY` | вписать обработку строки в ветке `BN_CLICKED` | +| `stub/02-strings.asm` | примеры типовых приёмов (копирование, сравнение, поиск) и каркас `process_string` с `TODO` | реализовать алгоритм варианта цепочечными командами | + +> **Важно:** заготовки — это стартовая точка, а не решение. Логику +> варианта (задание 3) пишете вы сами. + +--- + +## Быстрый старт + +1. **Установить MASM32** (пакет `masm32` — редактор QEditor, ассемблер + `ml`, компоновщик `link`). Ассемблер должен лежать в `\masm32` — + в исходниках пути вида `\masm32\include\windows.inc`. +2. **Собрать окно** из заготовки `stub/01-window.asm`: + + ```bat + ml /c /coff 01-window.asm + link /subsystem:windows 01-window.obj + ``` + + Запустить `01-window.exe` — должно появиться окно с полем ввода и + кнопкой (кнопка пока выводит введённую строку без изменений). +3. **Реализовать вариант** в `stub/02-strings.asm` (процедура + `process_string`) и подключить её к обработчику кнопки. +4. **Проверить** на контрольных строках (пустая строка, строка из + пробелов, строка с цифрами) и, при необходимости, пройти ключевой + фрагмент пошагово в **OllyDbg**. +5. **Оформить отчёт** по структуре из `task.md`, раздел 4. + +Или собрать через QEditor: открыть файл и «Build → Build all». + +--- + +## Полезные ссылки + +- `task.md` — задание, теория цепочечных команд, 27 вариантов, + контрольные вопросы, оценивание. +- Дополнительный материал по окнам Win32 (`Окна в MASM32.PDF`, + разделы 9, 10, 14) — на диске с методическими материалами или у + преподавателя. + +--- + +## Порядок сдачи + +1. Реализовать и собрать программу (задания 1–3). +2. Провести вычислительный эксперимент (задание 4). +3. Оформить отчёт (задание 5). +4. Ответить на контрольные вопросы (`task.md`, раздел 6). + +Баллы по заданиям — в `task.md`, раздел 7. +Зачёт при **6 и более** баллах из 10. diff --git a/print/methodical-lab3-strokovye-operatsii-student.docx b/print/methodical-lab3-strokovye-operatsii-student.docx new file mode 100644 index 0000000000000000000000000000000000000000..b1b4eb60b857d7899a0a5023ff8b22b62f0d7c43 GIT binary patch literal 45964 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 a8OkkW&6+AZy@$OVcx zOpW~?Z0iQ{$#e8JvRQl?4NETD4j!RbjOV~?Orhhi%Rd&#?^aZ{yS&vxY!*$&W3TkTH zDB)!`>d&!{-X)QF`vbC-Osf(jzIL<8u6K6E<{0MV&p3xWHjG%8@af>&xOM99yHo9?}GPb)? zqOZDTLa|e0H9-}+eN`0@_%H^gyZE;yhyh%h5Q}>3X z>vB}sp0amu&iRbvsC0Rq{t3wnYjIu1>bFaKKJXUkGCXvq@UIL&_|Rqi4J@O<3g+!d zdUiikJLW#TOwo*WkC zKY8T9BQ4n_D29x$i0ja^f3OU@!XPLy*?8$t=P&pgwA@y{?E=ZmQ?a(NGJcb#*G|H*6w*ey6li89Kz}UOdf%61|B54^Tk9cRw6uWAjn=*UI?v} z>yr$8jF*mclqIV5z@`|Lf2M>4WkH_t)m-WEp4k`Kx}|9jTYKOFLFl$90hd;a>3bd5 z)V)$h3)D?&HX}ONRI2x8^wh|tnNlWf@0tu-l~WpKAhVOT_UC9!PlJ6JQBzK>j|Wfh zvquaHKj#|N2tIA6G9x(0@IO@RU&HXtG(ZY>@#6v|L|j3Xo1pY=F! z=b<%&AuSzCQ4T7@5FUmd@f!lM$_4`??X;4;X&bo-W!UzuX}XvFG)eGPFm73^VEK(t zDp|7DX+o-75Yx?^gFh`l<0U-0_o)-ihYrk(^fz9A?gIM{yFa#ojh?Cn`{(GeTb;@j z4OV65mh`#WSD28?;*J#Mu~SW9g;;G0vKw7_>QDrn8zfIZUF`kP%3H)}V`fT<%98vK z950=CzgjN&IV6!cIW;gzvwwvsxc!#@qSvO?%<3#$QjC(ImA&|N

Kpv&IMVtUa zxg&b_36^B1&>uCGG!#qQHANm4A0U6fppET{O50$ zA&4DY%Dt=ad}o9s2igidOcuak`$=A(#KWJ)j%rmhy6n+gNr1=nqkEO>w@-q^B74CO zMitYHbThQn@Gr{+bKhljbn|di4GUBW2wTGdTZ3pmQu4dL*>w6?IS0#%N_|ecmpXBF zu-0KY-b5wqz~=?K*Ka^Hk|{FLSPg|kiq40JXf$BRhcvh+Ny#}9C znz^d@k<08f=km7$g%6tC_B;AI*~+SoEZt5RPw?* zp$!gi?z-Ypxa*5#%IjxQTI_UaxGgv*6At$7{)ssp-0V%voxxd|U*6q>_PWCkKYr(C zv1pvMUSoIyH#B!co~WjNv@})Y1%MX6=4sI(Ls-VdoSbg)6SaQYevFyA z!&se#!DOs1rq>o&p*vezkxh-V6O85y>$^1zfPPNpf`u#!Na z0v|u{>q4Ru3?Gf$$vb7xeYD?%znD&3@=(#EWt44)VD!*6 z;?z2dvt^GA8tGbO3;k>F+X_4R+?B^__skfW2NiHu#W*eA^H>d@fonx`ak!g4jHq_UJj5weX3tb>ge&c zr&wy%+3NE7vPa$*wn13hTFdCctUD0DtKO4Dgo+g=Y9i;+++4tNw*`ZsU}Z!?Je$^PYx1@^FY%2 z)&i2NG`kk(WdzvU4RLa({k*n+GM=uSx9qbL?etxF+7$Q2=7hj`qdwmqd>1UOVds9O z6YRb!_tAl9n$L?(g7&jU4axZKJ|Ls2J$|^w2+ZZ9Lx=5zuGmO2~Y4@cL}mT3wT4YH3tOfIHtK#C2Q+d-d(( z6~_Kz&$sa!F%)L@{tm*W9%L6=qg(=58zTv>abU(5KImL z;DJXh@CMy~3{&993*0{)jIHfhZ5+)lPc&^Eu{5xS+r9Z1>?hFaS+L>y+Btg)Sj3qi zd97E95_t<)s-51+B`9H~(HgtYC4(~KZUH|+g?yfBv0u7oIH}A83aCkm%D|x`VdD=` z+MMwSVH-l7t*sXzs07CuP9Co>KXheWth-DBy}vl*eatiLpFYR*Mqo#VGWQU>Z0H(u zXsmMNFPA^Y;dKQZG`IF`18gC!kVo_C=S_6m>{{hEk(i?bxrg6zr@TVM0}|u-2ia`5 zIUT~YW1}gPtvyv!O@K#104Nb zdB=xyfh0B!ZXOVmb6RBYiHm1!Gex#$idnVtjt%PQFg;FS;DLL(6&tb1@DUok+~LN6 zZ)83PdU!P-?047FTrUU{)XH_bWT0tB|4E$&Rd$$eq6eKq0Kwk8G>9CRYna`sPUjDJORDERI9mckA&u-mstJvd*K1iBqkYoEUVPv69qn9uWi&Ehwb(J zfP+fHu~9TZr!JHpWWBQ)oo_Wuj$%{IR7m!Ipt<_c#X_udMY%8C6oFxBujn#Ovm*bA ze>V`lB6@IF#!GLop_waoDrhhY2^wCEM0g!Nc+3crE-?^>1DVpRV=EM(3w?=bb;ji` z3bg{e2*i#a#ftDUeM$<7c7g*k>JzuB^Hr01v^%pJ?>^#m@@`DzcF^4 z;KPxuZg!R18}doUFr$}cuaJ{}EXQRGc%AGZcHi|Re5pz!X=Amd$WnHO6YWDCNSaGH z+FZPP9F~kCoppQKzVx+MajSnkx4eGa1()4>sa6wegk)je#L( zm$2#N&mBW&}yyk@##w_)>mmd1*r_e7LT8n>^R@; zV&3tzH~D|tYZ14c!#RrRDM&A4n&106$`JFVI6bgS+-Id~#qAr>OLFSc_@j)fV}UlU z!(-Y(x&ZKg#GEgzDsxY5W(>b4D0y03*r{W@ErU*YagfC^v5N?;7@@!!9!MRg6le)M z{XNG^($JN0laKa7w2zhz`okSkmJS?N(;kNZB8`7VD#9z&tZ*s==!3Mq_hCx4T-nB5 zfY^>3&#%?4NLfn7c{7n728Vo*dK>7`kLv`{1{;BA%8@F4z_kOGzw<0j0&Gf9c-t` zn~8$LzrmU!Mlv`@VQ5qJ6QmxH;zzcgmytgjn`^&674RL6o#)0r#z$oCcVgc5$TG4X zhdO{W*$s^zW0^%U+?|avOp0r^=-*F7NIqGo$_SkVukVeu8d_js5lx)*!umWhqrGUd z!+YU4u+O_12oI+H0M(_tp1{>cm}Hb(gWP3!$WMcV`-pNWFbN7Zqo{ z-CzEa<(KO+wvb}*)_k?Ry7OjXRdBEiYCst3fKes*^2kH9_D zFMk&^^(rCWc)7;Y`)4e|&7=#}*8z#rR4mIYB>`mxb;kC_zLh6+bEpuSuL7ut#18ya zmcciU;02dmYtV`UVF|5r0{-vei7V`?Peerl0umeQS9%;C@H5j~zf!F*E(z?Rj)HS; zzrv2c|NOz<0RXQgz{y~92Uo+Fo{r`&`oFxh=K!9x3ZmEGQ#ZhQWTd~P!SDVMLtuzM zef&RM`{#mT?~v53!KciC1%DOi{{Hia_yYdspJ$KhYv(^Q(a*&%S6A_lz~Xk$008>m zvfy`r2tV*Q|A-qqI{rVc9SzZ_YiPj{2^7S$#y@}!;r`m$j13IoW)J56|HK{qi7+|A zjgNtwBL1y$cb31z|78AOkpF81xcTZ-7dEgftN{Z+`wi(c>t9GNuAX-0f0Qeq+u-?v zl7GwlLj)Q8Cj4x9$>%uF>!knUTqgXD^PeKhbMfbemw&}~QvMQuR)%?w@VpT5F9LSz zUkJaIC7#Pa&l>+LU!4Az{PP_0bBO2h_rDN1dH**We-7|G(ES&{Bmchu|1a!)j`cit z{1?lq;J;YEN0QG`o`+ihqJ$OxWtHCoujlg5{lS0bsY?IT#eVk=RTN;rJ?K}L#sC Подробное описание создания окна, регистрации класса, структуры +> `WNDCLASSEX`, создания дочерних элементов `edit`/`button`, разбора +> `WM_COMMAND` и функций `GetWindowText`/`SetWindowText` — в +> дополнительном материале **«Программирование на Ассемблере в Win32»** +> (файл `Окна в MASM32.PDF`, разделы 9, 10, 14). + +**Проверка:** программа собирается и запускается; окно содержит поле +ввода и кнопку; закрытие окна завершает процесс. + +### Задание 2. Алгоритм варианта — 2 балла + +По номеру варианта (раздел 5) разработать алгоритм: + +- определить тип обработки: одну строку, числа в тексте, слова или + две строки; +- выбрать направление просмотра (`CLD`) и регистры: `ESI` — источник, + `EDI` — приёмник результата, `ECX` — счётчик; +- указать, какие цепочечные команды применяются на каждом шаге и как + меняются `EDI`/`ESI`/`ECX`; +- предусмотреть крайний случай (пустая строка / конец данных). + +Оформить блок-схему или пошаговое описание алгоритма. + +**Проверка:** алгоритм соответствует варианту; указаны начальные +регистры и результат. + +### Задание 3. Программа — 2 балла + +Реализовать алгоритм на MASM32. **Обязательно** использовать +цепочечные команды и префикс повторения: + +| Команда | Назначение | +|---------|------------| +| `MOVS` (`MOVSB`/`MOVSW`/`MOVSD`) | копирование элемента цепочки `ES:[EDI] ← DS:[ESI]` | +| `LODS` | загрузка элемента цепочки в `AL`/`AX`/`EAX` | +| `STOS` | запись элемента из аккумулятора в `ES:[EDI]` | +| `SCAS` | сравнение элемента цепочки с аккумулятором (поиск) | +| `CMPS` | сравнение двух элементов цепочек `DS:[ESI]` и `ES:[EDI]` | + +Префиксы: `REP` — повторять, пока `ECX ≠ 0`; `REPE`/`REPZ` — +повторять, пока `ECX ≠ 0` **и** `ZF = 1`; `REPNE`/`REPNZ` — пока +`ECX ≠ 0` **и** `ZF = 0`. Направление просмотра задаётся флагом `DF`: +`CLD` (DF = 0, вперёд) или `STD` (DF = 1, назад). + +> **Числовые варианты (12–16, 23–24):** числа в тексте нужно разбирать +> посимвольно — выполняйте `SCASB`/`LODSB`, выделяйте цифры (ASCII +> `'0'`..`'9'`), накапливайте цифры в число и анализируйте его. + +**Проверка:** программа собирается и выдаёт правильный результат; +использованы минимум две цепочечные команды и префикс `REP*`. + +### Задание 4. Вычислительный эксперимент и отладка — 1,5 балла + +1. Прогнать программу на 3–5 контрольных строках: + + | № | Контрольная строка | Назначение | + |---|--------------------|------------| + | 1 | пустая строка | проверка краевого случая | + | 2 | строка из одних пробелов | проверка обработки пробелов | + | 3 | строка с цифрами | вариант числового задания | + | 4 | строка со смешанным регистром | проверка ASCII | + | 5 | строка длиной около длины буфера | защита от переполнения | + +2. Сверить результат, посчитанный вручную. +3. При расхождении — пройти ключевой фрагмент **пошагово** (OllyDbg + или встроенный отладчик) и зафиксировать в отчёте состояние + `EDI`/`ESI`/`ECX` и флагов `ZF`/`DF` после выполнения ключевой + команды. + +**Проверка:** результаты совпадают с ручным расчётом; в отчёте +приведены значения регистров/флагов; пустая строка и строка пробелов +не приводят к сбою. + +### Задание 5. Отчёт — 0,5 балла + +Оформить отчёт по структуре из методических указаний: + + Титульный лист. + Задание на лабораторную работу. + Введение. + 1. Разработка алгоритма. + 2. Разработка программы (листинг с комментариями). + 3. Вычислительный эксперимент (контрольные строки, результаты, отладочная трассировка). + Выводы. + Список литературы. + +--- + +## 3. Краткая теория + +### 3.1. Цепочечные команды + +Цепочечные команды (команды обработки строк символов) выполняют +действия над блоками памяти — последовательностями элементов +размером в байт (8 бит), слово (16 бит) или двойное слово (32 бита). + +- **`MOVS dest,src`** — передаёт байт/слово/двойное слово из цепочки, + адресуемой `DS:[ESI]`, в цепочку `ES:[EDI]`. `EDI` и `ESI` + автоматически корректируются согласно флагу `DF`. Разновидности: + `MOVSB` (байт), `MOVSW` (слово), `MOVSD` (двойное слово). +- **`LODS src`** — загружает элемент цепочки в аккумулятор: байт → `AL`, + слово → `AX`, двойное слово → `EAX`; `ESI` корректируется. + Префикс `REP` не используется. +- **`STOS dest`** — команда, обратная `LODS`: передаёт элемент из + аккумулятора в цепочку и корректирует `EDI`. +- **`SCAS dest`** — сканирование цепочки: вычитает элемент цепочки из + аккумулятора (`AL`/`AX`/`EAX`) и модифицирует флаги. С префиксом + `REPNE` позволяет найти в цепочке нужный элемент. +- **`CMPS dest,src`** — сравнение цепочек: вычитает элемент цепочки + `dest` из соответствующего элемента `src`, модифицирует флаги; + `EDI` и `ESI` продвигаются к следующему элементу. + +**Префикс `REP`** повторяет строковую операцию до обнуления `ECX`. +Разновидности: `REPZ` (`REPE`) — выполнять, пока `ZF = 1` (или пока +`ECX ≠ 0`); `REPNZ` (`REPNE`) — выполнять, пока `ZF = 0`. Цепочечная +команда без префикса выполняется один раз. + +В Win32 программа пишется в одном большом («плоском») сегменте, +поэтому заботиться о сегментных регистрах `DS` и `ES` не нужно. +Флаг `DF` сбрасывается командой `CLD` и устанавливается `STD`. + +### 3.2. Примеры типовых алгоритмов + +**Пример 1. Копирование `STR1` в `STR2`:** + +```asm +CLD +MOV ECX, N ; длина строки +LEA ESI, STR1 +LEA EDI, STR2 +REP MOVSB +``` + +**Пример 2. Сравнение двух строк:** + +```asm +CLD +MOV ECX, N ; длина сравниваемых строк +LEA ESI, STR1 +LEA EDI, STR2 +REPE CMPSB +JNE NO_SAME +; ... строки равны +``` + +**Пример 3. Заполнение строки символом:** + +```asm +CLD +MOV AL, 65 ; код символа +MOV ECX, 10 ; число символов +LEA EDI, STR2 +REP STOSB +``` + +**Пример 4. Поиск в строке знаков '$' и замена их на '_':** + +```asm +CLD +MOV AL, '$' +LEA EDI, STR2 +MOV ECX, 20 +LO: +REPNE SCASB ; поиск +JNZ DONE +MOV BYTE PTR [EDI-1], '_' ; замена +JMP LO +DONE: +``` + +**Пример 5. Поиск подстроки `STR1` (длина `N1`) в строке `STR2` +(длина `N2`), при `N2 > N1`:** + +```asm +CLD +LEA EDI, STR2 +MOV EAX, 0 +MOV EDX, EDI ; EDX — адрес начала очередной попытки +LO: +MOV ECX, N1 +LEA ESI, STR1 +REPE CMPSB +JE FOUND +INC EDX +INC EAX +CMP EAX, N2-N1-1 +JZ NO_FOUND +MOV EDI, EDX +JMP LO +NO_FOUND: +; ... строка не найдена +FOUND: +; ... строка найдена (начало — в EDX) +``` + +> Разбирая Пример 5, обратите внимание на роль регистра `EDX`: +> в нём хранится адрес символа в `STR2`, с которого начинается +> очередная попытка. При успехе именно в `EDX` находится начало +> найденной подстроки. + +### 3.3. Окна, элементы управления и ввод строки + +Чтобы создать окно в Win32, нужно: + +1. получить дескриптор программы (`GetModuleHandle`); +2. зарегистрировать класс окна (`RegisterClassEx`), если не + используется предопределённый класс; +3. создать окно (`CreateWindowEx`); +4. показать окно (`ShowWindow`) и обновить его (`UpdateWindow`); +5. запустить цикл сообщений (`GetMessage`/`DispatchMessage`); +6. обрабатывать сообщения в оконной функции (`WndProc`). + +Дочерние элементы управления (`button`, `edit`, список, флажок и т. д.) +создаются функцией `CreateWindowEx` с указанием предопределённого класса +и **дескриптора родителя** и **уникального ID**. Делается это обычно в +обработке `WM_CREATE`. Созданный элемент посылает родителю сообщения +`WM_COMMAND`: младшее слово `wParam` — ID элемента, старшее — код +уведомления (для кнопки — `BN_CLICKED`), `lParam` — дескриптор элемента. +Для сообщений **меню** `lParam == 0`. + +Работа со строкой ввода: + +```asm +SetWindowText proto hWnd:HWND, Str:PChar +GetWindowText proto hWnd:HWND, Str:PChar, MaxCount:DWORD +``` + +- `SetWindowText hwndEdit, ADDR TestString` — заполнить поле; +- `GetWindowText hwndEdit, ADDR buffer, 512` — прочитать текст + (в `EAX` возвращается число скопированных символов). + +Родитель может слать команды элементу функцией `SendMessage`, +например эмулировать нажатие кнопки из пункта меню: +`invoke SendMessage, hWnd, WM_COMMAND, IDM_GETTEXT, 0`. + +> Полный разбор (структура `WNDCLASSEX`, параметры `CreateWindowEx`, +> стили `WS_*`/`ES_*`/`BS_*`, примеры программ `PR2.ASM`, `PR8.ASM`) +> — в файле `Окна в MASM32.PDF`, разделы 9, 10, 14. + +--- + +## 4. Содержание отчёта +**Титульный лист.** +**Задание на лабораторную работу** (номер варианта и его формулировка). +**Введение** (цель, краткие теоретические сведения). + 1. **Разработка алгоритма** (блок-схема / пошаговое описание, распределение регистров). + 2. **Разработка программы** (листинг с комментариями; пояснения по использованным цепочечным командам). + 3. **Вычислительный эксперимент** (контрольные строки, ожидаемый и + полученный результат, фрагменты окна с введенной строкой и полученным в результате работы программы результатом). +**Выводы** (что подтвердилось, какие трудности, где применяются цепочечные команды). +**Список литературы.** + +--- + +## 5. Варианты индивидуальных заданий (Приложение А) + +Номер варианта выдаёт преподаватель. + +### I. В диалоговом окне ввести строку, выполнить преобразование, вывести результат + +1. Циклический сдвиг вправо на 1 символ. +2. Циклический сдвиг влево на 1 символ. +3. Выделить байт с наибольшим ASCII-кодом. +4. Выделить байт с наименьшим ASCII-кодом. +5. Произвести реверс байтов. +6. Поменять крайние символы местами. +7. Поменять средние символы местами. +8. Заменить чётные цифры символом `?`. +9. Заменить нечётные цифры символом `?`. +10. Убрать пробелы в тексте. +11. Заменить все символы `a` на символ, введённый с клавиатуры. + +### II. В тексте определить количество чисел, у которых + +12. Все цифры не совпадают. +13. Цифры образуют комбинацию «стрит» (напр.: 43576). +14. Три одинаковых цифры в числе (напр.: 36533). +15. Все цифры идут подряд (по возрастанию или убыванию). +16. Ни одной цифры подряд. + +### III. В тексте найти + +17. Количество гласных букв. +18. Количество согласных букв. +19. Количество слов с удвоенными согласными. +20. Количество слов с удвоенными гласными. +21. «Слова-перевёртыши» (напр.: кабак). +22. Слово с максимальным количеством одинаковых символов. +23. Количество чётных чисел. +24. Количество нечётных чисел. + +### IV. Ввести 2 строки одинаковой длины, определить + +25. Количество одинаковых символов. +26. Количество одинаковых слов. +27. Количество ошибок, если 1-я строка — шаблон, 2-я — проверяемый + текст. + +--- + +## 6. Контрольные вопросы (допуск и защита) + +1. Что такое цепочечная команда? Чем «цепочка» отличается от + «строки символов»? +2. Какую роль играют регистры `ESI`, `EDI`, `ECX` при выполнении + цепочечных команд? +3. Что делает команда `CLD` и как флаг `DF` влияет на изменение + `ESI`/`EDI`? +4. Чем отличаются префиксы `REP`, `REPE` (`REPZ`) и `REPNE` (`REPNZ`)? +5. Приведите определение команд `MOVS`, `LODS`, `STOS`, `SCAS`, `CMPS`. +6. Как в программе получить введённую пользователем строку? Где + хранится её длина? +7. Как различаются сообщения меню и элементов управления в + `WM_COMMAND`? Что хранится в `wParam` при `BN_CLICKED`? +8. Зачем при создании окна Win32 регистрировать класс окна перед + вызовом `CreateWindowEx`? +9. Что произойдёт, если не обработать `WM_DESTROY`? +10. В Примере 5 (поиск подстроки) зачем нужен регистр `EDX` и почему + после неудачного прохода `EDI` восстанавливается из `EDX`? + +--- + +## 7. Оценивание + +| Составляющая | Вес | +|--------------|-----| +| Задание 1 (окно: ввод/вывод) | 2,0 | +| Задание 2 (алгоритм варианта) | 2,0 | +| Задание 3 (программа: цепочечные команды) | 2,0 | +| Задание 4 (вычислительный эксперимент и отладка) | 1,5 | +| Задание 5 (отчёт) | 0,5 | +| Защита и допуск | 2,0 | +| **Максимум** | **10** | + +Проходной балл — **6,0**. Допуск — устный опрос (раздел 6), не менее +3 правильных ответов из 5. + +**Литература:** + +1. Лекомцев П.В. Строковые операции в MASM32: методические указания + к выполнению лабораторной работы №3 по дисциплине «Основы + вычислительной техники». — Ижевск: ИжГТУ, 2012. +2. Яковлев А.В. Программирование на Ассемблере в Win32: + дополнительный лекционный материал. — Муром: Муромский институт + (филиал) ВлГУ, 2003. +3. Пирогов В.Ю. Assembler. Учебный курс. — М.: Молгачева С.В., + Нолидж, 2001. — 848 с. +4. Пирогов В.Ю. Ассемблер для Windows. — 2-е изд., перераб. и доп. — + СПб.: БХВ-Петербург, 2003. — 656 с. +5. Юров В.И. Assembler. Учебник для вузов. — 2-е изд. — СПб.: Питер, + 2004. — 637 с.