Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Assembler_konspekt_1.doc
Скачиваний:
16
Добавлен:
10.11.2019
Размер:
274.94 Кб
Скачать
  1. Дополнительные команды

а) Команда сравнения

CHP op 1, op 2; op 1 - op2

Результат нигде не запоминается.

Цель команды – модификация флагов: ZF, SF,PF,CF,AF,OF.

б) Команда изменения знака

NEG op

Операнд может быть байт или слово в регистре или в ячейке памяти.

Пример,

MOV AH, 12

NEG AH ; AH := -12

Если операнд равен нулю, то его значение не изменяется.

Команда модифицирует флаги аналогично п.(а), причем

CF=1, кроме случая, когда операнд равен нулю;

OF=0, кроме случая, когда op=-128 (для 1Б), тогда OF=1, а операнд остается без изменения.

  1. Команды умножения и деления

а) Умножение

MUL op ; умножение целых чисел без знака

I MUL op; умножение целых чисел со знаком

Операнд может быть слово или байт в регистре или в ячейке памяти, но не непосредственный операнд.

Команды действуют одинаково:

- для байтов AX := AL*op

- для слов (DX,AX) := AX*op

Команда однооперандная, второй операнд находится в аккумуляторе (подразумеваемая адресация).

Т.к. результат получается удвоенной разрядности относительно сомножителей, то при умножении слов он располагается в стандартной паре регистров (DX,AX), причем DX хранит старшие разряды.

Команды модифицируют флаги:

СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.

СF=OF=1 , если старшие разряды не нулевые.

б) Деление

DIV op; деление целых чисел без знака

IDIV op; деление целых чисел со знаковом

где op – аналогично умножению.

Команды выполняют деление нацело и формируют два результата: целое частное и остаток.

Деление слова на байт выполняется по схеме

АН:=АХ mod op (остаток)

AL:=AX div op (частное)

Деление двойного слова на слово

DX := (DX,AX) mod op

AX := (DX,AX) div op

Делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно.

Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.

При появлении этой ошибки микропроцессор прекращает выполнение программы.

в) Команды десятичной коррекции после команд умножения AAM и перед командой деления AAD (разобрать самостоятельно).

  1. Команды преобразования длины

Эти команды используются перед делением, флаги – не модифицируют.

CBW

– преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;

CWD

– преобразует слово в АХ в двойное слово в (DX,AX).

Команды побитовой обработки (логические команды)

Данная группа команд отличается отсутствием межразрядных переносов. Команды делятся на 2 группы.

а) Логические команды.

Общие черты:

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

  2. единица трактуется как «истина», ноль – «ложь»;

  3. модифицируют флаги, но важен только флаг ZF «нулевой результат»;

  4. операндами могут быть байты или слова в регистрах или ячейках памяти, второй операнд может быть непосредственным операндом.

Перечислим основные команды

NOT op; отрицание (инверсия кода)

Флаги не модифицирует.

AND op1, op2; op1:= op1^ op2

Например, 0Fh ^ 15h = 05h

^

00001111

00010101

00000101

OR op1, op2; op1:= op1 v op2

Например, 0Fh v 15h = 1Fh

XOR op1, op2; op1 := op1 op2

Например, 0Fh v 15h = 1Ah

TEST op1, op2; op1^ op2 – результат не запоминается

Эта операция называется «логическое сравнение». Цель формирование флага

ZF = 1 - если результат нулевой, иначе ZF = 0.

Как правило, второй операнд трактуется как маска, хранящая единицы в тех разрядах, которые нужны для дальнейшей обработки.

б) Команды сдвигов

Сдвиги на n разрядов влево можно трактовать, как умножение на 2n, потому все команды сдвигов имеют 2 операнда:

оp1 – рассматривается, как набор битов, подлежащих сдвигу;

op2 – константа сдвига, т.е. целое число без знака, может принимать значение 1 или CL. Единица означает сдвиг на 1 разряд, а CL – содержимое регистра CL, хранящего значение n. Сдвиг с CL выполняется как повтор однократных сдвигов, содержимое CL не меняется, при CL=0, сдвиг блокируется.

Результат записывается на место первого операнда.

Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.

Команды сдвига бывают логические, арифметические и циклические.

Рассмотрим их на командах однократного сдвига.

Логический сдвиг – для беззнаковых чисел может применяться для ускоренного умножения (деления) на 2, выполняется по схеме (см. рис.8)

CF

op

SHL op,1 ; сдвиг влево

SHR op,1 ; сдвиг вправо 0

Рис.8

Арифметический сдвиг – применяется для ускоренного умножения (деления) на 2 чисел со знаком, выполняется по схеме (см. рис.9).

SAL op,1 ; сдвиг влево

SAR op,1 ; сдвиг вправо 0

Рис.9

Циклический сдвиг – для беззнаковых целых, выполняется по схеме (см. рис.10).

ROL op,1 ; сдвиг влево

ROR op,1 ; сдвиг вправо

Рис.10

Циклический сдвиг через флаг , выполняется по схеме (см. рис.11).

CF

op

RCL ор,1 сдвиг влево

RCR op,1 сдвиг вправо

Рис.11

Команды работы со стеком

Стек – это область оперативной памяти, запись и чтение данных в которой основан на принципе LIFO (Last input first output, т.е. «последним пришел – первым ушел»).

Последовательность данных, которая загружена в стек, может быть считана только в обратном порядке. Стек используется в ПЭВМ для временного хранения данных, необходимых для организации процедур, для передачи параметров в процедуры, а так же для хранения некоторых промежуточных данных.

Считывание и загрузка в стек осуществляется двухбайтовыми словами.

Стек организуется программно в памяти, для стека можно отвести любую область памяти, удовлетворяющую двум требованиям:

  • максимальная емкость 64КБ (32К слов),

  • конечный адрес должен быть кратным 16 (параграф).

Стек занимает один сегмент памяти, называемый сегментом стека, с сегментным регистром SS, указывающим на начало, т.е. базу стека. Для работы со стеком обычно используют косвенную адресацию через регистр SP – указатель стека, указывающий на текущую ячейку стека, называемую вершиной стека.

В начале работы с SP указывают на последнюю ячейку сегмента стека. При загрузке числа автоматически производится декремент SP := SP–2.

Считывание числа из стека сопровождается автоматическим инкрементом: SP := SP+2, причем считается, что ячейка стека свободна и готова для последующего использования, но ее содержимое после считывания не изменяется.

Для дополнительного обращения к элементам стека (не через вершину) можно использовать регистр ВР, называемый дополнительным указателем стека.

Если в программе нет явного использования стека, то необходимо его зарезервировать в объеме 128Б для автоматического использования.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]