Широтно-импульсная модуляция 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Широтно-импульсная модуляция



Из всех счётчиков контроллера Atmega8 только таймер счётчик T/C2 имеет режим широтно-импульсной модуляции (ШИМ). Структурная схема T/C2 в режиме ШИМ приведена на рис. 2.4.1.

Режим Быстрой ШИМ таймера счётчика T/C2 обеспечивает высокочастотное генерирование ШИМ-сигнала. Этот режим отличается от режима ШИМ с фазовой коррекцией тем, что имеет пилообразное изменение значения регистра TCNT2 с левосторонним наклоном (рис. 2.4.2). Режим с фазовой коррекцией имеет двустороннее пилообразное изменение значения регистра TCNT2.

Режим быстрой ШИМ генерирует прямоугольные импульсы, период которых определяется временем заполнения счётного регистра TCNT2 от 0 до 255 тактовыми сигналами, которые проходят через предделитель частоты. Длительность импульсов определяется значением в регистре совпадения OCR2. Скважность определяется отношением периода к длительности.

8-битный счётный регистр TCNT2 таймера-счётчика T/C2 доступен по чтению и по записи. Однако запись в этот регистр блокируется в течение следующего такта после совпадения со значением регистра OCR2, так как в это время происходит запрос внутреннего прерывания по сигналу TOV2, по которому формируется возрастающий фронт ШИМ-импульса.

Содержимое 8-битного регистра совпадения OCR2 (OutPut Compare Register 2) непрерывно сравнивается со значением счётчика TCNT2. При совпадении формируется ниспадающий фронт импульса на выходе совпадения OC2 микроконтроллера.

Описание битов регистра управления TCCR2 приведено на рис. 2.4.3. Бит FOC2 в режиме ШИМ не используется, поэтому должен быть равен нулю.

Описание битов WGM (Waveform Generation mode) генерации формы импульсов приведено в табл. 2.4.1.

Таблица 2.4.1

WGM21 WGM20 Режим T/C2 Макс. значение TCNT2
    Нормальный режим 0xFF
    ШИМ с фазовой коррекцией 0xFF
    Сброс таймера по совпадению OCR2
    Быстрый ШИМ 0xFF

Для генерации неинвертированных импульсов в быстром режиме ШИМ необходимо записать в биты COM (Compare Output Mode) следующие значения: COM21 1, COM20 0, для инвертированных импульсов: COM21 1, COM20 1.

Описание битов CS (Clock Select) выбора коэффициента предделителя частоты тактовых импульсов приведено в табл. 2.4.2.

Таблица 2.4.2

CS22 CS21 CS20 Описание
      Таймер T/C2 остановлен
      Clk/1 (нет предделения)
      Clk/8
      Clk/32
      Clk/64
      Clk/128
      Clk/256
      Clk/1024

Период одного ШИМ-импульса можно вычислить по формуле:

T = 256*N / f такт,

где N – один из коэффициентов предделителя 8, 32, 64, 128, 256, 1024.

Пример 2.4.1. Рассмотрим задачу управления электродвигателем с использованием режима быстрой ШИМ на основе T/C2. На рис. 2.4.4 изображена схема подключения кнопок SW1, SW2 и двигателя постоянного тока к контроллеру. Двигатель управляется с линии PB3 (OC2), которая в режиме ШИМ является выходом ШИМ-импульсов. При включении контроллера двигатель начинает вращаться со средней скоростью.

Кнопки SW1 и SW2 подключены к линиям внешних прерываний контроллера INT0 и INT1 соответственно. Кнопка SW1 предназначения для плавного уменьшения частоты вращения двигателя, SW2 – для увеличения. Однократное нажатие кнопки SW1 уменьшает на 4 длительность импульса, открывающего транзистор, а нажатие SW2 – увеличивает на 4.

На листинге 2.4.1 приведена программа управления двигателем. Таймер T/C2 инициализируется с помощью установки битов регситра TCCR2:

v 1 << WGM21 | 1 << WGM20 – режим Быстрой ШИМ;

v 1 << COM21 | 0 << COM20 – импульсы ШИМ неинвертированы;

v 0 << CS22 | 0 << CS21 | 1 << CS20 – без предделения частоты.

Листинг 2.4.1.

.INCLUDE "m8def.inc"

 

;========================================================

; MACRO

;========================================================

.MACRO outi

ldi rTemp, @1

out @0, rTemp

.ENDM

 

;========================================================

; INTERRUPTS VECTOR

;========================================================

.ORG 0x00 rjmp RESET

.ORG INT0addr rjmp INT_0

