- •Магомедов и. А. Микропроцессорные системы. Аппаратные и программные средства.
- •Глава 1. Микропроцессоры
- •Глава II. Программирование микропроцессоров
- •Глава III. Лабораторный практикум по программированию мп i80х86
- •Глава 1. Микропроцессоры
- •1.1. Назначение микропроцессоров
- •1.2. Универсальные микропроцессоры
- •1.2.2. Микропроцессоры компании amd
- •1.2.3. Микропроцессоры компании Cyrix
- •1.2.4. Микропроцессоры с архитектурой Alpha
- •1.2.5. Микропроцессоры с архитектурой sparc
- •1.2.6. Микропроцессоры Hewlett-Packard ра-8000
- •1.3. Микропроцессоры обработки сигналов
- •1.3.1. Сигнальные микропроцессоры компании
- •1.3.2. Сигнальные микропроцессоры компании Motorola
- •1.3.3. Микропроцессоры семейства dsp 560хх
- •1.4. Медийные микропроцессоры
- •1.5. Транспьютероподобные микропроцессоры
- •1.6. Нейропроцессоры
- •Глава II. Программирование микропроцессоров
- •2.1. Программная модель 32-разрядных процессоров
- •2.1.2. Типы данных
- •2.1.3. Регистры процессора
- •2.2. Форматы команд
- •2.3. Выбор операнда
- •2.4. Режимы адресации
- •Вопросы для самоконтроля к главе 2
- •Глава III. Лабораторный практикум по программированию мп i86
- •Обобщенная структурная схема микропроцессора х86
- •Организация основной памяти и средства аппаратной поддержки управления памятью
- •Выполнение программы
- •Формат операторов ассемблера
- •Определение полей памяти для размещения данных.
- •3.2. Операнды команд ассемблера
- •Команда пересылки данных
- •Команда загрузки исполнительного адреса
- •Команды загрузки указателя.
- •Команда записи в стек
- •Команда обмен данными
- •Команды сложения/ Команды вычитания
- •Команда изменения знака
- •Команда добавления /вычитания единицы
- •Команда сравнения
- •Команды умножения/ деления
- •Команда преобразования байта в слово, а слова - в двойное слово.
- •Команды передачи управления
- •Команды условного перехода
- •Команды организации циклической обработки
- •Команда перехода по обнуленному счетчику
- •Команды организации цикла с условием
- •Команды вызова подпрограмм
- •Команда возврата управления
- •Команды обработки строк
- •Логические команды
- •2. Программирование циклических процессов.
- •3. Моделирование одномерных массивов
- •4. Моделирование матриц
- •5. Преобразования ввода-вывода.
- •3.4. Основные команды отладчика afd
- •Fspec определяет имя файла, наименованного в соответствии с соглашениями dos. Для команды l расширением по умолчанию является “exe”;
- •String задает список значений или ascii строк (строка заключена в кавычки) разделенных пробелами или запятой.
- •Например: 1234 bx, ‘tromb’ ff.
- •Лабораторная работа № 1 Создание выполнимого файла, работа в отладчике, изучение оператора пересылки mov
- •Оператор mov
- •Индивидуальные задания
- •Лабораторная работа № 2 Сегментация памяти, директивы ассемблера
- •Прямая адресация
- •Косвенная адресация
- •Директива assume
- •Индивидуальные задания
- •Лабораторная работа №.3 Директивы equ, label, команды сложения и вычитания Директива equ
- •Директива label
- •Команды сложения и вычитания
- •Индивидуальные задания Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Вариант 11.
- •Вариант 12.
- •Лабораторная работа № 4 Изучение операторов обмена xchg и xlat
- •Индивидуальные задания Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
- •Вариант 6.
- •Вариант 7.
- •Вариант 8.
- •Вариант 9.
- •Вариант 10.
- •Вариант 11.
- •Вариант 12.
- •Система команд процессораi486
- •П1. Команды пересылки данных
- •П2. Арифметические команды
- •П3. Логические команды
- •П4. Команды переходов
- •П5. Команды процессора i486
Команды обработки строк
Команды обработки строк используются для организации циклической обработки последовательностей элементов длиной 1 или 2 байта [35]. Адресация операндов при этом выполняется с помощью пар регистров: DS:SI - источник, ES:DI - приемник. Команды имеют встроенную корректировку адреса операндов согласно флагу направления D: D=1 - уменьшение адреса на длину элемента, D=0 - увеличение адреса на длину элемента. Корректировка выполняется после выполнения операции.
Установка требуемого значения флага направления выполняется специальными командами:
STD - установка флага направления,
CLD - сброс флага направления.
Команда загрузки строки LODS
LODSB (загрузка байта),
LODSW (загрузка слова).
Команда загружает байт в АL или слово в AX. Для адресации операнда используются регистры DS:SI
Команда записи строки STOS
STOSB ( запись байта),
STOSW (запись слова)
записывает в основную память содержимое AL или АX соответственно. Для адресации операнда используются регистры ES:DI.
Команда пересылки MOVS
MOVSB (пересылка байта),
МОVSW (пересылки слова)
пересылает элемент строки из области, адресуемой регистрами DS:SI, в область, адресуемую регистрами ЕS:DI.
Команда сканирования строки SCAS
SCASB (поиск байта),
SCASW (поиск слова).
По команде содержимое регистра AL или АХ сравниваются с элементом строки, адресуемым регистрами DS:SI и устанавливается значение флажков в соответствии с результатом [DI] - AL или [DI]-AX.
Команда сравнения строк CMPS
СMPSB (сравнение байт),
СMPSW (сравнение слов)
элементы строк, адресуемых парами регистров DS:SI и ES:DI, сравниваются и устанавливаются значения флажков в соответствии с результатом [DI]-[SI].
Префиксная команда повторения
REP <команда> ; позволяет организовать повторение указанной команды CX раз.
Например:
rep stosb
Здесь поле, адресуемое парой регистров ES:DI длиной CX заполняется содержимым AL .
Префиксные команды «повторять, пока равно» и «повторять, пока не равно».
REPE <команда>
REPNE <команда>
Префиксные команды используются совместно с командами СMPS и SCAS. Префикс REPE означает повторять, пока содержимое регистра СХ не равно нулю и значение флажка нуля равно единице, a REPNE - повторять, пока содержимое регистра CX не равно нулю и значение флажка нуля равно нулю.
Логические команды
NOT <операнд> - логическое НЕ;
AND <операнд 1>, <операнд 2> - логическое И;
OR <операнд 1>, <операнд 2> - логическое ИЛИ;
XOR <операнд 1>, <операнд 2> - исключающее ИЛИ;
TEST <операнд 1>, <операнд 2> - И без записи результата.
Логическая инструкция выполняет поразрядные операции над битами исходных операндов [38]. Например, инструкция:
adn ax,dx
выполняет логическую операцию AND с битом 0 регистра AX и битом 0 регистра DX, затем ту же операцию с битами 1, 2 и т.д. до бита 15.
Инструкция AND комбинирует два операнда в соответствии с правилами, показанными в Таблице 5.1, устанавливая каждый бит результата (операнда-приемника) в 1 только в том случае, если оба соответствующих бита операнда-источника равны 1. Инструкция AND позволяет вам выделить отдельный бит или принудительно установить
его в значение 0.
Например, инструкции:
mov dx,3dah
in al,dx
and al,1
выделяет бит 0 байта состояния цветного графического адаптера (CGA). Эти нструкции оставляют регистр AL установленным в значение 1, если видеопамять адаптера CGA можно изменять, не вызывая помех на экране ("снег"), и устанавливают его в нулевое значение в противном случае.
Инструкция OR также комбинирует два операнда в соответствии с правилами, приведенными в Таблице 5.1, устанавливая каждый бит операнда-приемника в значение 1, если любой из соответствующих бит операнда-источника равен 1. Инструкция OR позволяет вам принудительно установить отдельные биты (или бит) в значение 1.
Например, инструкции:
mov ax,40h
mov ds,ax
mov bx,10h
or WORD PTR [bx],0030h
устанавливают биты 5 и 4 слова флагов аппаратуры базовой системы ввода-вывода BIOS в значение 1. При этом BIOS будет поддерживать монохромный дисплейный адаптер.
Инструкция XOR также комбинирует два операнда в соответствии с правилами, приведенными в Таблице 5.1, устанавливая каждый бит операнда-приемника в значение 1, только в том случае, один соответствующих бит операнда-источника равен 0, и в значение 1 в противном случае. Инструкция XOR позволяет вам "переключать" значения отдельных бит в байте.
Например, инструкции:
mov al,01010101b
mov al,11110000b
устанавливают регистр AL в значение 10100101b или A5h. Когда для регистра AL выполняется операция XOR со значением 11110000b (0F0h), биты со значением 1 в 0F0h переключают значения соответствующих бит в регистре AL, а биты со значением 0 оставляют соответствующие биты AL неизмененными.
Инструкция XOR дает удобный способ обнуления содержимого регистра. Например, следующая инструкция устанавливает содержимое регистра AX в значение 0:
xor ax,ax
Инструкция NOT просто изменяет значение каждого бита операнда на противоположное (как если бы над исходным операндом была выполнена операция XOR со значением 0FFh).
Например:
mov bl,10110001b
not bl ; переключить BL в 01001110b
xor bl,0ffh ; переключить BL обратно в значение 10110001b
Команды сдвига и циклического сдвига
В процессорах i86 имеется множество способов, с помощью которых можно сдвигать биты регистра или переменной в памяти влево или вправо [38]. Простейшим из них является логический сдвиг.
Инструкция SHL (сдвиг влево, синоним - SAL) перемещает каждый бит операнда-приемника на один разряд влево, по направлению к старшему биту. Например, значение 10010110b (96h или 150 в десятичном представлении), записанное в AL, сдвигается влево с помощью инструкции SHL AL,1. В результате получается значение 00101100b (24Ch или 44 в десятичном виде), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 1.
Самый старший бит вовсе сдвигается из операнда и попадает во флаг переноса, а в наименее значащий бит заносится 0.
Для чего используется сдвиг влево? Чаще всего это делается для выполнения с помощью операции SHL умножения на степень числа 2, так как каждая инструкция SHL умножает операнд на 2. Например, с помощью следующих инструкций DX умножается на 16:
shl dx,1 ; DX * 2
shl dx,1 ; DX * 4
shl dx,1 ; DX * 8
shl dx,1 ; DX * 16
Умножение с помощью сдвига выполняется гораздо быстрее, чем с помощью операции MUL.
Как вы могли заметить, в предыдущем примере в инструкции SHL используется второй операнд - значение 1. Этот операнд указывает, что содержимое DX нужно сдвинуть на 1 бит. К сожалению, процессор 8086 не поддерживает использования в качестве константы сдвига других, отличных от 1 постоянных значений - 2, 3 и т.д. Однако, в качестве счетчика сдвигов допускается использование регистра CL.
Например, инструкции:
mov cl,4
shl dx,cl ;умножают содержимое регистра DX на 16 (как и в предыдущем примере).
Если есть сдвиг влево, то логично было бы предположить, что существует также сдвиг вправо, и это так. Фактически, имеется даже две операции сдвига вправо. Инструкция SHR (сдвиг вправо) очень похожа на инструкцию SHL. Она выполняет сдвиг разрядов операнда вправо на 1 или CL бит, затем сдвигает наименее значащий бит во флаг переноса и помещает 0 в самый значащий бит. Инструкция SHR дает быстрый способ выполнения беззнакового деления на степень числа 2.
Инструкция SAR (арифметический сдвиг вправо) аналогична инструкции SHR, только при ее выполнении старший бит операнда сдвигается вправо в следующий бит, а затем копируется обратно. Так значение 10010110b (96h или -106 в десятичном представлении со знаком), записанное в регистре AL, сдвигается вправо с помощью инструкции SAR AL,1. В результате получается значение 11001011b (0CBh или -53 в десятичном представлении со знаком), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 0.
Таким образом, при выполнении данной инструкции сохраняется знак операнда, поэтому инструкцию SAR полезно использовать для выполнения деления со знаком на степень числа 2. Например, в результате выполнения инструкций:
mov bx,-4
sar bx,1 ;в регистре BX будет записано значение -2.
В наборе инструкций процессора i86 имеется также четыре инструкции циклического сдвига: ROR, ROL, RCR и RCL. Инструкция ROR аналогична инструкции SHR, но при ее выполнении наименее значащий бит сдвигается в наиболее значащий бит, а также во флаг переноса. Например, значение 10010110b (96h или 159 в десятичном представлении), записанное в регистре AL, циклически сдвигается вправо с помощью инструкции ROR AL,1. В результате получается значение 01001011b (04Bh или 75 в десятичном представлении), которое записывается обратно в регистр AL.
Операция ROL имеет действие, обратное действию операции ROR. Операнд также сдвигается циклически, но сдвиг выполняется влево. При этом наиболее значащий бит сдвигается в наименее значащий. Инструкции ROR и ROL полезно использовать для переупорядочивания бит в байте или в слове. Например, в результате выполнения инструкций:
mov si,49F1h
mov cl,4
ror si,cl ;в регистр SI будет записано значение 149Fh: биты 3-0 переместятся в биты 15-12, биты 7-4 - в биты 3-0 и т.д.
Инструкции RCR и RCL работают несколько по-другому. Инструкция RCR аналогично инструкции сдвига вправо, при этом наиболее значащий бит сдвигается из флага переноса. Значение 10010110b (96h или 159 в десятичном представлении), записанное в регистре AL, циклически сдвигается вправо через флаг переноса, начальное значение которого равно 1, с помощью инструкции RCR AL,1. В результате получается значение 11001011b (0CBh или 203 в десятичном представлении), которое записывается обратно в регистр AL. Флаг переноса устанавливается в значение 0.
Инструкция RCL аналогично, соответственно, левому сдвигу. При выполнении этой инструкции наименее значащий бит сдвигается из флага переноса. Инструкции RCR и RCL полезно использовать для сдвига операнда, состоящего из нескольких слов. Например, следующие инструкции выполняют умножение значения в DX:AX, размером в двойное слово, на 4:
shl ax,1 ; бит 15 регистра AX сдвигается во флаг переноса
rcl dx,1 ; флаг переноса сдвигается в бит 0 регистра DX
shl ax,1 ; бит 15 регистра AX сдвигается во флаг переноса
rcl dx,1 ; флаг переноса сдвигается в бит 0 регистра DX
Инструкции циклического сдвига, аналогично инструкциям сдвига, могут сдвигать операнд на 1 бит или на число бит, заданных регистром CL.
Команды ввода - вывода
До сих пор обсуждали перемещение данных между константами, регистрами и адресным пространством процессора i86. Однако, в процессоре i86 имеется также второе, независимое адресное пространство, которое называется пространством адресов ввода-вывода [38] . В общем случае в качестве каналов управления и обмена данными таких устройств, как дисководы, дисплейные адаптеры, принтеры и клавиатура, могут использоваться 65536 адресов ввода-вывода или портов.
Большинство инструкций процессора i86, включая инструкцию MOV, имеют доступ только к операндам в пространстве адресов памяти. Обращаться к портам ввода-вывода могут только две инструкции - IN и OUT.
Инструкция IN копирует содержимое из указанного порта ввода-вывода в регистр AL или AX. Адрес порта ввода-вывода, указываемый в качестве источника, можно выбрать одним из двух способов.
Если адрес порта меньше 256 (100h), то можно указать его в инструкции, например:
in al,41h
Эта инструкция копирует байт из порта ввода-вывода 41h в регистр AL.
При втором способе можно использовать для ссылки на порт ввода-вывода, из которого нужно выполнить чтение, регистр DX:
mov dx,41h ; загрузить число в регистр dx;
in al,dx ; загрузить содержимое внешнего устройства с адресом 41h в регистр al.
Регистр DX используется в качестве указателя порта ввода-вывода в двух случаях. Во-первых, если адрес порта ввода-вывода превышает 255, то необходимо использовать DX. Во-вторых, использование регистра DX позволяет при адресации к портам ввода-вывода получить большую гибкость. Например, указатель на порт ввода-вывода можно передать подпрограмме, загрузив его в регистр DX.
В указанных инструкциях регистры AL и AX являются единственно возможными операндами-приемниками. Аналогично, единственными допустимыми операндами-источниками являются регистр DX и значение-константа, меньшая 255.
Инструкция OUT в точности эквивалентна инструкции IN, только операндом-источником является регистр AL или AX, а порт ввода-вывода, на который указывает регистр DX или постоянное значение, меньшее 256, является операндом-приемником. Например, следующие инструкции устанавливают порт вывода 5а5h в значение 0Fh:
mov dx,5а5h
mov al,0fh
out dx,al
3.3.1. Основные приемы программирования на ассемблере
Ассемблер, являясь языком низкого уровня, не содержит операторов ветвления, циклов, не поддерживает автоматического формирования адресов для структур данных, не обеспечивает автоматического выполнения преобразований при вводе-выводе данных. Все перечисленные операции программируются "вручную" с использованием имеющихся команд ассемблера.
Программирование ветвлений
В
cmp ...
j<условие> else
<операции 1>
jmp com
else: <операции 2>
com: <продолжение>
Пример.
Написать процедуру вычисления X=max(A,B):
max proc near
mov ax, A
cmp ax, B ; сравнение A и B
jl less ; переход если меньше
mov X, ax
jmp continue ; переход на конец ветвления
less: mov ax, B
mov X, ax
continue: ret
max endp
