СОДЕРЖАНИЕ
2. Программная модель микропроцессора 8086
2.4. Способы задания операндов команды
3. Основные понятия языка ассемблера
3.2. Директивы определения данных
4. Сегментированная модель памяти
4.3. Общая структура программы
5.1. Соглашению по описанию команд
5.6. Команды организации циклов
5.11. Команды управления микропроцессором
7. Разработка одномодульной программы
7.1. Трансляция и компоновка программы
8. Разработка многомодульных программ
8.1. Принципы разработки модулей
8.2. Расширенное применение директивы сегментации
Программирование микропроцессорных устройств
10. Программирование системного таймера
10.1. Описание таймера-счетчика 8254
10.3. Структура регистров таймера
11. Программирование контроллера прерываний
11.1. Механизм обработки прерываний
11.4. Контроллер прерываний 8259
11.5. Идентификация прерываний
11.6. Прерывания bios и ms-dos
12. Программирование параллельного порта
12.2. Работа с параллельным портом на низком уровне
12.3. Стандартные средства работы с параллельным портом
13. Программирование последовательного порта
13.1. Основы последовательной передачи данных
13.2. Последовательный интерфейс rs-232c
13.3. Универсальный асинхронный приемо-передатчик 8250
13.4. Порты асинхронного адаптера
13.5. Стандартные средства программирования последовательного порта
Битовые операции.Команды AND, OR, XOR и TEST являются командами логических операций. Все они обрабатывают байт или слово, расположенное в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.
Логические команды обладают рядом особенностей:
Команды реализуют поразрядные операции: i-й разряд результата зависит только от i-х разрядов операндов и операция выполняется одновременно над всеми разрядами операндов.
Разряд 1 трактуется как «истина», разряд 0 – как «ложь». Для представления логического нуля и единице используют следующий код: «ложь» – 00000000b (00h) «истина» – 11111111b (0FFh = -1).
Команды воздействуют на все флаги условий, но интерес представляет только флаг нуля ZF, который принимает значение 1, если результат нулевой, и равен 0, если в результате есть хотя бы одна единица. Другие флаги предназначены для работы с числами и в логических операциях малоинформативны.
Операндами логических команд должны быть байты, либо слова, но не то и другое одновременно.
Команда NOT выполняет инверсию операнда (табл. 34). Флаги не изменяются.
Табл. 34. Команда NOT.
|
Код |
Инструкция |
Описание |
|
F6 /2 |
NOT r/m8 |
r/m8:= NOT r/m8 |
|
F7 /2 |
NOT r/m16 |
r/m16:= NOT r/m16 |
Результат сохраняется на место первого операнда:
MOV AL, 1010b ; AL=00001010b
NOT AL ; AL=11110101b
Команда ANDвыполняет операцию «логическое И» между операндами (табл. 35). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.
Табл. 35. Команда AND.
|
Код |
Инструкция |
Описание |
|
20 /r |
AND r/m8, r8 |
r/m8:= r/m8 AND r8 |
|
21 /r |
AND r/m16, r16 |
r/m16:= r/m16 AND r16 |
|
22 /r |
AND r8, r/m8 |
r8:= r8 AND r/m8 |
|
23 /r |
AND r16, r/m16 |
r16:= r16 AND r/m16 |
|
24 ib |
AND AL, imm8 |
AL:= AL AND imm8 |
|
25 iw |
AND AX, imm16 |
AX:= AX AND imm16 |
|
80 /4 ib |
AND r/m8, imm8 |
r/m8:= r/m8 AND imm8 |
|
81 /4 iw |
AND r/m16, imm16 |
r/m16:= r/m16 AND imm16 |
Команда выполняет поразрядное логическое умножение операндов и записывает результат на место первого операнда: i-й бит результата равен 1, только если i-е биты обоих операндов равны 1, и равен 0, если хотя бы в одном операнде 1-й нулевой, например:
MOV AL, 1100b ; AL=00001100b
AND AL, 1010b ; AL=00001000b
Команда AND часто используется для маскирования отдельных разрядов двоичного числа. Например, чтобы определить значение самого старшего разряда в полученном байте данных можно поступить так:
AND AL, 10000000b
После выполнения команды все разряды байта будут обнулены, и сохраниться значение только седьмого разряда. Такая проверка может понадобиться, если разряды байта соответствуют режимам работы некоторого устройства и требуется определить текущий режим.
Команда TEST выполняет логическое сравнение двух операндов (табл. 36). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с полученным результатом. Состояние флага AF не определено.
Табл. 36. Команда TEST.
|
Код |
Инструкция |
Описание |
|
84 /r |
TEST r/m8, r8 |
r/m8 AND r8 |
|
85 /r |
TEST r/m16, r16 |
r/m16 AND r16 |
|
A8 ib |
TEST AL, imm8 |
AL AND imm8 |
|
A9 iw |
TEST AX, imm16 |
AX AND imm16 |
|
F6 /0 ib |
TEST r/m8, imm8 |
r/m8 AND imm8 |
|
F7 /0 iw |
TEST r/m16, imm16 |
r/m16 AND imm16 |
Сравнение выполняется с помощью операции «логическое И» между разрядами первого и второго операндов. Результат операции теряется, но производится установка флагов:
MOVВН, 1100b
TESTBH, 0011b;ZF=1
Команда ORвыполняет операцию «логическое ИЛИ» между операндами (табл. 37). Флаги OF и CF сбрасываются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.
Табл. 37. Команда OR.
|
Код |
Инструкция |
Описание |
|
08 /r |
OR r/m8, r8 |
r/m8:= r/m8 OR r8 |
|
09 /r |
OR r/m16, r16 |
r/m16:= r/m16 OR r16 |
|
0A /r |
OR r8, r/m8 |
r8:= r8 OR r/m8 |
|
0B /r |
OR r16, r/m16 |
r16:= r16 OR r/m16 |
|
0C ib |
OR AL, imm8 |
AL:= AL OR imm8 |
|
0D iw |
OR AX, imm16 |
AX:= AX OR imm16 |
|
80 /1 ib |
OR r/m8, imm8 |
r/m8:= r/m8 OR imm8 |
|
81 /1 iw |
OR r/m16, imm16 |
r/m16:= r/m16 OR imm16 |
Результат записывается на место первого операнда: i-й бит результата равен 0, если i-е биты операндов совпадают, и равен 1, если эти биты различны, например:
MOV CL, 1100b
OR CL, 1010b ; CL=00001110b
Команда OR часто используется при наложении маски. Например, в полученном байте данных необходимо установить младшие три разряда в 1. Тогда маска будет следующей:
OR AL, 00000111b
Команда XORвыполняет операцию «исключающее ИЛИ» между операндами (табл. 38). Флаги OF и CF очищаются. Флаги SF, ZF и PF устанавливаются в соответствии с результатом. Состояние флага AF не определено.
Табл. 38. Команда XOR.
|
Код |
Инструкция |
Описание |
|
30 /r |
XOR r/m8, r8 |
r/m8:= r/m8 XOR r8 |
|
31 /r |
XOR r/m16, r16 |
r/m16:= r/m16 XOR r16 |
|
32 /r |
XOR r8, r/m8 |
r8:= r8 XOR r/m8 |
|
33 /r |
XOR r16, r/m16 |
r16:= r16 XOR r/m16 |
|
34 ib |
XOR AL, imm8 |
AL:= AL XOR imm8 |
|
35 iw |
XOR AX, imm16 |
AX:= AX XOR imm16 |
|
80 /6 ib |
XOR r/m8, imm8 |
r/m8:= r/m8 XOR imm8 |
|
81 /6 iw |
XOR r/m16, imm16 |
r/m16:= r/m16 XOR imm16 |
Результат заносится на место первого операнда:
MOV CL, 1100b
XOR CL, 1010b ; CL=00000110b
Когда операнды команды XOR совпадают, результатом будет нулевое слово. Такой прием часто используется для обнуления регистров. По сравнению с другими вариантами (MOV АХ, 0 или SUB AX, AX) он выполняется быстрее. Например, при любом значении АХ имеем:
XOR АХ, АХ ; АХ:=0
Вычисление логических выражений.Очевидное применение логических команд состоит в вычислении логических выражений. Например, если переменные:
A DB ?
B DB ?
трактуются как логические, то вычисление:
A:=(not A) and B
реализуется с помощью следующих команд:
MOV AL, А
NOT AL
AND AL, B
MOV A, AL
Однако на практике подобные вычисления встречаются крайне редко. Дело в том, что логические выражения обычно используются для записи условий в условных операторах и циклах, а в этих случаях можно обойтись и без логических команд, достаточно лишь команд сравнения и условных переходов.
Например, условный оператор:
if (X > 0) or (Y = 1) then goto L
можно сначала полностью вычислить логическое выражение, а затем проверить результат.
Можно поступить и проще: сравнивать X с нулем и Y с единицей, и с помощью команд условного перехода реагировать на проверки (см. раздел 5.5.5):
CMPХ, 0 ; сравнениеXс нулем
JG L ; Х > 0
JE L ; Y = 1
Команды сдвига.Команды сдвига и циклического сдвига представляют часть логических возможностей и имеют следующие свойства:
обрабатывают байт или слово;
имеют доступ к регистру или к памяти;
сдвигают операнд на величину до 8 бит (для байта) и 16 бит (для слова) влево или вправо;
сдвигают логически (без знака) или арифметически (со знаком).
Все команды сдвига имеют два операнда. Первый операнд рассматривается как набор битов, которые будут сдвигаться на несколько позиций влево или вправо. Второй операнд (целое без знака) определяет, на сколько разрядов следует сдвинуть первый операнд. Результат записывается на место первого операнда. Значение сдвига на 1 разряд может быть записано как непосредственный операнд, а значение, большее 1, должно находиться в регистре CL.
Каждая команда сдвига имеет две разновидности, которые записываются следующим образом:
<мнемокод> ор, 1 ; сдвиг ор на 1 разряд
<мнемокод> op, CL ; сдвиг ор на CL разрядов (CL 0)
В первом случае операнд ор сдвигается на 1 разряд, во втором ор может сдвигаться на любое число разрядов. Заметим, что второй вариант есть повторение первого CL раз, причем при CL=0 сдвига нет. Значение CL командой сдвига не меняется. Команды сдвига меняют все флаги, но, как правило, интерес представляет только флаг переноса CF.
Сдвиг может быть выполнен на произвольное число разрядов от 0 до 255. В процессорах, начиная с 80286, в качестве счётчика сдвига используются только младшие 5 разрядов регистра CL, что ограничивает максимальное количество сдвигов (не более 31).
Начиная с процессора 80186, стало доступно возможность явного задания величины сдвига, больше 1. Вторым операндом в этом случае является беззнаковое число размером байт. Процессоры 80386 и выше в качестве величины сдвига берут 3 правых бита регистра CL при сдвиге байта и 4 правых байта при сдвиге слова.
Все команды сдвига можно разделить на команды логического сдвига(простого сдвига),арифметическогоициклического.
Логические сдвиги.В командах логического сдвига участвуют все биты первого операнда. При этом бит, уходящий за пределы ячейки, заносится во флаг CF, а с другого конца в операнд добавляется 0.
Команда SHLпроизводит логический сдвиг содержимого операнда влево на указанное вторым операндом число разрядов (табл. 39). Флаг CF содержит значение последнего выдвинутого из операнда разряда. Значение флага OF в операции многоразрядного сдвига не определено. В операции одноразрядного сдвига он представляет результат операции «исключающее ИЛИ» между значением старшего разряда результата и содержимым флага CF после выполнения сдвига.
Таким образом, единичное значение флага OF свидетельствует о том, что содержимое старшего разряда результата отличается от его исходного значения, а нулевое значение – что старший разряд операнда не изменился. Флаги SF, ZF и PF устанавливаются в соответствии с полученным результатом. Значение флага AF не определено.
Табл. 39. Команда SHL.
|
Код |
Инструкция |
Описание |
|
D0 /4 |
SHL r/m8, 1 |
Логический сдвиг r/m8 влево на 1 разряд. |
|
D2 /4 |
SHL r/m8, CL |
Логический сдвиг r/m8 влево на CL разрядов. |
|
D1 /4 |
SHL r/m16, 1 |
Логический сдвиг r/m16 влево на 1 разряд. |
|
D3 /4 |
SHL r/m16, CL |
Логический сдвиг r/m16 влево на CL разрядов. |
Команда SHRпроизводит логический сдвиг содержимого операнда вправо на указанное вторым операндом число разрядов (табл. 40). Флаг CF содержит значение последнего выдвинутого из операнда разряда. Флаг CF содержит значение последнего выдвинутого из операнда разряда.
Значение флага OF в операции многоразрядного сдвига не определено. В операции одноразрядного сдвига устанавливается, если перед выполнением сдвига старший разряд операнда содержал единицу, и сбрасывается в противном случае. Поскольку после выполнения сдвига старший разряд будет содержать нуль, флаг OF показывает, произошла ли смена значения старшего разряда операнда. Флаги SF, ZF, AF и PF не изменяются.
Табл. 40. Команда SHR.
|
Код |
Инструкция |
Описание |
|
D0 /5 |
SHR r/m8, 1 |
Логический сдвиг r/m8 вправо на 1 разряд. |
|
D2 /5 |
SHR r/m8, CL |
Логический сдвиг r/m8 вправо на CL разрядов. |
|
D1 /5 |
SHR r/m16, 1 |
Логический сдвиг r/m16 вправо на 1 разряд. |
|
D3 /5 |
SHR r/m16, CL |
Логический сдвиг r/m16 вправо на CL разрядов. |