.ORG INT1addr rjmp INT_1

.ORG OC2addr rjmp ERROR

.ORG OVF2addr rjmp ERROR

.ORG ICP1addr rjmp ERROR

.ORG OC1Aaddr rjmp ERROR

.ORG OC1Baddr rjmp ERROR

.ORG OVF1addr rjmp ERROR

.ORG OVF0addr rjmp ERROR

.ORG SPIaddr rjmp ERROR

.ORG URXCaddr rjmp ERROR

.ORG UDREaddr rjmp ERROR

.ORG UTXCaddr rjmp ERROR

.ORG ADCCaddr rjmp ERROR

.ORG ERDYaddr rjmp ERROR

.ORG ACIaddr rjmp ERROR

.ORG TWIaddr rjmp ERROR

.ORG SPMRaddr rjmp ERROR

 

 

.ORG INT_VECTORS_SIZE

ERROR:

rjmp ERROR; ловушка

 

;========================================================

; DEFs

;========================================================

.DEF rTemp = R16

 

;========================================================

; INTERRUPTS

;========================================================

 

INT_0:; Прерывание с кнопки подключенной к PD2(INT0)

 

; Здесь должна быть антидребезговая задержка примерно 500 микросекунд

; и сброс флага прерывания, но т.к. в симуляции дребезга нет, то учитывать

; его не будем

 

in rTemp,OCR2; читаем текущее значение OCR2

subi rTemp,4; уменьшаем на 4 длительность импульса,

out OCR2,rTemp; тем самым уменьшая скважность ШИМ

reti

 

INT_1:; прерывание с кнопки подключенной к PD3(INT1)

 

;Здесь также нужна антидребезговая задержка и сброс флага прерывания

; в GIFR

 

in rTemp,OCR2; длительность импульса увеличиваем на 4

subi rTemp,-4; инструкции addi нет, приходится вычитать

; отрицательное значение

out OCR2, rTemp

reti

 

;========================================================

; MAIN

;========================================================

RESET:

cli; маскируем все прерывания

outi SPL, low(RAMEND); инициализируем указатель стека

outi SPH, high(RAMEND)

 

outi PORTD, (1 << PORTD2 | 1 << PORTD3); подтяжка ~100k

; к питанию

outi DDRD, 0x00; все пины порта D на вход

outi DDRB, 0xFF; все пины порта B на выход

 

; Настройка таймера/счетчика2 в режим Быстрой ШИМ с

; неинвертированным выходом и без делителя частоты

 

outi TCCR2,(1 << WGM21 | 1 << WGM20 | 1 << COM21 | 1 << CS20)

outi OCR2,0x80; устанавливаем длит-ть импульса (скважность = 50%)

 

outi MCUCR,(1 << ISC11 | 1 << ISC01); настройка прерываний по

; спаду уровня на ножках INT0, INT1

outi GICR,(1 << INT0 | 1 << INT1); включаем прерывания

; INT0 и INT1

 

sei; включаем все прерывания

 

MAIN_LOOP:

rjmp MAIN_LOOP; зацикливаемся в ожидании прерывания

Скомпилируйте программу и выполните её пошагово до цикла ожидания прерываний. Убедитесь, что регистры контроллера содержат необходимые значения (рис. 2.4.5). Обратите внимание, что регистр сравнения OCR2 не содержит число 0x80, которое записывалось в него макросом outi OCR2,0x80. Дело в том, что операции записи в этот регистр вступают в силу только после прерывания, вызванного переполнением счётчика TCNT2, а до этого «замораживаются». Так сделано для того, чтобы изменение значения OCR2, произведённое в текущий период ШИМ-импульса, вступало в силу в начале следующего периода. Поэтому в течение первого периода можно увидеть только увеличение значения регистра TCNT2 от 0 до 255 (0xFF), так как значение OCR2 = 0 и формирование ШИМ-импульса не происходит. Только при переполнении регистра TCNT2 он приобретёт нулевое значение, совпадающее со значением в OCR2, возникнет прерывание, которое модифицирует регистр OCR2 значением 0x80. На линии PINB3 при этом будет оставаться нулевое значение.

Если не задействовать кнопки SW1 и SW2, то при дальнейшем автовыполнении (рис. 2.4.6) на линии PINB3 в течение второго, третьего и последующих импульсов можно наблюдать ШИМ со скважностью 0,5. Такая скважность обусловлена тем, что значение OCR2 = 0x80 составляет половину максимального значения регистра TCNT2.

 

