Архитектура компьютера
Введение Теоретическая часть 1 Архитектура компьютера Лабораторный практикум 1 Создание программы на языке ассемблера 2 Применение функций DOS и BIOS 3 Линейные алгоритмы 4 Десятичная арифметика 5 Команды передачи управления 6 Циклы с условием 7 Циклы со счетчиком 8 Работа с массивами 9 Цепочечные команды Приложения 1 Таблица кодов символов ASCII 2 Функции DOS и BIOS Гостевая книга Лабораторная работа №9
Цепочечные команды
Вопросы для повторения:
- Что такое массивы и в каких случаях они используются?
- Как организуется доступ к элементам массивов?
- Какие еще структурированные типы данных поддерживаются языками высокого уровня?
Кроме привычного всем понятия массивов в ассемблере существует структура называемая цепочкой. Цепочка - непрерывная последовательность байт, слов или двойных слов, обрабатываемая как единое целое. Основное отличие цепочек от массивов состоит в способе доступа к элементам: для массивов - произвольный доступ, для цепочек - только последовательный (от начала цепочки к концу или от конца к началу). Цепочечные команды - команды для обработки цепочек. Особенностью всех цепочечных команд (кроме обработки очередного элемента цепочки) является автоматическое продвижение к следующему элементу цепочки.
Цепочечные команды:
Название Команды Действие пересылка цепочки movs <адр. приемника>, <адр. источника>
movsb, movsw, mowsdкопирует один элемент цепочки из операнда источника в операнд приемник сравнение цепочек cmps <адр. приемника>, <адр. источника>
cmpsb, cmpsw, cmpsdсравнивает элементы цепочек из операнда источника и операнда приемника сканирование цепочки scas <адр. приемника>
scasb, scasw, scasdсканирует цепочку приёмник на присутствие некоторого элемента (задаётся в регистре аккумуляторе) загрузка элемента из цепочки lods <адр. источника>
lodsb, lodsw, lodsdзагрузить элемент из цепочки источника в регистр аккумулятор сохранение элемента в цепочке stos <адр. приемника>
stosb, stosw, stosdвосстановить элемент из регистра аккумулятора в цепочку получение элемента цепочки из порта ввода/вывода ins <адр. приемника>, <номер порта>
insb, insw, insdзагрузить элемент в цепочку приемник из указанного порта ввода/вывода вывод элементов цепочки в порт ввода/вывода outs <номер порта>, <адр. источника>
outbs, outws, outdsпереслать элемент из цепочки источника в указанный порт ввода/вывода Особенности использования
Адресация операндов
цепочка источник - ds:si
цепочка приёмник - es:diНаправление обработки
- от начала к концу
df = 0; si и di автоматически увеличиваются
командаcld
(clear direction flag) сбрасывает флаг df- от конца к началу
df = 1; si и di автоматически уменьшаются
командаstd
(set direction flag) устанавливает флаг dfПрефиксы повторения
Префиксы повторения зацикливают выполнение команды, позволяя обрабатывать всю цепочку одной командой. Префиксы повторения указываются перед нужной цепочечной командой в поле метки. Цепочечная команда без префикса повторения выполняется один раз, с префиксом - в цикле.
rep
выполнять, пока cx<>0 (cx уменьшается автоматически);
repe
выполнять, пока cx<>0 или zf=1 (cx уменьшается автоматически);
repne
выполнять, пока cx<>0 или zf=0 (cx уменьшается автоматически);Пример: Написать программу копирования строки.
1 data segment
2 s1 db 'Тестируемая строка$'
;строка которую будем копировать 3 s2 db 20 dup (' ')
;строка куда будем копировать 4 data ends
5 6 code segment
7 start:
8 assume cs:code, ds: data
9 mov ax, data
10 mov ds, ax
;цепочка источник 11 mov es, ax
;и цепочка приёмник в одном сегменте 12 13 cld
;обработка от начала к концу 14 lea si, s1
;цепочка источник 15 lea di, s2
;цепочка приёмник 16 mov cx, 20
;количество элементов для обработки 17 rep
movsb
;копируем строку 18 19 mov ah, 09
20 lea dx, s2
21 int 21h
;выводим строку-приёмник на экран 22 23 mov ax, 4c00h
24 int 21h
25 code ends
26 end start
Задания для выполнения:
Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo Pascal
- Write(S). Вывести строку S на экран (конец строки задается символом с кодом 0); (3 балла);
- Length(S). Определить длину строки S (конец строки задается символом с кодом 0); (3 балла);
- Copy(S, p, i). Скопировать из строки S подстроку длиной i символов начиная с позиции p; (5 баллов);
- Concat(S1, S2). Выполнить операцию конкатенации строк S1 и S2; (5 баллов);
Задания для самостоятельного выполнения:
Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo Pascal
- Delete(S, p, i). Удалить из строки S i символов начиная с позиции p; (7 баллов);
- Insert(S1, S2, p). Вставить подстроку S1 в строку S2 начиная с позиции p; (8 баллов);
- Pos(S1, S2). Найти номер позиции, с которой начинается подстрока S1 в строке S2; (9 баллов).
© Истомин А.С. ЗабГГПУХостинг от uCoz