Архитектура компьютера

Введение
Теоретическая часть
    1 Архитектура компьютера
     
Лабораторный практикум
  1 Создание программы на языке ассемблера
  2 Применение функций DOS и BIOS
  3 Линейные алгоритмы
  4 Десятичная арифметика
  5 Команды передачи управления
  6 Циклы с условием
  7 Циклы со счетчиком
  8 Работа с массивами
  9 Цепочечные команды
     
Приложения
  1 Таблица кодов символов ASCII
  2 Функции DOS и BIOS
     
Гостевая книга

Лабораторная работа №9

Цепочечные команды

Вопросы для повторения:

  1. Что такое массивы и в каких случаях они используются?
  2. Как организуется доступ к элементам массивов?
  3. Какие еще структурированные типы данных поддерживаются языками высокого уровня?

Кроме привычного всем понятия массивов в ассемблере существует структура называемая цепочкой. Цепочка - непрерывная последовательность байт, слов или двойных слов, обрабатываемая как единое целое. Основное отличие цепочек от массивов состоит в способе доступа к элементам: для массивов - произвольный доступ, для цепочек - только последовательный (от начала цепочки к концу или от конца к началу). Цепочечные команды - команды для обработки цепочек. Особенностью всех цепочечных команд (кроме обработки очередного элемента цепочки) является автоматическое продвижение к следующему элементу цепочки.

Цепочечные команды:

Название Команды Действие
пересылка цепочки 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

Направление обработки

  1. от начала к концу
    df = 0; si и di автоматически увеличиваются
    команда cld (clear direction flag) сбрасывает флаг df
  2. от конца к началу
    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

  1. Write(S). Вывести строку S на экран (конец строки задается символом с кодом 0); (3 балла);
  2. Length(S). Определить длину строки S (конец строки задается символом с кодом 0); (3 балла);
  3. Copy(S, p, i). Скопировать из строки S подстроку длиной i символов начиная с позиции p; (5 баллов);
  4. Concat(S1, S2). Выполнить операцию конкатенации строк S1 и S2; (5 баллов);

Задания для самостоятельного выполнения:

Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo Pascal

  1. Delete(S, p, i). Удалить из строки S i символов начиная с позиции p; (7 баллов);
  2. Insert(S1, S2, p). Вставить подстроку S1 в строку S2 начиная с позиции p; (8 баллов);
  3. Pos(S1, S2). Найти номер позиции, с которой начинается подстрока S1 в строке S2; (9 баллов).
© Истомин А.С. ЗабГГПУ
Хостинг от uCoz