На рисунке 2.4.7 показана диаграмма изменения значений TCNT2 и линии PINB3. Как видно из рисунка половину периода составляет ширина импульса. Вплоть до значения TCNT2 < 0x80 значение PINB3 = 0, а начиная со значения TCNT2 = 0x80 и выше бит PINB3=1. По переполнению TCNT2 и переходу его в ноль, линия PINB3=0.

Такая ШИМ со скважностью 0,5 будет продолжаться до тех пока не будет нажата и отпущена одна из кнопок SW1 или SW2.

Для того, чтобы наблюдать увеличение скважности ШИМ надо во время паузы щелчком мышки установить бит PIND2 в единицу, выполнить хотя бы один шаг программы, чтобы AVR Studio зарегистрировал “нажатие SW1”. После этого сбросить бит PIND2 в ноль и выполнить один шаг. При этом AVR Studio на линии PIND2 зарегистрирует спадающий фронт импульса (кнопка SW1 отпущена) и будет вызвано прерывание INT_0. Оно уменьшит значение OCR2 на 4, уменьшая тем самым ширину импульса.

Нажатие и отжатие кнопки SW2 (PIND3) будет увеличивать ширину импульса на 4 с помощью прерывания INT_1.

Таким образом, мощность, пропускаемая транзистором на обмотку электродвигателя будет регулироваться малыми дискретами, создавая впечатление плавного управления частотой вращения.

Задание 2.4.1. Разработать программу для инверсной ШИМ с величиной изменения OCR2, равной 0x30, для увеличения и уменьшения скважности.

Задание 2.4.2. Разработать электрическую схему и программу для включения, выключения и управления частотой вращения электродвигателя постоянного тока с использованием трёх кнопок (вкл/выкл, увеличение, уменьшение), опрашиваемых программно.

Задание 2.4.3. Разработать электрическую схему и программу для плавного программного уменьшения до нуля яркости свечения лампы переменного тока с использованием динистора. Подсказка: Значение OCR2 должно плавно уменьшаться от 255 до 0 в течение нескольких секунд.

Приложение А. Таблица ASCII-кодов

 

Таблица А.1. Коды основной таблицы ASCII-символов

