Обробка рядків
Поняття та сутність операцій над рядками, їх властивості та призначення. Регістри, що беруть участь у ланцюгових командах. Команди обробки рядків для строкових даних Асемблер, їх сутність і характеристика. Порядок і особливості сканування та заміни.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | украинский |
Дата добавления | 14.02.2009 |
Размер файла | 24,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
2
Міністерство освіти ТА НАУКИ України
Національний технічний університет
"Харківський політехнічний інститут"
Кафедра "Обчислювальної техніки та програмування"
Обробка рядків
Основний комплект конструкторської документації курсового проекту по дисципліні
"Системне програмування"
Харків 2003
Зміст
Вступ
Властивості операцій над рядками
REP: префікс повторення цепочечной команди
MOVS: пересилання рядків
LODS: завантаження рядка
STOS: запис рядка
CMPS: порівняння рядків
SCAS: сканування рядків
Сканування і заміна
Альтернативне кодування
Дублювання зразка
Основні положення на пам'ять
Вступ
Часто, однак, буває необхідно чи переслати порівняти полючи даних, що перевищують по довжині одне слово. Наприклад, необхідно порівняти чи описи імена для того, щоб відсортувати їх у висхідній послідовності. Елементи такого формату відомі як строкові дані і можуть є як символьними, так і числовими. Для обробки строкових даних Асемблер має п'ять команд обробки рядків:
MOVS переслати один чи байт одне слово з однієї області пам'яті в іншу;
LODS завантажити з пам'яті один байт у регістр AL чи одне слово в регістр AX;
STOS записати вміст регістра AL чи AX у пам'ять;
CMPS порівняти вміст двох областей пам'яті, розміром в один чи байт в одне слово;
SCAS порівняти вміст регістра AL чи AX із умістом пам'яті.
Префікс REP дозволяє цим командам обробляти рядка будь-якої довжини.
Властивості операцій над рядками
Ланцюгова команда може бути закодована для повторюваної обробки одного чи байта одного слова за одне виконання. Наприклад, можна вибрати "байтову" команду для обробки рядка з непарним числом чи байт "двобайтову" команду для обробки парного числа байт. Нижче перераховані регістри, що беруть участь у ланцюгових командах (для однобайтових і двобайтових варіантів). Припустимо, що регістри DI і SI містять необхідні адреси:
Команда Операнди Байт Слово
MOVS DI,SI MOVSB MOVSW
LODS AL,SI чи AX,SI LODSB LODSW
STOS DI,AL чи DI,AX STOSB STOSW
CMPS SI,DI CMPSB CMPSW
SCAS DI,AL чи DI,AX SCASB SCASW
Наприклад, можна кодувати операнди для команди MOVS, але опустити їх для MOVSB і MOVSW. Ці команди припускають, що регістри DI і SI містять відносні адреси, що вказують на необхідні області пам'яті (для завантаження можна використовувати команду LEA). Регістр SI звичайно зв'язаний з регістром сегмента даних - DS:SI. Регістр DI завжди зв'язаний з регістром додаткового сегмента - ES:DI. Отже, команди MOVS, STOS, CMPS і SCAS вимагають ініціалізації регістра ES (звичайно адресою в регістрі DS).
REP: префікс повторення ланцюгової команди
Незважаючи на те, що ланцюгові команди мають відношення до одного чи байта одному слову, префікс REP забезпечує повторення команди кілька разів. Префікс кодується безпосередньо перед ланцюговою командою, наприклад, REP MOVSB. Для використання префікса REP необхідно установити початкове значення в регістрі CX. При виконанні ланцюгової команди з префіксом REP відбувається зменшення на 1 значення в регістрі CX до нуля. Таким чином, можна обробляти рядка будь-якої довжини.
Прапор напрямку визначає напрямок повторюваної операції:
- для напрямку ліворуч праворуч необхідно за допомогою команди CLD установити прапор DF у 0;
- для напрямку праворуч ліворуч необхідно за допомогою команди STD установити прапор DF у 1.
У наступному прикладі виконується пересилання 20 байт із STRING1 у STRING2. Припустимо, що обидва регістри DS і ES ініциалізовані адресою сегмента даних:
STRING1 DB 20 DUP('*')
STRING2 DB 20 DUP(' ')
...
CLD ;Скидання прапора DF
MOV CX,20;Лічильник на 20 байт
LEA DI,STRING2 ;Адреса області "куди"
LEA SI,STRING1 ;Адреса одласти "відкіля"
REP MOVSB;Переслати дані
При виконанні команд CMPS і SCAS можлива установка прапорів стану, так щоб операція міг припинитися відразу після виявлення необхідної умови. Нижче приведені модифікації префікса REP для цих цілей.
REP - повторювати операцію, поки CX не дорівнює 0;
RерZ або REPE - повторювати операцію,поки прапор ZF показує "равно або нуль". Припинити операцію при прапорі ZF, що вказує на не дорівнює чи не чи нуль при CX рівному 0;
REPNE чи REPNZ - повторювати операцію, поки прапор ZF показує " чине дорівнює не нуль".
Припинити операцію при прапорі ZF, указує на "дорівнює чи нуль" чи при CX рівним 0.
Для процесорів 8086, 80286 і 80386, що обробляють слово за одне виконання, використання ланцюгових команд, де це можливо, приводить до підвищення ефективності роботи програми.
MOVS: ПЕРЕСИЛАННЯ РЯДКІВ
Програма включає три команди для ініціалізації і п'ять команд для циклу. Команда MOVS із префіксом REP і довжиною в регістрі CX може виконувати пересилання будь-якого числа символів більш ефективно.
Для області, що приймає рядок, сегментним регістром, є регістр ES, а регістр DI містить відносна адреса області, що передає рядок. Сегментним регістром є регістр DS, а регістр SI містить відносна адреса. Таким чином,на початку програми перед виконанням команди MOVS необхідно ініціалізувати регістр ES разом з регістром DS, а також завантажити необхідні відносні адреси полів у регістри DI і SI. У залежності від стану прапора DF команда MOVS робить чи збільшення зменшення на 1 (для байта) чи на 2 (для слова) умісту регістрів DI і SI.
Приведемо команди, еквівалентні ланцюговій команді REP MOVSB:
JCXZ LABEL2
LABEL1: MOV AL,[SI]
MOV [DI],AL
INC/DEC DI ;Инкремент чи декремент
UNC/DEC SI ;Инкремент чи декремент
LOOP LABEL1
LABEL2: ...
У програмі процедура C10MVSB використовує команду MOVSB для пересилання вмісту десятибайтового полючи NAME1 у поле NAME2. Перша команда CLD скидає прапор напрямку в 0 для забезпечення процесу пересилання ліворуч праворуч. У нормальному стані прапор DF звичайно має нульове значення і команда CLD використовується з обережності. Дві команди LEA завантажують регістри SI і DI відносними адресами NAME1 і NAME2 відповідно. Тому що регістри DS і ES були раніше ініціалізовані адресою DATASG, те повні адреси полів NAME1 і NAME2 будуть у регістрах ES:DI і DS:SI. (COM програма автоматично ініціалізуеє регістри ES і DS). Команда MOV заносить у регістр CX значення 10 - довжину полів NAME1 і NAME2. Команда REP MOVSB виконує наступне:
- Пересилає самий лівий байт із полючи NAME1 (адресованого регістрами ES:DI) у самий лівий байт полючи NAME2 (адресованого регістрами DS:SI).
- Збільшує на 1 адреси в регістрах DI і SI для наступного байта.
- Зменшує CX на 1.
- Повторює перераховані дії (у даному випадку 10 разів), поки вміст регістра CX не стане рівним нулю.
Оскільки прапор DF має нульове значення, команда MOVSB збільшує адреси в регістрах DI і SI, і в кожній ітерації процес переходить на байт вправо, тобто пересилає байт із NAME1+1 у NAME2+1 і т.д. Якби прапор
DF був дорівнює 1, тоді команда MOVSB зменшувала б адреси в регістрах DI і SI, виконуючи процес праворуч ліворуч. Але в цьому випадку регістри SI і DI необхідно ініціалізувати адресами останніх байтів полів, тобто NAME1+9 і NAME2+9 відповідно.
У процедурі D10MVSW використовується команда MOVSW, що пересилає одне слово за одне виконання. Тому що команда MOVSW збільшує адреси в регістрах DS і SI на 2, операція вимагає тільки п'ять циклів. Для процесу пересилання праворуч ліворуч регістр SI повинний бути ініціалізованим адресою NAME1+8, а регістр DI - NAME2+8.
LODS: завантаження рядка
Команда LODS завантажує з пам'яті в регістр AL один чи байт у регістр AX одне слово. Адреса пам'яті визначається регістрами DS:SI. У залежності від значення прапора DF відбувається чи збільшення зменшення регістра SI.
Оскільки одна команда LODS завантажує регістр, то практичної користі від префікса REP у даному випадку немає. Часто проста команда MOV цілком адекватна команді LODS, хоча MOV генерує три байти машинного коду, а LODS - тільки один, але вимагає ініціалізацію регістра SI. Можна використовувати команду LODS у тому випадку, коли потрібно просуватися уздовж рядка (по чи байті по слову), перевіряючи регістр, що завантажується, на конкретне значення.
Команди, еквівалентні команді LODSB:
MOV AL,[SI]
INC SI
E10LODS демонструє використання команди LODSW. У прикладі обробляється тільки одне слово: перший байт з області NAME1 (утримуючий As) заноситься в регістр AL, а другий байт - у регістр AH. У результаті в регістрі AX вийде значення s.
STOS: запис рядка
Команда STOS записує (зберігає) уміст регістра AL чи AX у чи байті в слові пам'яті. Адреса пам'яті завжди представляється регістрами ES:DI. У залежності від прапора DF команда STOS також чи збільшує зменшує адресу в регістрі DI на 1 для чи байта на 2 для слова.
Практична користь команди STOS із префіксом REP - ініціалізація області даних конкретним значенням, наприклад, очищення дисплейного буфера пробілами. Довжина області (у чи байтах у словах) завантажується в регістр AX. Команди, еквівалентні команді REP STOSB:
JCXZ LABEL2
LABEL1: MOV [DI],AL
INC/DEC DI ;Инкремент чи декремент
LOOP LABEL1
LABEL2: ...
F10STOS демонструє використання команди STOSW. Операція здійснює запис тичина. 2020 (пробіли) п'ять разів в область NAME3, причому значення з регістра AL заноситься в перший байт, а з регістра AH - у другий. По завершенні команди регістр DI містить адреса NAME3+10.
CMPS: порівняння рядків
Команда CMPS порівнює вміст однієї області пам'яті із вмістами іншої області (адресуемой як ES:DI). У залежності від прапора DF команда CMPS також чи збільшує зменшує адреси в регістрах SI і DI на 1 для чи байта на 2 для слова. Команда CMPS установлює прапори AF, CF, OF, PF, SF і ZF. При використанні префікса REP у регістрі CX повинна знаходитися довжина порівнюваних полів. Команда CMPS може порівнювати будь-яке число чи байт слів.
Розглянемо процес порівняння двох рядків, що містять імена JEAN і JOAN. Порівняння побайтно ліворуч праворуч приводить до наступного:
J : J Дорівнює
E : O Не дорівнює (E менше O)
A : A Дорівнює
N : N Дорівнює
Порівняння всіх чотирьох байт закінчується порівнянням N:N - дорівнює/нуль. Тому що імена "не рівні", операція повинна зупинитись, як тільки буде виявлена умова "не дорівнює". Для цих цілей команда REP має модифікацію REPE, що повторює порівняння доти, поки порівнювані елементи рівні, чи регістр CX не дорівнює нулю. Кодується що повторює ся однобайтовое порівняння в такий спосіб:
REPE CMPSB
G10CMPS маються два приклади використання команди CMPSB. У першому прикладі відбувається порівняння вмісту полів NAME1 і NAME2. Тому що раніше команда MOVSB переслала вміст полючи NAME1 у поле NAME2, то команда CMPSB продовжується на всіх десятьох байтах і завершується станом дорівнює/нуль: прапор SF одержує значення 0 (позитивно) і прапор ZF - 1(нуль).
В другому прикладі порівнюється полючи NAME2 і NAME3. Раніше команда STOSW заповнила поле NAME3 пробілами, тому команда CMPB завершується після порівняння перших же байт із результатом "більше/нерівно": прапор SF одержує значення 0 (позитивно) і прапор ZF - 0 (не нуль).
Перший приклад закінчується з результатом "дорівнює/нуль" і заносить 01 у регістр BH. Другий приклад закінчується з результатом "нерівно" і заносить 02 у регістр BL. При трасуванні команд за допомогою одладчика DEBUG можна побачити, що наприкінці процедури G10CMPS регістр BX буде містити значення 0102.
Попередження! Показані приклади використовують команду CMPSB для порівняння одного байта за одне виконання. При використанні команди CMPSW для порівняння одного слова, необхідно ініціалізувати регістр CX значенням 5. Крім того варто пам'ятати, що команда CMPSW при порівнянні слів переставляє байти. Наприклад, порівнюючи імена SAMUEL і ARNOLD команда CMPSW вибирає замість SA і AR переставлені значення, тобто AS і RA. У результаті замість "більше" вийде "менше", тобто неправильний результат. У такий спосіб команда CMPSW працює правильно тільки при порівнянні рядків, що містять числові дані, визначені як DW, DD чи DQ.
SCAS: сканування рядків
Команда SCAS відрізняється від команди CMPS тим, що сканує (переглядає) рядок на визначене значення чи байта слова. Команда SCAS порівнює вміст області пам'яті з вмістом регістра AL чи AX. У залежності від значення прапора DF команда SCAS також чи збільшує зменшує адресу в регістрі DI на 1 для чи байта на 2 для слова. Команда SCAS установлює прапори AF, CF, OF, PF, SF і ZF. При використанні префікса REP і значення довжини в регістрі CX команда SCAS може сканувати рядка будь-якої довжини.
Команда SCAS особливо корисна, наприклад, у текстових редакторах, де програма повинна сканувати рядка, виконуючи пошук знаків пунктуації: крапок, ком і пробілів. H10SCAS сканує область NAME1 на малу літеру "m". Тому що команда SCASB повинна продовжувати сканування, поки результат порівняння - "не дорівнює" чи регістр CX не дорівнює нулю, то використовується префікс REPNE:
REPNE SCASB
Тому що область NAME1 містить слово "Assemblers", те команда SCASB знаходить символ "m" у п'ятому порівнянні. При використанні отладчика DEBUG для трасування команд наприкінці процедури H10SCAS можна побачити в регістрі AH значення 03 для індикації того, що символ "m" знайдений. Команда REP SCASB крім того зменшить значення регістра CX від 10 до 06.
Команда SCASW сканує в пам'яті слово на відповідність значенню в регістрі AX. При використанні команд LODSW чи MOV для пересилання слова в регістр AX, варто пам'ятати, що перший байт буде в регістрі AL, а другий байт - у регістрі AH. Тому що команда SCAS порівнює байти в зворотній послідовності, то операція коректна.
Сканування і заміна
У процесі обробки текстової інформації може виникнути необхідність заміни визначених символів у тексті на інші, наприклад, підстановка пробілів замість різних символів, що редагують. У приведеному нижче фрагменті програми здійснюється сканування рядка STRING і заміна символу амперсанд (&) на символ пробілу. Коли команда SCASB знайде символ & (у прикладі це буде позиція STRING+8), те операція сканування припинить ся і регістр DI буде містити адресу STRING+9. Для получе ния адреси символу & необхідно зменшити вміст DI на одиницю і записати по отриманій адресі символ пробілу.
STRLEN EQU 15 ;Довжина полючи STRING
STRING DB 'The time&is now'
...
CLD
MOV AL,'&' ;Шуканий символ
MOV CX,STRLEN ;Довжина полючи STRING
LEA DI,STRING ;Адреса полючи STRING
REPNE SCASB ;Сканувати
JNZ K20 ;Символ знайдений?
DEC DI ;Так - зменшити адреса
MOV BYTE PTR[DI],20H ;Підставити пробіл
K20: RET
Альтернативне кодування
При використанні команд MOVSB чи MOVSW ассемблер припускає наявність коректної довжини строкових даних і не вимагає кодування операндів у команді. Для команди MOVS довжина повинна бути закодована в операндах. Наприклад, якщо полючи FLDA і FLDB визначені як байтовие (DB), те команда REP MOVS FLDA,FLDB припускає повторювану пересилання байтів з полючи FLDB у поле FLDA. Цю команду можна записати також у наступному виді: REP MOVS ES:BYTE PTR[DI],DS:[SI]
Однак завантаження регістрів DI і SI адресами FLDA і FLDB обов'язкова в будь-якому випадку.
Дублювання зразка
Команда STOS буває корисна для установки в деякій області визначених значень байтів і слів. Для дублирова ния зразка, довжина якого перевищує розмір слова, можна використовувати команду MOVS з невеликою модифікацією. Припустимо, що необхідно сформувати рядок наступного виду:
***---***---***---***---***---...
Замість того, щоб визначати цілком весь рядок, можна визначити тільки перші шістьох байтів. Закодуємо зразок безпосередньо перед оброблюваним рядком у такий спосіб:
PATTERN DB '***---'
DISAREA DB 42 DUP(?)
CLD
MOV CX,21
LEA DI,DISAREA
LEA SI,PATTERN
REP MOVSW
У процесі виконання команда MOVSW спочатку пересилає перше слово (**) зі зразка PATTERN у перше слово області DISAREA, потім - друге слово (*-), потім третє (--):
***---***---
PATTERN DISAREA
До цього моменту регістр DI буде містити адреса DISAREA+6, а регістр SI - PATTERN+6, що також є адресою DISAREA. Потім команда MOVSW автоматично дублює зразок, пересилаючи перше слово з DISAREA у DISAREA+6, з DISAREA+2, у DISAREA+8, з DISAREA+4 у DISAREA+10 і т.д. У результаті зразок буде цілком продублирован по всій області DISAREA:
***---***---***---***---***---... ***---
¦ ¦ ¦ ¦
PATTERN DISAREA+6 DISAREA+12 DISAREA+42
Дану техніку можна використовувати для дублювання в області пам'яті будь-якого зразка будь-якої довжини. Зразок повинний бути розташований безпосередньо перед приймаючою областю.
Основні положення на пам'ять
- Для цепочечних команд MOVS, STOS, CMPS і SCAS не забувайте ініціалізувати регістр ES.
- Скидайте (CLD) чи встановлюйте (STD) прапор направ ления відповідно до напрямку обробки.
- Не забувайте встановлювати в регістрах DI і SI необходи мие значення. Наприклад, команда MOVS припускає операнди DI,SI, а команда CMPS - SI,DI.
- Ініціалізуйте регістр CX відповідно до кількості чи байтів слів, що беруть участь у процесі обробки.
- Для звичайної обробки використовуйте префікс REP для команд MOVS і STOS і модифікований префікс (REPE чи REPNE) для команд CMPS і SCAS.
- Помнете про зворотну послідовність байтів у порівняй ваемих словах при виконанні команд CMPSW і SCASW.
- При обробці праворуч ліворуч установлюйте початкові адреси на останній байт оброблюваної області. Якщо, наприклад, поле NAME1 має довжину 10 байтів, то для побайтовой обробки даних у цій області праворуч ліворуч початкова адреса , що завантажується командою LEA, повинний бути NAME1+9. Для обробки слів початкова адреса в цьому випадку - NAME1+8.
Список літератури
1. “Ассемблер и программирование для IBM”. Пітер Абель. Технологічний інститут Британська Колумбія.
2. Методичні вказівки до лабораторної роботи №1,2,3,4,5,6,7 за курсом "Конструювання програм і мови програмування" Укладач А.Н.Клименко НТУ «ХПІ» Кафедра обчислювальної техніки та програмування.
3. «Система программирования на макроассемблере ms-dos. Справочное руководство» Придніпровська філія радянсько-болгаро-фінського підприємства "новые информационные технологии"
Подобные документы
Правила оголошення та функціональне призначення простих і структурних операторів мови Паскаль. Принципи використання символьних масивів, процедур і функцій для обробки рядків. Особливості виконання операцій поєднання та порівняння над рядковими даними.
реферат [45,8 K], добавлен 13.11.2010Структура (класифікація) типів даних мови T. Pascal: прості, структуровані; стандартні модулі, їх призначення, символьні масиви. Визначення рядкового типу даних, основні операції. Стандартні засоби обробки рядків: присвоювання, порівняння, з’єднання.
реферат [32,3 K], добавлен 13.11.2010Автозаповнення. Прогресії. Виділення об’єктів. Видалення комірок, рядків та стовпців. Вставка комірок, рядків та стовпців. Переміщення та копіювання даних на листі. Перенесення даних із однієї робочої книги в іншу. Відміна дій. Арифметичні й інші типи опе
дипломная работа [58,2 K], добавлен 28.03.2004Тип як множина допустимих значень і операцій над об’єктами, формат його внутрішнього представлення. Класифікація типів даних; масиви, записи, файли, стандартні модулі. Функції і оператори роботи з рядками, засоби їх обробки: процедури і функції.
реферат [32,3 K], добавлен 13.11.2010Теорія реляційних баз даних. Реальні системи управління базами даних. Поняття таблиці і відношення, розходження між ними. Ідентифікація рядків таблиці. Потенційні, альтернативні, зовнішні, індексні, вторинні ключі та ключі шифрування і розшифрування.
реферат [292,3 K], добавлен 02.12.2011Сутність та характеристика обліку касових операцій. Програмування та алгоритмічні мови, його основи сутність та основні особливості. Технічні характеристики. Визначення структури вхідних та вихідних даних. Вимоги до технічних засобів. Опис алгоритмів.
курсовая работа [357,5 K], добавлен 13.02.2009Проблема інформаційної обробки геологічних даних. Методи побудови розрізу з відомих елементів залягання. Підготовка даних для аналізу. Ієрархія об'єктів, що беруть участь в побудовах. Розрахунок витрат на розробку та впровадження проектного рішення.
магистерская работа [4,2 M], добавлен 17.12.2014Створення програми з нетривіальною логікою на мові Асемблер, реалізуючи запропонований алгоритм за допомогою команд розгалуження та циклу. Механізми передачі керування та зміна послідовності виконання команд. Типи адресації. Команди умовного переходу.
лабораторная работа [390,3 K], добавлен 27.02.2013Розробка системних програм мовою асемблера або мовою високого рівня з вставками цією мовою. Формати числових даних, виконання арифметичних операцій. Арифметичні команди над двійковими цілими, двійково-десятковими не упакованими та упакованими числами.
методичка [232,4 K], добавлен 11.01.2010Поняття мови програмування С++, її сутність та особливості, призначення та використання. Структура програми, її основні елементи та загальні правила роботи. Охорона праці при роботі з обчислювальною технікою. Апаратні вимоги для виконання програми.
курсовая работа [126,2 K], добавлен 29.03.2009