lect_11.ppt
- Количество слайдов: 16
ЛЕКЦИЯ № 11 СРЕДСТВА МИКРОПРОЦЕССОРА ДЛЯ ОБРАБОТКИ ЦЕПОЧЕК ЭЛЕМЕНТОВ В ПАМЯТИ Группа цепочечных команд позволяет производить различные действия над блоками памяти, представляющими собой последовательности элементов следующего размера: • 8 бит (байт); • 16 бит (слово); • 32 бита (двойное слово). Всего в системе команд семь цепочечных команд-примитивов, каждая из которых реализуется в виде трех машинных команд. Общей особенностью всех цепочечных команд является то, что все они после обработки очередного элемента цепочки осуществляют продвижение к следующему элементу.
Перечень команд обработки цепочек • пересылка цепочки: movs адрес-приемника, адрес-источника movsb movsd • сравнение цепочек: cmps адрес-приемника, адрес-источника cmpsb cmpsw cmpsd • сканирование цепочки: scas адрес-приемника scasb scasw scasd
• загрузка элементов из цепочки: lods адрес-источника lodsb lodsw lodsd • сохранение элемента в цепочке: stos адрес-приемника stosb stosw stosd • получение элементов цепочки из порта ввода-вывода: ins номер-порта, адрес-источника insb insw insd • вывод элементов цепочки в порт ввода-вывода: outs номер-порта, адрес-источника outsb outsw outsd
Префиксы повторения: • rep Заставляет команды выполняться до тех пор, пока содержимое ecx/cx не станет равно нулю. При этом после каждого очередного выполнения команды, перед которой стоит префикс, содержимое регистра-счетчика уменьшается на единицу. • repe/repz С регистром ecx/cx работа осуществляется также, но дополнительно контролируется флаг zf , выполнение команды прекращается если либо содержимое ecx/cx равно нулю, либо zf=0. • repne/repnz Действует также, как и repe/repz, только реагирует противоположным образом на флаг zf. Независимо от того, используются ли цепочечные команды с операндами, или без них, полные физические адреса строк должны формироваться следующим образом: • адрес-источника – пара ds: esi/si; • адрес-приемника – пара es: edi/di.
Направление обработки цепочек определяется флагом df: • в направлении возрастания адресов, если df=0; в этом случае значения индексных регистров esi/si и edi/di будут автоматически увеличиваться; • в направлении убывания адресов, если df=1; в этом случае значения индексных регистров esi/si и edi/di будут автоматически уменьшаться. Для управления флагом df служат команды: cld (Clear Direction Flag) – збрасывает флаг в 0; std(Set Direction Flag) – устанавливает флаг в 1. Типовая последовательность действий при использовании цепочечных команд 1. Установить значение флага df в зависимости от желаемого направления обработки цепочек. 2. Загрузить указатели на адреса цепочек в памяти в пары регистров ds: (e)si, es: (e)di. 3. Загрузить в регистр (e)cx количество символов, подлежащих обработке.
4. Выдать команду цепочечной обработки с префиксом rep (repeили repne). Пересылка цепочек Пример1: (пересылка строк командой movs) masm model stack. data sourse dest. code small 256 db “Тестируемая строка”, ’$’ db 19 dup(“ “) assume ds: @data, es: @data main: mov mov ax, @data ds, ax es, ax ; строка-источник ; строка-приемник
cld ; сброс флага направления df ; обработка от начала к концу lea di, dest mov cx, 20 movs dest, sourse lea dx, dest ; вывод на экран строки- mov ah, 09 h ; приемника int 21 h mov ax, 4 c 00 h int rep si, sourse 21 h exit: end main
Сравнение цепочек Производится одной из команд: cmps, cmpsb, cmpsw, cmpsd с подходящим префиксом. • repe/repz – если необходимо организовать сравнение до тех пор, пока не будет выполнено одно из двух условий: • достигнут конец цепочки (содержимое регистра (e)cx равно нулю); • в цепочках встретились разные элементы (zf=0). • repne/repnz – если необходимо организовать сравнение до тех пор, пока не будет выполнено одно из двух условий: • достигнут конец цепочки (содержимое регистра (e)cx равно нулю); • в цепочках встретились равные элементы (zf=1). Для определения конкретной причины окончания повторного выполнения команды сравнения можно использовать команды условного перехода.
После выхода из цикла сравнения в индексных регистрах будут находится адреса следующих (или предыдущих) элементов по отношению к первым не совпавшим элементам. Пример 2: (Сравнение двух строк) masm model small stack 256. data match db 0 ah, 0 dh, ’Строки совпадают. ’, ’$’ failed db 0 ah, 0 dh, ’Строки не совпадают. ’, ’$’ string 1 db “ 0123456789”, 0 ah, 0 dh, ’$’ string 2 db “ 0123406789”, ’$’. code assume as: @data, es: @data main: mov ax, @data mov ds, ax mov es, ax
mov lea int cld lea mov cycl: repe ah, 09 h dx, string 1 21 h dx, string 2 21 h si, string 1 di, string 2 cx, 10 cmps jcxz jne string 1, string 2 equal notmatch mov lea int jmp ah, 09 h dx, match 21 h exit equal:
notmatch: mov lea int ah, 09 h dx, failed 21 h dec lodsb stosb jmp si di mov int main ax, 4 c 00 h 21 h cycl exit: end
Загрузка элемента цепочки в аккумулятор и перенос элемента из аккумулятора в цепочку Осуществляются командами lods адрес-источника (lodsb, lodsw, lodsd) и stos адрес-приемника (stosb, stosw, stosd) полный адрес операнда адрес-источника формируется в паре ds: esi/si; полный адрес операнда адрес-приемника формируется в паре es: edi/di. Элемент помещается в регистр al.
СЛОЖНЫЕ СТРУКТУРЫ ДАННЫХ К элементарным данным относятся: • непосредственные данные, представляющие собой числовые или символьные значения, являющиеся частью команды; • данные, описываемые с помощью директив резервирования и инициализации памяти. Сложные типы данных строятся на основе базовых типов. TASM поддерживает следующие сложные типы данных: • массивы; • структуры; • объединения; • записи.
МАССИВЫ В АССЕМБЛЕРЕ Массив – структурированный тип данных, состоящий из некоторого числа элементов одного типа. Описание и инициализация массива • перечислением элементов массива в поле операндов одной из директив описания данных mas dd 1, 2, 3, 4, 5 • используя оператор повторения dup mas dw 5 dup (0) • используя директивы label и rept … mas-b label mas-w label rept word 4 dw endm byte 0 f 1 fh
• используя цикл для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив Доступ к элементам массива В общем случае адрес элемента массива формируется по следующей схеме база + (индекс * размер элемента) Архитектура микропроцессора представляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, которые позволяют реализовать несколько режимов адресации данных. Это позволяет организовать эффективную работу с массивами. • Если для описания адреса используется только один регистр, то речь идет о базовой адресации, и этот регистр рассматривается как базовый mov al, [ebx] • Если для задания адреса в команде используется прямая адресация (в виде идентификатора) в сочетании с одним регистром, то речь идет об индексной адресации. Регистр считается индексным и можно использовать масштабирование.
add eax, mas[ebx*4] • Если для описания адреса используются два регистра, то речь идет о базово-индексной адресации. Левый регистр рассматривается как базовый, а правый – как индексный sub ax, mas[bx][dx*2] Двумерные массивы Если последовательность однотипных данных в памяти трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле: (база + количество_элементов_в_строке *размер_эл-та*i + j*размер эл-та) Здесь I=0…n-1 указывает номер строки, а j=0…m-1 указывает номер столбца. Для организации адресации двумерных массивов удобно использовать базово-индексную адресацию.
lect_11.ppt