- •12.09.2012 — Лекция №2
- •17.09.2012 — Лекция №3
- •23.09.2012 — Лекция №4
- •26.09.2012 — Лекция №5
- •1.10.2012 — Лекция №6
- •08.10.2012 — Лекция №7
- •08.10.2012 — Лекция №8
- •22.10.2012 — Лекция №10
- •24.10.2012 — Лекция №11
- •29.10.2012 — Лекция №12
- •07.11.2012 — Лекция №13
- •12.11.2012 — Лекция №14
- •19.11.2012 — Лекция №15
- •17.11.2012 — Лекция №16
- •20.11.2012 — Лекция №17
- •25.11.2012 — Лекция №18
- •03.12.2012 — Лекция №19
- •05.12.2012 — Лекция №20
- •10.12.2012 — Лекция №21
- •17.12.2012 — Лекция №22
- •19.12.2012 — Лекция №23
29.10.2012 — Лекция №12
Косвенная адресация обозначается как название регистра, заключенное в квадратные скобки. Содержимое регистра косвенной адресации нужно установить с помощью команды lea или псевдокоманды offset
LEA BX, MT
MOV AX,[BX] ; косвенная адресация
С помощью косвенной адресации м/о обращаться к элементам массива в циклическом режиме, т.е. с изменением содержимого BX внутри цикла программы
INC BX
MOV CX, [BX]
MT: DW ?,?
Индексный способ адресации используется аналогично косвенно-регистровому способу адресации, но при этом в составе микропроцессора используется специализированные индексные регистры, поэтому индексный способ адресации обычно используют для доступа к элементам структуры, для начала адреса записи используют указатель, находящийся в регистре базы.
LEA BX, MT
LEA SI, 2
MOV AX [SI][BX], AX=25h
Адрес в BX еще называют базовым адресом, он указывает на начало структуры, а содержание SI указывает смещение на начало элемента структуры, таким образом такой способ адресации называется базово-индексным. Если элемент структуры состоит из нескольких байтов или слов, то можно указать смещение внутри элемента MOV AX, [SI][BX]+2; всё в байтах. Базово-индексный способ адресации можно использовать для работы с двумерными массивами, а начало двумерного массива задается с помощью метки, автоматически прибавляет g.
MOV BX,4
MOV SI, 2
MOV AX, MT+[BX]+[SI]+2; (со смещением относительно начала таблицы)
Группа логических команд предназначена для побитовой обработки данных, находящихся в регистре или ячейке памяти.
And R/m, R/m /d8/d16,
1операнд 2 операнд
And – реализует побитовую операцию логического умножения, результат находится в левом операнде. Пример:
And al.bl
Al 01101011
Bl 00101010
Ст бит мл бит
00101010 ; результат 2А
Логическое умножение обычно используется для операций наложения маски (маскирование), например, необходимо выделить младшую тетраду содержимого And al, 0Fh, если подавить младшую тетраду 0F0h.
Команда логического сложения
Or R/m , R/m / d8/d16
Or al, bl ; al=2Ah
Or al, 0Fh; установка младшей тетрады в 1
Этой командой реализуется побитное логическое сложение содержимого указанных регистров
Al 01101011
Bl 00101010
01101011 - логическое сложение
Младшие биты устанавливаем в 1, старшие – неизменны. Принудительная установка отдельных битов указанного регистра в 1.
Эти команды обычно используются для работы с флагами устройств.
Xor R/m ; R/m /d8/d18 al 01101011
Xor al, bl ; al=0 + bl 00101010
Xor al, 0Fh 01000001
4 1h
Xor al, al ; al=0
Побитное логическое сложение по модулю 2 (побитное исключение или) – обычное побитное арифметическое сложение с учетом переносов. Основное назначение – для инвертирования определенных битов регистра. Второе назначение – установка в 0 указанного регистра. Третье – команда используется для сравнения 2х кодов на совпадение (если коды в al b bl равны, то al=0).
Команда test – полный аналог команды and, но по результату вычислений команды формируется состояние регистра признаков, а операнды не изменяются, таким образом можно многократно использовать содержимое первого операнда, оно всегда сохраняется после команды test ; обычно применяется для проверки флагов готовности внешних устройств.
Команда not – команда побитового инвертирования указанного регистра или ячейки памяти
Not R/m
Команда сдвига содержимого регистра rol R/m (сдвинуть) – сдвиг указанного регистра или ячейки памяти (операнда) без учета переноса влево
Используется для сдвигов между тетрадами или для формирования флага переноса С , для последующей побитной обработки, например, для преобразования II кода в последовательный начиная со старших разрядов. Кроме того имеется возможность преобразовать эти команды со сдвигом по счетчику rol R/m, CL – будет сдвигать столько раз, сколько записано в CL/
Команда сдвига с учетом переноса
Rcl R/m, cl
Rcr R/m, cl
Команда сдвига с учетом переноса влево и вправо.
Эти команды используются для сдвига многобайтных слов с учетом распространения переноса – используется для сдвига данных, при этом перед началом цикла сдвига многобайтных чисел нужно обнулить бит переноса.
Имеются 2 логических сдвига.
Shl R/m, cl
Shr R/m, cl
Логический сдвиг влево и вправо
В освободившийся бит всегда записывается 0, эти команды используются сдвиг влево – для уменьшения без знакового числа на 2; сдвиг вправо – для деления числа на 2; в CF переносится остаток от деления на 2
Al 00001011 -11
00010110, sh
22 (16 и 6)
Арифметические команды сдвига
Sal R/m , cl
Sar R/m , cl
Арифметический сдвиг влево совпадает с логическим сдвигом влево, т.е. младший бит записывается нулями, старший освобождающийся бит (знак числа) сохраняется – эта команда предназначена для сдвига чисел со знаком.
Группа арифметических команд
Эти команды выполняют арифметические действия над командами
Add R/m , R,m /d8/d16 ; команда арифметического сложения с учетом переноса
Add al, bl
Арифметические команды – особые команды, могут влиять на любой бит регистра флагов. Если число больше чем 255 то происходит перенос в старший бит, устанавливается флаг CF
Adc R/m , R/m /d8/d16
Adc al, bl ; al=Bl+Al+CF
Adc – команда сложения с учетом переноса, т.е. эта команда используется для сложения старших байтов многобайтных чисел, младшие байты складываются без учета переноса. Таким образом можно складывать числа любой длины, начиная с младшего байта и распространять перенос, однако при этом уменьшается быстродействие, т.к. байты обрабатываются последовательно.
SUB R/m , R/m /d8/d6
Sub al, bl
Из левого операнда вычисляется содержимое правого операнда.
