- •Е.Ю. Колотовкина программирование микропроцессоров фирмы intel
- •Глава 1. Основы программирования микропроцессоров фирмы Intel
- •1.6 Команды обработки строк
- •Глава 2. Варианты самостоятельных и контрольных работ
- •2.1 Самостоятельная работа по теме «Архитектура пк»
- •2.2 Самостоятельная работа по теме «Подготовка ассемблерной программы к выполнению»
- •2.3 Самостоятельная работа по теме «Логика и организация программы»
- •2.4 Самостоятельная работа по теме «Экранные операции»
- •2.5 Самостоятельная работа по теме «Команды обработки строк»
- •2.6 Самостоятельная работа по теме «Арифметические операции»
- •2.7 Итоговая контрольная работа
- •Глава 3. Варианты заданий для практических занятий
- •3.1 Практическая работа №1. Создание программы на ассемблере
- •3.2 Практическая работа №2. Вывод символов на экран
- •3.3 Практическая работа №3. Ввод символов c клавиатуры
- •3.4 Практическая работа №4. Арифметические команды
- •3.5 Практическая работа №5. Организация цикла
- •3.7 Практическая работа №7. Условные переходы
- •3.8 Практическая работа №8. Команды сдвига
- •3.9 Практическая работа №9. Цепочечные команды
- •Литература
- •Глава 1. Основы программирования микропроцессоров фирмы Intel . . . . 5
- •Глава 2. Варианты самостоятельных и контрольных работ . . . . . . . . . . . .38
- •Глава 3. Варианты заданий для практических занятий . . . . . . . . . . . . . .43
1.6 Команды обработки строк
Данные, представляющие собой цепочку смежных байтов, называются строковые или цепочечные. Они могут быть как символьные, так и числовые. Для обработки строковых данных ассемблер имеет следующие команды:
1. movs – переслать байт, слово или двойное слово из одной области памяти в другую;
2. lods – загрузить из памяти байт, слово или двойное слово в регистр al, ax, eax.
3. stos – записать содержимое al, ax или eax в память.
4. cmps – сравнить содержимое двух областей памяти размером в байт, слово или двойное слово.
5. scas – сканирование области памяти на нахождение содержимого al, ax или eax.
В цепочечных операциях участвуют регистры:
1. esi – индекс источника, содержит текущий адрес элемента в цепочке – источнике.
2. edi – индекс приемника, содержит текущий адрес элемента в цепочке – приемнике.
Эти регистры содержат относительные адреса, указывающие на необходимые области памяти. Для загрузки этих адресов надо использовать команду lea. Регистр esi связан с регистром данных ds. Регистр edi всегда связан с регистром дополнительного сегмента es. Поэтому эти команды требуют инициализации регистра es (обычно адресом из регистра ds).
Команда |
Операнды |
Байт |
Слово |
Двойное слово |
Movs Lods Stos Cmps Scas |
di, si al, si v ax, si di, al v di, ax si, di di, al v di, ax |
movs b logs b stos b cmps b scas b |
Movs w Lods w Stos w Cmps w Scas w |
Movsd Lodsd Stosd Cmpsd Scasd |
Префикс повторения команды rep кодируется непосредственно перед цепочечной командой и обеспечивает повторение команды несколько раз.
Предварительно надо установить начальное значение в регистре cx. При выполнении цепочечной команды с префиксом rep происходит уменьшение на 1 значение cx до нуля. Т.о., можно обработать строки любой длины.
Флаг направления определяет направление обработки строки:
- для направления слева направо надо с помощью команды cld установить флаг df в 0;
- для направления справа налево надо с помощью команды std установить флаг df в 1;
Например, переслать 20 байт из s1 в s2. (предположим, что ds и es инициализированы адресом сегмента данных)
……………….
s1 db 20 dup (‘*’)сегмент
s2 db 20 dup (‘ ’) данных
……………….
cld; df=0
mov cx,20; счетчик на 20 байт
lea si,s1; адрес «откуда»
lea di,s2; адрес «куда»
rep movs b; пересылка по 1 байту.
При выполнении команд cmps и scas возможна установка флагов состояния, так чтобы операция могла прекратиться сразу после обнаружения необходимого условия:
rep – повторять операцию пока сх≠0.
repz/repe – повторять операцию, пока zf=1; прекратить выполнение, если zf=0 или cx=0 (для cmps);
repnz/repne – повторять операцию, пока zf=0; прекратить выполнение, если zf=1 или cx=0 (для scas).
В процессе обработки текстовой информации может возникнуть необходимость замены определенных символов в тексте на другие.
Например, заменить & на пробел. Команда scasb обнаружит символ & (S+8), операция сканирования прекратится, и регистр di будет содержать адрес S+9. Для получения адреса & надо уменьшить di на 1 и записать по полученному адресу символ пробела.
………………………..
S1 equ 15; длина поля S
S db ‘The time&is now’
……………………….
cld
mov dl, ‘&’; искомый символ
mov cx, S1; длина поля S
Lea di, S; адрес поля S
Repne scasb; сканировать
jnz k; если не найден →k
dec di; di=di-1
mov byte ptr [di], 20h; подставить пробел
k: ret
Команда stos полезна для установки в некоторой определенных значений байтов и слов. Для дублирования образца, длина которого превышает размер слова, можно использовать команду movs.
Например,
сформировать строку:
***---***---***---
p db ‘***---’; образец
d db 18 dup (?); область-приемник
………………………………………
cld; df=0
mov cx, 9; счетчик
lea di,d; адрес ‘куда’
lea si, p; адрес ‘откуда’
rep movsw
……………………….
Образец должен быть расположен непосредственно перед принимающей областью.