Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
12.05.2015
Размер:
142.85 Кб
Скачать

ПРОГРАМУВАННЯ З ВИКОРИСТАННЯМ КОМАНД ОБРОБКИ РЯДКІВ

Мета роботи - вивчення принципу дії і засобів ефективного застосування команд обробки послідовностей слів або байтів в пам'яті мікропроцесорів персональних ЕОМ.

    1. Теоретичні відомості

У систему команд IBM PC включені 5 спеціальних однобайтных команд, за допомогою яких можна обробляти окремі символи або блоки байтів або слів пам'яті, званих рядками або ланцюжками. Базові операції цих команд, звані примітивами, реалізовують елементарні дії над черговим елементом блоку і забезпечують таку зміну адрес, що наступна команда цього ж типу буде обробляти наступний елемент блоку.

При цьому розмір блоків може досягати граничного розміру сегмента тобто 64 Кбайт. Інформація в цих блоках частіше за все являє собою контекстно-залежні ланцюжки двійкових значень будь-якої природи (числова інформація, ASCII-коди, коди внутрішніх

представлень системних програм, BCD-коди і т.п.).

Група команд-примітивів обробки рядків включає 5 основних операцій, що виконуються для окремих елементів. Кожний оператор-примітив представлений трьома різними назвами (мнемокодами), один з яких використовує неявне визначення типу операндів (байт або слово) відповідно до їх визначення в програмі, а два інші - задають дві модифікації машинних команд для обробки байтів (закінчуються літерою "B") , для обробки слів (закінчуються літерою "W") і для обробки подвійних слів (закінчується літерою "D")

Пересилка: MOVS dst, src Завантаження: LODS src

(src)->(dst) MOVSB (src)->а LODSB

MOVSW LODSW

MOVSD LODSD

Порівняння: CMPS dst, src Збереження: STOS dst

(src)-(dst) CMPSB (a)->dst STOSB

CMPSW STOSW

CMPSD STOSD

Сканування: SCAS dst

(Порівняння) SCASB

(a)-(dst) SCASW

SCASD

Дуже важливо при використанні команд обробки ланцюжків пам'ятати

наступні їх основні особливості.

  1. Адресація операндів завжди здійснюється по замовчуванню через регістри DS:SI для рядка-джерела (src) і ES:DI для рядка-приймача (dst). Як акумулятор (a) використовується вміст регістра AL при роботі з байтами , регістра AX - при роботі з словами, EAX- при роботі з подвійними словами. Таким чином, рядок-джерело розміщується в сегменті даних і SI вказує на поточний елемент в цьому ланцюжку, але за допомогою префікса зміни сегмента (CS:, SS:, ES:) рядок-джерело може бути доступним в будь-якому іншому сегменті, а рядок-приймач завжди розташовується в додатковому сегменті і кожний його елемент має логічну адресу ES:DI. Отже, перед виконанням цих команд, програміст повинен забезпечити правильне завантаження всіх регістрів, що використовуються.

2. При виконанні команди здійснюється автоматичний iнкремент або декремент регістрів-покажчиків операндів, що використовуються в операції (SI і/або DI), тобто автоматичний перехід на наступний елемент рядка. При цьому нарощування адрес здійснюється, якщо прапор напряму DF=0 (обробка зліва направо, від молодших адрес до старших), а декремент здійснюється, якщо DF=1 (обробка справа наліво , від старших адрес до молодших). Величина iнкременту або декременту визначається типом операнда: +1 або -1 для байтів , +2 або -2 для слів , +4 ,-4- для подвійних слів.

Команди-примітиви самі по собі істотно розширюють можливості ефективного програмування, оскільки охоплюють декілька традиційних операцій на фіксованому наборі обчислювальних ресурсів. Однак найбільший ефект дає їх використання з так званими префіксами повторень: REP - для безумовних повторень, а також REPE/REPZ і REPNE/REPNZ - для умовних повторень. Причому безліч семантично раціональних операцій вельми обмежена і включає наступні:

REP MOVS - пересилка блоків;

REP STOS - заповнення блоку пам'яті однаковими байтами або

словами;

REPZ CMPS - порівняння рядків;

REPNZ SCAS - пошук заданого коду

REPZ SCAS - пропуск елементів, що ігноруються.

Робота з цими командами передбачає дотримання додаткового правила.