Дес.Шест. Символ Дес.Шест.Симв Дес.Шест.Симв Дес.Шест.Симв
000 00 Пустой символ 032 20 пробел 064 40 @ 096 60 `
001 01 Начало загол. 033 21! 065 41 A 097 61 a
002 02 Начало текста 034 22 ” 066 42 B 098 62 b
003 03 Конец текста 035 23 # 067 43 C 099 63 c
004 04 Конец передачи 036 24 $ 068 44 D 100 64 d
005 05 Запрос 037 25 % 069 45 E 101 65 e
006 06 Подтверждение 038 26 & 070 46 F 102 66 f
007 07 Звонок, сигнал 039 27 ' 071 47 G 103 67 g
008 08 Забой 040 28 ( 072 48 H 104 68 h
009 09 Гориз. табуляция 041 29) 073 49 I 105 69 i
010 0A Перевод строки 042 2A * 074 4A J 106 6A j
011 0B Верт. табуляция 043 2B + 075 4B K 107 6B k
012 0C Прогон страницы 044 2C, 076 4C L 108 6C l
013 0D Возврат каретки 045 2D - 077 4D M 109 6D m
014 0E Передача данных 046 2E. 078 4E N 110 6E n
015 0F Приём данных 047 2F / 079 4F O 111 6F o
016 10 Потеря канала 048 30 0 080 50 P 112 70 p
017 11 Управление устр.1 049 31 1 081 51 Q 113 71 q
018 12 Управление устр.2 050 32 2 082 52 R 114 72 r
019 13 Управление устр.3 051 33 3 083 53 S 115 73 s
020 14 Управление устр.4 052 34 4 084 54 T 116 74 t
021 15 Ошибка передачи 053 35 5 085 55 U 117 75 u
022 16 Холостые данные 054 36 6 086 56 V 118 76 v
023 17 Конец блока 055 37 7 087 57 W 119 77 w
024 18 Отмена 056 38 8 088 58 X 120 78 x
025 19 Конец носителя 057 39 9 089 59 Y 121 79 y
026 1A Подстановка 058 3A: 090 5A Z 122 7A z
027 1B Прекращение 059 3B; 091 5B [ 123 7B {
028 1C Раздел. файла 060 3C < 092 5C \ 124 7C |
029 1D Раздел. группы 061 3D = 093 5D ] 125 7D }
030 1E Раздел. записи 062 3E > 094 5E ^ 126 7E ~
031 1F Раздел. устройства 063 3F & 095 5F _ 127 7F Забой

 

 

Таблица А.2. Коды дополнительной таблицы ASCII-символов (Россия)

Дес.Шест.Символ Дес.Шест.Символ Дес.Шест.Символ Дес.Шест.Символ
128 80 А 160 A0 а 192 C0 └ 224 E0 р
129 81 Б 161 A1 б 193 C1 ┴ 225 E1 с
130 82 В 162 A2 в 194 C2 ┬ 226 E2 т
131 83 Г 163 A3 г 195 C3 ├ 227 E3 у
132 84 Д 164 A4 д 196 C4 ─ 228 E4 ф
133 85 Е 165 A5 е 197 C5 ┼ 229 E5 х
134 86 Ж 166 A6 ж 198 C6 ╞ 230 E6 ц
135 87 З 167 A7 з 199 C7 ╟ 231 E7 ч
136 88 И 168 A8 и 200 C8 ╚ 232 E8 ш
137 89 Й 169 A9 й 201 C9 ╔ 233 E9 щ
138 8A К 170 AA к 202 CA ╩ 234 EA ъ
139 8B Л 171 AB л 203 CB ╦ 235 EB ы
140 8C М 172 AC м 204 CC ╠ 236 EC ь
141 8D Н 173 AD н 205 CD ═ 237 ED э
142 8E О 174 AE о 206 CE ╬ 238 EE ю
143 8F П 175 AF п 207 CF ╧ 239 EF я
144 90 Р 176 B0 ░ 208 D0 ╨ 240 F0 Ё
145 91 С 177 B1 ▒ 209 D1 ╤ 241 F1 ё
146 92 Т 178 B2 ▓ 210 D2 ╥ 242 F2 Є
147 93 У 179 B3 │ 211 D3 ╙ 243 F3 є
148 94 Ф 180 B4 ┤ 212 D4 ╘ 244 F4 Ї
149 95 Х 181 B5 ╡ 213 D5 ╒ 245 F5 ї
150 96 Ц 182 B6 ╢ 214 D6 ╓ 246 F6 Ў
151 97 Ч 183 B7 ╖ 215 D7 ╫ 247 F7 ў
152 98 Ш 184 B8 ╕ 216 D8 ╪ 248 F8 °
153 99 Щ 185 B9 ╣ 217 D9 ┘ 249 F9 ∙
154 9A Ъ 186 BA ║ 218 DA ┌ 250 FA ·
155 9B Ы 187 BB ╗ 219 DB █ 251 FB √
156 9C Ь 188 BC ╝ 220 DC ▄ 252 FC №
157 9D Э 189 BD ╜ 221 DD ▌ 253 FD ¤
158 9E Ю 190 BE ╛ 222 DE ▐ 254 FE ■
159 9F Я 191 BF ┐ 223 DF ▀ 255 FF Пробел

 

 

Приложение Б. Система команд процессоров Intel семейства IA-32

В этом приложении кратко описаны основные команды процессоров Intel семейства IA-32, используемые в реальном режиме адресации. В описании каждой команды приведены флаги, состояние которых изменяется после выполнения команды. Состояния флагов обозначаются символами:

1 – флаг устанавливается;

0 – флаг сбрасывается

? – состояние флага не определено;

* – состояние флага изменяется по специально оговорённым правилам.

Таблица Б.1. Условные обозначения операндов

Обозначение Описание
reg Один из 8-, 16-, 32-разрядных регистров общего назначения: AH, AL, BH, BL, CH, CL,DH, DL, AX, BX, CX, DX, SI, DI, BP, SP, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP
reg8, reg16, reg32 Один из регистров общего назначения указанной разрядности
segreg Один из 16-разрядных сегментных регистров
accum Один из регистров аккумулятора: AL, AX, EAX
mem Операнд в памяти
mem8, mem16, mem32 Операнд в памяти с указанной разрядностью
shortlabel Адрес в сегменте кода, отстоящий от текущего адреса на -128 байтов вверх и на +127 байтов вниз
nearlabel Адрес в текущем сегменте кода, заданный меткой
farlabel Адрес в другом сегменте кода, заданный меткой
imm Непосредственно заданный операнд
imm8, imm16, imm32 Непосредственно заданный операнд с указанной разрядностью
instruction Команда языка ассемблера процессоров Intell

Операнды команды имеют следующие обозначения:

мнемокод операнд-приёмник, операнд-источник

или

мнемокод dest, source

 

AAA – Коррекция после сложения ASCII-чисел. Если значение в AL больше 9, то к нему прибавляется число 6, а значение регистра AH увеличивается на единицу.

Формат команды: AAA

 

AAD – Коррекция перед делением ASCII-чисел. Преобразовывает неупакованные двоично-десятичные числа, находящиеся в регистрах AH и AL в двоичное число перед выполнением команды DIV.

Формат команды: AAD

 

AAM – Коррекция после умножения ASCII-чисел. Корректирует результат в регистре AX после умножения двух неупакованных двоично-десятичных чисел.

Формат команды: AAM

 

AAS – Коррекция после вычитания ASCII-чисел. Если значение в AL больше 9, то из него вычитается число 6, а значение регистра AH уменьшается на единицу.

Формат команды: AAS

 

ADC – Сложение с учётом переноса. Складывает два операнда и прибавляет к результату значение флага переноса. Размеры операндов должны быть одинаковы.

Формат команды:

ADC reg, reg

ADC mem, reg

ADC reg, mem

ADC reg, imm

ADC mem, imm

 

ADD – Сложение. Складывает два операнда. Размеры операндов должны быть одинаковы.

Формат команды:

ADD reg, reg

ADD mem, reg

ADD reg, mem

ADD reg, imm

ADD mem, imm

 

AND – Логическое побитовое И. Результат помещается в операнд-приёмник.

Формат команды:

AND reg, reg

AND mem, reg

AND reg, mem

AND reg, imm

AND mem, imm

 

BOUND – Проверка границ массива. Значение индекса, размещённого в reg32, должно быть не меньше нижней граница массива, находящейся по адресу mem64, и не больше верхней границы массива, находящейся по адресу mem64 + 4. Если индекс выходит за границы диапазона, то вызывается прерывание 5.

Формат команды:

BOUND reg32, mem64

 

BSF, BSR – Сканирование битов. Сканируются биты операнда-источника, пока не будет найден первый единичный бит. Если такой бит найден, флаг нуля ZF сбрасывается, а в регистр-приёмник помещается индекс единичного бита. Иначе флаг ZF устанавливается. BSF сканирует от младшего к старшему биту, BSR – в обратном направлении.

Формат команды:

BSF reg16, r/m16

BSF reg32, r/m32

 

BSWAP – Обмен байтов. Реверсирует порядок следования байтов указанном регистре (переставляет нулевой и третий, первый и второй).

Формат команды:

BSWAP reg32

 

BT, BTC, BTR, BTS – Тестирование битов. Копирует бит операнда-приёника, номер которого задан в операнде-источнике, во флаг переноса CF, а затем в зависимости от команды, инвертирует, сбрасывает или устанавливает этот бит в операнде-приёмнике. Команда BTC инвертирует, BTR – сбрасывает, BTS – устанавливает.

Формат команды:

BT r/m16, imm8

BT r/m32, imm8

BT r/m16, r16

BT r/m32, r32

 

CALL – Вызов процедуры. Помещает в стек адрес следующей команды и передаёт управление по адресу, указанному в операнде. При вызове ближней процедуры (в том же сегменте кода), в стек помещается только смещение следующей команды. При вызове дальней процедуры – сегмент и смещение следующей команды.

Формат команды:

CALL nearlabel

CALL farlabel

CALL mem16

CALL mem32

CALL reg

 

CWB – Преобразовать байт в слово. Расширяет знаковый разряд регистра AL сквозь весь регистр AH.

Формат команды: CWB

 

CDQ – Преобразовать двойное слово в учетверённое. Расширяет знаковый разряд регистра EAX в EDX.

Формат команды: CDQ

 

CLC – Сброс флага переноса.

Формат команды: CLC

 

CLD – Сброс флага направления.

Формат команды: CLD

 

CLI – Сброс флага прерывания.

Формат команды: CLI

 

CMC – Сброс флага переноса.

Формат команды: CMC

 

CMP – Сравнить. Сравнивает операнды путём неявной операции вычитания операнда-источника из операнда-приёмника.

Формат команды:

CMP reg, reg

CMP mem, reg

CMP reg, mem

CMP reg, imm

CMP mem, imm

 

CMPS, CMPSB, CMPSW, CMPSD – Сравнить две строки. Сравнивает две строки в памяти, адреса которых заданы в регистрах DS:ESI и ES:EDI путём неявного вычитания источника из приёмника. CMPS сравнивает явно заданные операнды, CMPSB – сравнивает байты, CMPSW – сравнивает слова, CMPSD – сравнивает двойные слова. Значения регистров ESI и EDI автоматически увеличиваются на 1, 2 или 4, если флаг направления (DF) установлен, и уменьшаются – если сброшен. Величина увеличения/уменьшения определяется размером операндов.

Формат команды:

CMPS mem8, mem8

CMPS mem16, mem16

CMPS mem32, mem32

CMPSB

CMPSW

CMPSD

 

CMPXCHG – Сравнить и обменять. Сравнивает операнд-приёмник с содержимым аккумулятора. Если они равны, операнд-источник копируется в операнд-приёмник, иначе – операнд-приёмник копируется в аккумулятор.

Формат команды:

CMPXCHGreg, reg

CMPXCHGmem, reg

 

CWD – Преобразовать слово в двойное слово. Расширяет знаковый разряд регистра AX в DX.

Формат команды: CWD

 

DAA – Десятичная коррекция после сложения. Преобразовывает двоичное число, находящееся в AL и полученное в результате выполнения команд ADD и ADC в упакованный десятичный формат. В результате сумма будет представлена в регистре AL двумя двоично-десятичными цифрами.

Формат команды: DAA

 

 

DAS – Десятичная коррекция после вычитания. Преобразовывает двоичное число, находящееся в AL и полученное в результате выполнения команд SUB и SBB в упакованный десятичный формат.

Формат команды: DAS

 

 

DEC – Декремент. Вычитает единицу из указанного операнда.

Формат команды:

DEC reg

DEC mem

 

DIV – Беззнаковое целочисленное деление. Деление операнда, находящегося в регистрах AX или DX:AX или EDX:EAX, на соответственно 8-, 16-, 32-разрядное беззнаковое целое число, находящееся в одном из регистров или в памяти. При использовании 8-разрядного делителя, делимое находится в AX, частное – в AL, остаток – в AH. При использовании 16-разрядного делителя, делимое находится в DX:AX, частное – в AX, остаток – в DX. При использовании 32-разрядного делителя, делимое находится в EDX:EAX, частное – в EAX, остаток – в EDX.

Формат команды:

DIV reg

DIV mem

 

IDIV –Целочисленное деление со знаком. Деление операнда, находящегося в регистрах AX или DX:AX или EDX:EAX, на соответственно 8-, 16-, 32-разрядное целое число со знаком, находящееся в одном из регистров или в памяти. При использовании 8-разрядного делителя, делимое находится в AX, частное – в AL, остаток – в AH. При использовании 16-разрядного делителя, делимое находится в DX:AX, частное – в AX, остаток – в DX. При использовании 32-разрядного делителя, делимое находится в EDX:EAX, частное – в EAX, остаток – в EDX. Как правило, команде IDIV предшествует команда CWB или CWD, с помощью которой знак делимого расширяется влево на нужное число разрядов.

Формат команды:

IDIV reg

IDIV mem

 

IMUL –Целочисленное умножение со знаком. Умножение целого числа со знаком, находящегося в аккумуляторе. При использовании 8-разрядного множителя, множимое находится в AL, произведение – в AX. При использовании 16-разрядного множителя, множимое находится в AX, произведение – в DX:AX. При использовании 32-разрядного множителя, множимое находится в EAX, произведение – в EDX:EAX. Как правило, команде IDIV предшествует команда CWB или CWD, с помощью которой знак делимого расширяется влево на нужное число разрядов. Если значение старшей половины произведения не является расширением знакового разряда из младшей половины произведения, то устанавливаются флаги OF, CF.

Формат команды:

IMUL r/m8

IMUL r/m16

IMUL r/m32

IMUL r16, r/m16

IMUL r16, imm8

IMUL r16, imm16

IMUL r32, r/m32

IMUL r32, imm8

IMUL r32, imm32

IMUL r16, r/m16, imm8

IMUL r16, r/m16, imm16

IMUL r32, r/m32, imm8

IMUL r32, r/m32, imm32

 

IN – Ввести данные из порта. Вводит данные из порта и помещает в аккумулятор. Номер порта задаётся в виде 8-разрядной константы (00h‑0FFh), либо 16-разрядного адреса (0000h‑0FFFFh), загруженного в регистр DX.

Формат команды:

IN accum, imm

IN accum, DX

 

INC – Инкремент. Прибавляет единицу к указанному операнду.

Формат команды:

INC reg

INC mem

 

INS, INSB, INSW, INSD – Ввести строку из порта. Вводит из порта поток байтов, слов или двойных слов и сохраняет их в памяти по адресу, указанному в регистровой паре ES:EDI. Номер порта задаётся в регистре DX. После ввода данных значение EDI автоматически изменяется в зависимости от флага направления на 1, 2 или 4 байта. Величина изменения определяется из названия команды: INSB – на 1 байт, INSW – на 2 байта, INSD– на 4 байта. Перед любой из описываемых команд можно использовать префикс повторения REP.

Формат команды:

INS dest, DX

REP INSB dest, DX

REP INSW dest, DX

REP INSD dest, DX

 

INT – Вызов прерывания. Генерирует программное прерывание. Перед вызовом процедуры обработки прерывания флаги IF и TF сбрасываются, а в стек помещаются текущие значения флагов и адрес возврата: содержимое регистров CS и IP.

Формат команды:

INT imm

INT 3; для отладки

 

INTO – Прерывание при переполнении. Генерирует внутреннее прерывание процессора номер 4 в случае, если установлен флаг переполнения OF.

Формат команды: INTO

 

IRET, IRETD – Возврат из прерывания. Завершает процедуру обработки прерывания путём извлечения из стека и восстановления регистра флагов и адреса возврата. Команды IRET и IRETD применяются при 16- и 32-разрядном программировании соответственно.

Формат команды:

IRET

 

Jусловие – Условный переход. Переход на метку. Принцип формирования элемента "условие" команды условного перехода показан в нижеуказанной таблице Б.2.

Таблица Б.2. Принцип формирования элемента "условие" команды условного перехода.

Мнемоника Оригинальный термин Перевод Тип операндов
z Zero Ноль Любые
e Equal Равно Любые
n Not Нет Любые
g Greater Больше Числа со знаком
l Less Меньше Числа со знаком
a Above Выше (больше) Числа без знака
b Below Ниже (меньше) Числа без знака

Мнемоники команды условного перехода приведены в таблице Б.3.

Таблица Б.3. Мнемоники условного перехода

Условие Описание Условие Описание
JA Переход, если выше, CF=0 и ZF=0 JE Переход, если равно, ZF=1
JNA Переход, если не выше, CF=1 или ZF=1 JNE Переход, если не равно, ZF=0
JAE Переход, если выше или равно, CF=0 JZ Переход, если ноль, ZF=1
JNAE Переход, если не выше или равно, CF=1 JNZ Переход, если не ноль, ZF=0
JB Переход, если ниже, CF=1 JS Переход, если SF=1
JNB Переход, если не ниже, CF=0 JNS Переход, если SF=0
JBE Переход, если ниже или равно, CF=1 или ZF=1 JC Переход, если CF=1
JNBE Переход, если не ниже или равно, CF=0 и ZF=0 JNC Переход, если CF=0
JG Переход, если больше, SF=OF или ZF=0 JO Переход, если OF=1
JNG Переход, если не больше, SF¹OF или ZF=1 JNO Переход, если OF=0
JGE Переход, если больше или равно, SF=OF JP Переход, если PF=1
JNGE Переход, если не больше или равно, SF¹OF JPE Переход, если PF=1
JL Переход, если меньше, SF¹OF JNP Переход, если PF=0
JNL Переход, если не меньше, SF=OF JPO Переход, если PF=0
JLE Переход, если меньше или равно, SF¹OF или ZF=1 JNLE Переход, если не меньше или равно, SF=OF или ZF=0

Формат команды:

Jусловие метка

 

JCXZ, JECXZ – Переход если регистр CX или ECX равен нулю. Переход к короткой метке.

Формат команды:

JCXZ shortlabel

JECXZ shortlabel

 

JMP – Безусловный переход по метке. Переход к короткой метке.

Формат команды:

JMP shortlabel

JMP nearlabel

JMP farlabel

JMP reg16

JMP reg32

JMP mem16

JMP mem32

 

LAHF – Загрузить флаги в регистр AH. Загружает в AH младший байт регистра флагов.

Формат команды: LAHF

 

LDS, LES, LFS, LGS, LSS – Загрузить дальний указатель. Загружает содержимое памяти одновременно в сегментный регистр (DS, ES, FS, GS или SS) и в указанный в первом операнде регистр общего назначения.

Формат команды:

LDS reg, mem

LES reg, mem

LFS reg, mem

LGS reg, mem

LSS reg, mem

 

LEA – Загрузить текущий адрес. Вычисляет 32-разрядный текущий адрес операнда и загружает его в РОН. Команда очень похожа на команду mov…offset, за исключением того, что команда LEA вычисляет адрес во время выполнения программы, а не во время её компиляции.

Формат команды:

LEA reg, mem

 

LODS, LODSB, LODSW, LODSD – Загрузить строковые данные в аккумулятор. Загружает в аккумулятор содержимое байта, слова или двойного слова, адресуемого через регистр DS:ESI. При использовании LODS необходимо явно указать операнд-источник в памяти. Содержимое регистра ESI автоматически увеличивается/уменьшается на 1,2 или 4, в зависимости от флага направления DF.

Формат команды:

LODS mem

LODSB

LODSW

LODSD

 

LOOP – Организовать цикл. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля, передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.

Формат команды:

LOOP shortlabel

 

LOOPE, LOOPZ – Организовать цикл, если ZF=1. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля и флаг нуля ZF=1, то передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.

Формат команды:

LOOPE shortlabel

LOOPZ shortlabel

 

LOOPNE, LOOPNZ – Организовать цикл, если ZF=0. Уменьшает счётчик цикла ECX на единицу и, если ECX больше нуля и флаг нуля ZF=0, то передаёт управление по указанной короткой метке, иначе – передаёт управление следующей команде.

Формат команды:

LOOPNE shortlabel

LOOPNZ shortlabel

 

MOV – Переслать. Копирует байт, слово или двойное слово из операнда-источника в операнд-приёмник.

Формат команды:

MOV reg, reg

MOV mem, reg

MOV reg, mem

MOV reg, imm

MOV mem, imm

MOV reg16, segreg

MOV segreg, reg16

MOV mem16, segreg

MOV segreg, mem16

 

MOVS, MOVSB, MOVSW, MOVSD – Переслать строку. Копирует байт, слово или двойное слово из памяти, адресуемой регистровой парой DS:ESI, в память, адресуемую регистровой парой ES:EDI. В команде MOVS должны быть указаны оба операнда. Содержимое регистров автоматически изменяется на 1, 2 или 4 в зависимости от типа команды. Если DF=1, то ESI и EDI уменьшаются, иначе – увеличиваются.

Формат команды:

MOVS dest, source

MOVS ES:dest, segreg:source

MOVSB

MOVSW

MOVSD

 

MOVSX – Переслать и дополнить знаком. Копирует байт или слово в больший по размеру регистр. При этом оставшиеся неопределёнными биты регистра-приёмника заполняются значением знакового бита операнда-источника.

Формат команды:

MOVSX reg16, reg8

MOVSX reg16, mem8

MOVSX reg32, reg8

MOVSX reg32, mem8

MOVSX reg32, reg16

MOVSX reg32, mem16

 

MOVSZ – Переслать и дополнить нулями. Копирует байт или слово в больший по размеру регистр. При этом оставшиеся неопределёнными биты регистра-приёмника заполняются нулями.

Формат команды:

MOVSZ reg16, reg8

MOVSZ reg16, mem8

MOVSZ reg32, reg8

MOVSZ reg32, mem8

MOVSZ reg32, reg16

MOVSZ reg32, mem16

 

MUL – Целочисленное умножение без знака. Умножает операнд, указанный в команде на содержимое аккумулятора. При 8-разрядном умножении произведение помещается в AX, при 16-разрядном – в DX:AX, при 32-разрядном – в EDX:EAX.

Формат команды:

MUL reg

MUL mem

 

NEG – Инверсия знака. Изменяет знак числа на противоположный, вычисляя его двоичный дополнительный код.

Формат команды:

NEG reg

NEG mem

 

NOP – Нет операции. Эта команда не выполняет никаких действий и используется внутри цикла для организации временных задержек, а также для выравнивания последующих за ней команд на заданную границу (слова, двойного слова и т.п).

Формат команды: NOP

 

NOT – Логическое отрицание. Побитная инверсия.

Формат команды:

NOT reg

NOT mem

 

OR – Логическое ИЛИ.

Формат команды:

OR reg, reg

OR mem, reg

OR reg, mem

OR reg, imm

OR mem, imm

 

OUT – Вывести данные в порт. Выводит байт, слово или двойное слово из аккумулятора в порт. Первый операнд определяет номер порта, который задаётся в виде 8-разрядной константы (00h-0FFh), либо 16-разрядного адреса (0000h-0FFFFh), загруженного в регистр DX.

Формат команды:

OUT imm, accum

OUT DX, accum

 

OUTS, OUTSB, OUTSW, OUTSD – Вывести строку в порт. Выводит поток байтов, слов или двойных слов из памяти, адрес которой указан в регистровой паре ES:EDI, в порт. Номер порта указывается в регистре DX. После вывода данных EDI автоматически изменяется согласно флагу направления и размеру используемых операндов. Перед командой может использоваться префикс повторения REP.

Формат команды:

OUTS dest, DX

REP OUTSB dest, DX

REP OUTSW dest, DX

REP OUTSD dest, DX

 



Поделиться:


Последнее изменение этой страницы: 2016-06-29; просмотров: 588; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.192.3 (0.391 с.)