СОДЕРЖАНИЕ
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. Стандартные средства программирования последовательного порта
Коррекция выполняется следующим образом. Если операция сложения сформировала признак вспомогательного переноса (флаг AF установлен) или если младший полубайт регистра AL больше 9, то значение младшего полубайта регистра AL увеличивается на 6, устанавливаются флаги AF и CF, регистр AH увеличивается на единицу. Если флаг AF был сброшен, а младший полубайт регистра AL содержал правильный десятичный код (значение 0–9), флаги AF и CF сбрасываются. В любом случае старший полубайт регистра AL обнуляется.
Пример сложения неупакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 9
ADD AL, 8 ; CF=0 AF=1 AL=00010001
AAA ; CF=1 AL=00000111
Команда DAAвыполняет коррекцию результата сложения двух упакованных двоично-десятичных чисел командами ADD или ADC (табл. 18). Флаги AF и CF устанавливаются в соответствии с результатом операции. Флаги SF, ZF и PF устанавливаются по обычным правилам в соответствии с полученным результатом. Значение флага OF не определено.
Табл. 18. Команда DAA.
|
Код |
Инструкция |
Описание |
|
27 |
DAA |
Коррекция сложения упакованных двоично-десятичных чисел. |
Действия команды во многом повторяют действия команды AAA. Если при выполнении операции сложения в младшем полубайте регистра AL получено значение больше 9 или был установлен флаг AF, то значение младшего полубайта регистра AL увеличивается на 6.
Флаг CF устанавливается, если при прибавлении 6 возник перенос из 3-го разряда (если переноса не было, значение флага CF не изменяется). Если содержимое младшего полубайта регистра AL не превышает 9, а флаг AF сброшен, никаких действий с младшим полубайтом не выполняется.
Затем проверяется содержимое старшего полубайта регистра AL. Если его значение больше 9 либо установлен флаг CF, то это значение увеличивается на 6 и устанавливается флаг CF. Если значение старшего полубайта не превышает 9, а флаг CF сброшен, никаких действий со старшим полубайтом не выполняется.
Пример сложения упакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 99h
ADD AL, 99h ; CF=1 AF=1 AL=00110010
DAA;CF=1AL=10011000
Команда INCувеличивает значение операнда на единицу (табл. 19). Флаги OF, SF, ZF, AF и PF устанавливаются в соответствии с результатом по обычным правилам. Значение флага CF не изменяется.
Табл. 19. Команда INC.
|
Код |
Инструкция |
Описание |
|
FE /0 |
INC r/m8 |
Инкремент r/m8. |
|
FF /0 |
INC r/m16 |
Инкремент r/m16. |
|
40+rw |
INC r16 |
Инкремент r16. |
Операндом может являться любой регистр общего назначения, одно- или двухбайтовое поле памяти:
INC AL
INC WORD PTR A
Инкремент 16-разрядных регистров общего назначения может быть выполнен двумя видами инструкций – однобайтовой (код операции 40 плюс номер регистра) и двухбайтовой (код операции FF, номер регистра определяется байтом ModRegR/M). Транслятор языка ассемблера автоматически генерирует однобайтовый код операции как более компактный; второй вариант при необходимости может быть запрограммирован вручную.
Команда SUBобеспечивает вычитание двух 8- или 16-разрядных двоичных чисел (табл. 20). Флаги OF, SF, ZF, AF, CF и PF устанавливаются по обычным правилам, а флаг CF свидетельствует о наличии заёма в старший разряд результата.
Табл. 20. Команда SUB.
|
Код |
Инструкция |
Описание |
|
28 /r |
SUB r/m8, r8 |
r/m8:= r/m8 – r8 |
|
29 /r |
SUB r/m16, r16 |
r/m16:= r/m16 – r16 |
|
2A /r |
SUB r8, r/m8 |
r8:= r8 – r/m8 |
|
2B /r |
SUB r16, r/m16 |
r16:= r16 – r/m16 |
|
2C ib |
SUB AL, imm8 |
AL:= AL – imm8 |
|
2D iw |
SUB AX, imm16 |
AX:= AX – imm16 |
|
80 /5 ib |
SUB r/m8, imm8 |
r/m8:= r/m8 – imm8 |
|
81 /5 iw |
SUB r/m16, imm16 |
r/m16:= r/m16 – imm16 |
|
83 /5 ib |
SUB r/m16, imm8 |
r/m16:= r/m16 – imm8 |
Примеры использования команды вычитания:
MOV AL, 10 ; AL=10
SUB BL, 10 ; BL=AL-10=0 ZF=1
SUB BL, -10 ; BL=10
Команда SBB обеспечивает вычитание двух 8- или 16-разрядных двоичных чисел с учётом значения входного заёма, определяемого флагом CF (табл. 21). Флаги устанавливаются как у команды SUB.
Табл. 21. Команда SBB.
|
Код |
Инструкция |
Описание |
|
18 /r |
SBB r/m8, r8 |
r/m8:= r/m8 – r8 – CF |
|
19 /r |
SBB r/m16, r16 |
r/m16:= r/m16 – r16 – CF |
|
1A /r |
SBB r8, r/m8 |
r8:= r8 – r/m8 – CF |
|
1B /r |
SBB r16, r/m16 |
r16:= r16 – r/m16 – CF |
|
1C ib |
SBB AL, imm8 |
AL:= AL – imm8 – CF |
|
1D iw |
SBB AX, imm16 |
AX:= AX – imm16 – CF |
|
80 /3 ib |
SBB r/m8, imm8 |
r/m8:= r/m8 – imm8 – CF |
|
81 /3 iw |
SBB r/m16, imm16 |
r/m16:= r/m16 – imm16 – CF |
|
83 /3 ib |
SBB r/m16, imm8 |
r/m16:= r/m16 – imm8 – CF |
Команда DEC уменьшает значение операнда на единицу (табл. 22). Флаги OF, SF, ZF, AF и PF устанавливаются в соответствии с результатом по обычным правилам. Значение флага CF не изменяется. Операндом может являться любой регистр общего назначения, одно- или двухбайтовое поле памяти.
Как и команда INC декремент 16-разрядных регистров общего назначения может быть выполнен двумя видами инструкций – однобайтовой (код операции 48 плюс номер регистра) и двухбайтовой (код операции FF, номер регистра определяется байтом ModRegR/M).
Выгода от команд INC и DEC заключается в том, что они занимают меньше места в памяти и выполняются быстрее, чем соответствующие команды ADD и SUB.
Табл. 22. Команда DEC.
|
Код |
Инструкция |
Описание |
|
48+rw |
DEC r16 |
Декремент r16. |
|
FE /1 |
DEC r/m8 |
Декремент r/m8. |
|
FF /1 |
DEC r/m16 |
Декремент r/m16. |
Команда AAS обеспечивает коррекцию результата вычитания двоично-десятичных неупакованных и ASCII чисел (табл. 23). Команда AAS используется после SUB, SBB или DEC. Если установлен флаг AF или содержимое младшего полубайта регистра AL превышает 9, из этого значения вычитается 6, содержимое регистра AH уменьшается на единицу, и устанавливаются флаги AF и CF. В противном случае флаги AF и CF сбрасываются. В любом случае старший полубайт регистра AL обнуляется. Значение флагов OF, SF, ZF и PF не определено.
Табл. 23. Команда AAS.
|
Код |
Инструкция |
Описание |
|
3F |
AAS |
Коррекция вычитания неупакованных двоично-десятичных чисел. |
Пример вычитания неупакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 02h
SUB AL, 05h ; AL=0FDh AF=1
AAS ; AL=0FDh – 6 = 0F7h CF=1
Команда DAS выполняет коррекцию результата вычитания двух упакованных двоично-десятичных чисел (табл. 24). Флаги AF и CF устанавливаются в соответствии с результатом операции. Флаги SF, ZF и PF устанавливаются по обычным правилам в соответствии с полученным результатом. Значение флага OF не определено.
Табл. 24. Команда DAS.
|
Код |
Инструкция |
Описание |
|
2F |
DAS |
Коррекция вычитания упакованных двоично-десятичных чисел. |
Алгоритм коррекции следующий. Если при выполнении операции вычитания в младшем полубайте регистра AL получено значение, превышающее 9, или был установлен флаг AF (произошёл заём в 3-ий разряд), то значение младшего полубайта регистра AL уменьшается на 6, флаг CF устанавливается. Если содержимое младшего полубайта регистра AL не превышает 9 и флаг AF сброшен, никаких действий с младшим полубайтом не выполняется.
Затем проверяется содержимое старшего полубайта регистра AL. Если его значение больше 9 либо если установлен флаг CF, то значение уменьшается на 6 и устанавливается флаг CF. Если значение старшего полубайта не превышает 9 и флаг CF сброшен, никаких действий со старшим полубайтом не выполняется.
Пример вычитания упакованных двоично-десятичных чисел:
CLC ; CF=0
MOV AL, 25h
SUB AL, 52h ; AL=0D3h AF=0 CF=1
DAS ; AL=0D3h – 60h=73h CF=1
Команды умножения и деления.Умножение знаковых и беззнаковых чисел выполняется по разным алгоритмам, в связи с чем имеются по две команды умножения. Команды умножения и деления также применимы для выполнения операция над двоичными и неупакованными двоично-десятичными числами. В последнем случае следующей командой должна обязательно следовать команда коррекции результата.
Команда MUL производит целочисленное умножение двух беззнаковых двоичных чисел (табл. 25). Флаги SF, ZF, AF и PF не изменяются. Флаги OF и CF устанавливаются, если разрядность результата превышает разрядность исходных операндов. Если результат вмещается в разрядность исходных операндов, флаги будут сброшены.
Табл. 25. Команда MUL.
|
Код |
Инструкция |
Описание |
|
F6 /4 |
MUL r/m8 |
AX:= AL * r/m8 |
|
F7 /4 |
MUL r/m16 |
DX, AX:= AX * r/m16 |
Один из множителей располагается в регистре AL или AX (в зависимости от разрядности), второй – в регистре общего назначения или ячейке памяти (определяется байтом ModRegR/M).
Под результат отводится в два раза больше места, чем под сомножители, т.к. в общем случае умножение n-значных чисел дает произведение из 2nцифр. При умножении байтов результат имеет размер слова и записывается в регистр АХ (в АН – старшие цифры произведения, в AL – младшие). При умножении слов результат имеет размер двойного слова и записывается в два регистра – в регистр DX заносится старшая часть произведения, а в регистр АХ – младшая.
Команда IMUL производит целочисленное умножение двух знаковых двоичных чисел (табл. 26). Флаги SF, ZF, AF и PF не изменяются. Флаги OF и CF устанавливаются, если разрядность результата превышает разрядность исходных операндов.
Табл. 26. Команда IMUL.
|
Код |
Инструкция |
Описание |
|
F6 /5 |
IMUL r/m8 |
AX:= AL * r/m8 |
|
F7 /5 |
IMUL r/m16 |
DX, AX:= AX * r/m16 |