3. При використанні перед примітивом префікса повторення задана примітивом дія буде повторюватися, при цьому число повторень визначається вмістом регістра CX, яким декрементуеться при кожному повторенні, а для умовних примітивів (CMPS і SCAS) можна перервати повторення до вичерпання (СХ) за станом прапора ZF, який ці примітиви аналізують. При початковому значенні (СХ)=0 примітив не виконується ні разу. Отже, перед виконанням команд обробки ланцюжків необхідно ініціалізувати ре2-р4 di,si, використовуючи команди LEA, LDS, LES або MOV, а при наявності префікса повторення необхідно ще підготувати лічильник повторень в CX і визначити напрям обробки, встановивши відповідне значення прапора DF командами CLD - установка в "0", STD - установка в "1". Як приклади приводяться фрагменти програм, що ілюструють використання всіх команд обробки рядків.

Приклад 1. Для видалення елемента з рядка байтів завантажимо в регістр СХ адресу кінця рядка, в регістр DI - адреса початку елемента, що видаляється, а в регістр SI - адреса кінця елемента, що видаляється, а потім перемістимо ліворуч вміст області пам'яті, розташованої за елементом, що видаляється, на кількість байтів, рівну довжині елемента, що видаляється.

SUB CX, SI ; довжина області пам'яті, що пересилається

CLD ; пересилка починається з молодших байтів

REP MOVSB ; видалення елемента

MOV CX, SI ; нова адреса кінця рядка

Приклад 2. Для вставки елемента за адресою, записаною в SI, рядок повинен бути розсунутий на довжину елемента, що вставляється у бік старших адрес. Нехай в СХ записана адреса кінця рядка, тоді

MOV BX, CX ; збереження адреси кінця рядка

MOV DI, CX ; в DI адреса приймача

SUB CX, SI ; в CX довжина рядка, що пересилається

MOV SI, DI

SUB SI, DL ; в SI адреса джерела

STD ; установка прапора напряму

REP MOVSB ; пересилка частини рядка праворуч

ADD BX, DL ; в BX нова адреса кінця рядка

Після цього на місце, що звільнилося записується елемент, що вставляється.

Приклад 3. Порівняння символьних рядків до виявлення неспівпадання, причому обидва рядки знаходяться в додатковому сегменті, початкова адреса якого заздалегідь вміщена в регістр ES.

CLD

LEA SI, String1 ; адреса 1-го рядка

LEA DI, String2 ; адреса 2-го рядка

MOV CX, LENGTH String1 ; довжина рядка в СХ

REPE CMPS String2, ES:String1 ; порівняти, поки співпадуть

JCXZ M1 ; перевірка лічильника

DEC SI ; корекція SI

LODS ES:STRING1 ; неспівпадаючий елемент в АХ

M1: ... ; продовжити при збігу рядків

Приклад 4. Сканування рядка символів (довжина = 80 ) в сегменті экстракода для виявлення символів '+' і заміна їх на символи '-'.

LEA DI, STRING ; адреса рядка, що сканується

MOV AH, 0

MOV CX, 80 ; довжина рядка, що сканується

CLD ; DF=0

MOV AL, '+' ; підготувати код символа, що замінюється

L1: REPNE SCASB ; пропускати всі символи, відмінні від '+'

JNE FINI ; інакше вихід

MOV BYTE PTR ES:[DI-1],'-' ; заміна на '-'

JMP L1

FINI: ..... ; всі заміни виконані

Часто рядкові команди в поєднанні з командою XLAT використовуються для перекодування інформації. Команда XLAT перекодувала інформацію з використанням таблиці перекодування, що індексується.

Для цього створюється таблиця перекодування TAB, в якій за адресами (TAB+код перекодованого символа) записані нові коди. Початкова адреса цієї таблиці повинна бути завантажена в регістр ВХ, а перекодований символ в АL, тоді внаслідок виконання команди XLAT в регістр АL завантажується новий код. Структура таблиці перекодування приведена в описі наступної лабораторної роботи.

Приклад 5. Перекодування елементів рядка в сегменті даних, який співпадає з сегментом экстракода.

STRING DB ‘inform’

ASTRING DD STRING

-----------------------------

MOV BX, OFFSET TAB ; завантаження адреси початку таблиці

LES DI, ASTRING ; завантаження адреси приймача

MOV CX, LENGTH STRING ; завантаження лічильника елементів

CLD ; установка прапора DF

CC: LODSB ; завантаження перекодованого елемента в AL

XLAT ; в AL завантажується новий код

STOSB ; і записується в рядок-приймач

LOOP CC ; продовжити до кінця рядки

5.2. Питання для самоперевiрки

1. Яким чином можна задати обробку ланцюжків командою CMPS, якщо одна з них розташована в сегменті кодів, а друга - в сегменті даних?

2. Чому при пересилці блоків пам'яті, що перекриваються потрібний аналіз адрес ланцюжків перед пересилкою?

3. Які з команд обробки ланцюжків впливають на прапорці?

4. Чи можна застосовувати префікс повторення REP для примітивів порівняння або сканування?

5. Чому для примітивів пересилки, завантаження і збереження не можна застосовувати префікси повторення REPE/REPZ або REPNE/REPNZ?

5.3. Завдання на лабораторну роботу

Скласти відповідно до варіанту програму, використовуючи команди обробки рядкової інформації.

:

Варіанти

Завдання

101

У тексті виділити слова і вивести їх "в стовпчик".

102

У тексті замість точок вставити пропуски.

103

Видалити з тексту всі слова, що містять символ 'a'.

104

У тексті після точок перекодувати маленькі букви у великі.

105

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

106

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

107

У тексті знайти лексеми типу десяткових констант і вивести їх.

108

У тексті після кожного п'ятого слова перейти на новий рядок.

109

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

110

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

111

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

112

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

113

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

114

У тексті знайти лексеми типу десяткових констант і вивести їх.

115

У тексті після кожного п'ятого слова перейти на новий рядок.

116

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

117

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

118

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

119

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

120

У тексті виділити слова і вивести їх "в стовпчик".

121

У тексті замість точок вставити пропуски.

122

Видалити з тексту всі слова, що містять символ 'a'.

123

У тексті після точок перекодувати маленькі букви у великі.

124

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

125

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

126

У тексті знайти лексеми типу десяткових констант і вивести їх.

127

У тексті після кожного п'ятого слова перейти на новий рядок.

128

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

129

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

130

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

131

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

132

У тексті виділити слова і вивести їх "в стовпчик".

201

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

202

У тексті знайти лексеми типу десяткових констант і вивести їх.

203

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

204

У тексті після кожного п'ятого слова перейти на новий рядок.

205

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

206

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

207

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

208

У тексті виділити слова і вивести їх "в стовпчик".

209

У тексті замість точок вставити пропуски.

210

Видалити з тексту всі слова, що містять символ 'a'.

211

У тексті після точок перекодувати маленькі букви у великі.

212

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

213

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

214

У тексті знайти лексеми типу десяткових констант і вивести їх.

215

У тексті знайти лексеми типу десяткових констант і вивести їх.

216

У тексті після кожного п'ятого слова перейти на новий рядок.

217

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

218

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

219

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

220

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

221

У тексті виділити слова і вивести їх "в стовпчик".

222

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

223

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

224

У тексті знайти лексеми типу десяткових констант і вивести їх.

225

У тексті після кожного п'ятого слова перейти на новий рядок.

226

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

227

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

228

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

229

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

230

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

231

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

232

У тексті знайти лексеми типу десяткових констант і вивести їх.

301

У тексті виділити слова і вивести їх "в стовпчик".

302

У тексті замість точок вставити пропуски.

303

Видалити з тексту всі слова, що містять символ 'a'.

304

У тексті після точок перекодувати маленькі букви у великі.

305

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

306

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

307

У тексті знайти лексеми типу десяткових констант і вивести їх.

308

У тексті після кожного п'ятого слова перейти на новий рядок.

309

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

310

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

311

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

312

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

313

У тексті виділити слова і вивести їх "в стовпчик".

314

У тексті замість точок вставити пропуски.

315

Видалити з тексту всі слова, що містять символ 'a'.

316

У тексті після точок перекодувати маленькі букви у великі.

317

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

318

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

319

У тексті знайти лексеми типу десяткових констант і вивести їх.

320

У тексті після кожного п'ятого слова перейти на новий рядок.

321

У тексті вибрати слова, що містять символ 'a' , вивести їх в стовпчик.

322

Порівняти два тексти і всі неспівпадаючі слова переслати в масив помилок.

323

Замінити в тексті коди всіх малих букв кодами відповідних великих літер.

324

Замінити в лексемі букви латинського алфавіта, відповідними по клавіатурі IBM PC буквами українського алфавіту.

325

У тексті виділити слова і вивести їх "в стовпчик".

326

У тексті замість точок вставити пропуски.

327

Видалити з тексту всі слова, що містять символ 'a'.

328

У тексті після точок перекодувати маленькі букви у великі.

329

У тексті знайти всі слова, що закінчуються на 'a' і переслати їх в масив результату.

330

У тексті знайти зарезервовані слова (мнемоніки регістрів) і перекодувати їх зображення великими буквами.

331

У тексті знайти лексеми типу десяткових констант і вивести їх.

332

У тексті після кожного п'ятого слова перейти на новий рядок.

Соседние файлы в папке SP_ukr