Конспект лекций (Алещенко), страница 2
Описание файла
Документ из архива "Конспект лекций (Алещенко)", который расположен в категории "". Всё это находится в предмете "ассемблер" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "ассемблер" в общих файлах.
Онлайн просмотр документа "Конспект лекций (Алещенко)"
Текст 2 страницы из документа "Конспект лекций (Алещенко)"
Перечислим команды, относящиеся к группе команд сложения и вычитания:
Группа а) ADD op1, op2 ; op1 := op1+op2
SUB op1, op2 ; op1 := op1 – op2
Сложение (вычитание) операндов в дополнительном двоичном коде, результат помещается на место первого операнда, второй операнд не изменяется.
Команды корректируют регистр флагов FLAGS в соответствии с результатом операции, а именно:
ZF – нулевой рез-т,
SF – знак результата,
PF – флаг четности,
CF, AF – флаги переносов,
OF – флаг переполнения.
Примеры:
ADD AH, 12 ; AH := AH + 12 (1Б)
SUB z, BX ; z := z – BX (2Б)
Группа б) ADC op1, op2 ; op1 := op1+op2+CF
SBC op1, op2 ; op1 := op1 – op2 – CF
Сложение (вычитание) операндов с переносом, образованным предыдущей командой.Модифицирует флаги аналогично группе а.
Например, если требуется сложить двойные слова, расположенные в парах регистров
(AX, BX) := (AX, BX) + (CX, DX),
причем AX, CX – старшие байты слагаемых,
BX, DX – младшие байты.
Сложение выполняется двумя командами:
ADD BX, DX
ADC AX, CX
Группа в) Специальный случай сложения – изменение операнда на единицу.
INC op ; op := op +1 (инкремент)
DEC op ; op := op –1 (декремент)
Операнд может быть регистр, или ячейка памяти, байт или слово.
Группа г) Десятичная коррекция - анализ и преобразование сложения(вычитания) для BCD кодов. BCD-операнды обрабатываются обычными командами сложения и вычитания, а затем размещается команда десятичной коррекции, которая обрабатывает только один байт данных, находящихся в AL, поэтому команды десятичной коррекции операндов не имеют (подразумеваемая адресация).
DAA; коррекция после сложения
DAS; коррекция после вычитания.
Например:
ADD AL, y
DAA
SUB AL, DH
DAS
BCD-операнды, представленные более, чем одним байтом должны обрабатываться побайтно.
Команды десятичной коррекции модифицирует флаги аналогично п.(а), за исключением флагов AF и OF.
-
Дополнительные команды
Группа а) Команда сравнения
CHP op 1, op 2; op 1 - op2
Результат нигде не запоминается, команда корректирует арифметические флаги ZF, SF,PF,CF,AF,OF.
Группа б) Команда изменения знака
NEG op ; op := -op.
Операнд может быть байт или слово в регистре или в ячейке памяти.
Пример,
MOV AH, 1 ; AH := 1
NEG AH ; AH := -1
Если операнд равен нулю, то его значение не изменяется.
Команда корректирует флаги аналогично группе а; причем
CF=1, кроме случая, когда операнд равен нулю;
OF=0, кроме случая, когда op=-128 (для 1Б) = 80h (это значит, что число заняло всю разрядность), тогда OF=1, а операнд остается без изменения.
-
Команды умножения и деления
Группа а) Умножение
MUL op ; умножение целых чисел без знака
IMUL 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 соответственно. Деление является дополнительной к умножению командой.
Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.
При появлении этой ошибки микропроцессор прекращает выполнение программы.
-
Команды преобразования длины
Эти команды часто требуются перед делением, флаги – не модифицируют.
CBW – преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;
CWD – преобразует слово со знаком в АХ в двойное слово со знаком в (DX,AX) аналогично CBW.
Так же существуют команды десятичной коррекции умножения и деления AAM, AAD
Команды обработки битов
Данная группа команд отличается отсутствием межразрядных переносов. Команды делятся на 2 группы.
1) Логические команды
Общие черты:
-
Выполняют побитовую обработку операндов параллельно, без переносов; единица трактуется как «истина», ноль – «ложь»;
-
модифицируют флаги, но важен только флаг ZF «нулевой результат»;
-
операндами могут быть байты или слова в регистрах или ячейках памяти; второй операнд может быть непосредственным операндом.
Перечислим основные команды
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.
Как правило, второй операнд трактуется как маска, хранящая единицы в тех разрядах, которые нужны для дальнейшей обработки.
2) Команды сдвигов
Сдвиги на n разрядов влево можно трактовать, как умножение на 2n, потому все команды сдвигов имеют 2 операнда:
оp1 – рассматривается, как набор битов, подлежащих сдвигу влево или вправо;
op2 – константа сдвига, т.е. целое число без знака, определяющее величину сдвига нового операнда; может принимать значение 1 или CL. Единица означает сдвиг на 1 разряд, а CL – содержимое регистра CL, хранящего значение n. Сдвиг с CL выполняется как повтор однократных сдвигов, содержимое CL не меняется, при CL=0, сдвиг блокируется. Результат записывается на место первого операнда. Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.
Команды сдвига бывают логические, арифметические и циклические.
Рассмотрим их на командах однократного сдвига:
Логический сдвиг – для беззнаковых чисел может применяться для ускоренного умножения (деления) на 2, выполняется по схеме
CF
op
SHL op,1 ; сдвиг влевоSHR op,1 ; сдвиг вправо 0
Арифметический сдвиг – применяется для ускоренного умножения (деления) на 2 чисел со знаком, выполняется по схеме
SAL op,1 ; сдвиг влево
SAR op,1 ; сдвиг вправо 0
Циклический сдвиг – для беззнаковых целых, выполняется по схеме
ROL op,1 ; сдвиг влево
ROR op,1 ; сдвиг вправо
Циклический сдвиг через флаг (уходящий бит возвращается в операнд и одновременно фиксируется в CF), выполняется по схеме
R
CF
op
CL ор,1 сдвиг влевоRCR op,1 сдвиг вправо
Циклические сдвиги позволяют образовать передачу числа последовательным кодом и анализировать разряды числа. В МП 80286 и позже допускается использование второго операнда без загрузки в CL (непосредственный операнд), т.е. SHL AX,3 ;
Сегментация памяти
Память трактуется как одномерный массив байтов, каждый байт ассоциируется с двоичным адресом (номером), который называется физическим адресом.
Физический адрес – это 20-битовое беззнаковое целое от 0h до FFFFFh (метка h обозначает 16-ричную систему счисления), которое позволяет описать адресное пространство объемом 1 Мбайт.
Разрядность основного слова МП равна 2 Байта = 16 бит, поэтому для вычисления физического адреса используется выделение из адресного пространства сегментов по 64Кбайта (216), и в пределах сегмента можно определять адрес с помощью 16-битового кода.
Сегменты в адресном пространстве должны размещаться, только начиная с байтов, адреса которых кратны 16, т.е. 4 младших бита – нулевые. Такие адреса называются параграфами.
Логический адрес представляет собой пару двухбайтовых беззнаковых целых чисел, разделенных двоеточием:
-
начальный адрес сегмента (базовый),
-
смещение (эффективный адрес), указывает расстояние в байтах от начала сегмента до адресуемой ячейки памяти.
Например, могут быть указаны регистры, хранящие соответствующие коды
CS : IP
При вычислении физического адреса МП расширяет содержимое сегментного регистра четырьмя нулевыми битами, затем суммирует полученное число со смещением. Получим следующую схему образования физического адреса.
15 12 11 0
DS | начальный адрес сегмента | 0 0 0 0 | |
+ | 15 0 смещение внутри сегмента | ||
1 9 0 физический адрес байта |
Ячейка памяти – это неделимый в данной операции набор последовательных битов.
Команды передачи управления
Это наиболее важная часть системы команд, тесно связанная со структурой ПЭВМ, и является промежуточным звеном между командами МП и командами языка ассемблера, т.к. здесь существенна запись операндов. Команды передачи управления вызывают нарушение линейности программы.
Рассмотрим общие аспекты передачи управления. Наиболее важная особенность – это методы адресации, используемые для определения адреса ячейки памяти, куда передаётся управление
Близкие и далекие переходы.
Переходы в ЯА кодируются от слова Jump. Например, безусловный переход:
JMP оp,
где ор – имя команды, которой передается управление (т.е. метка).
Команды перехода модифицируют указатель команд IP и, возможно, регистр сегмента команд CS и бывают двух типов:
-
если команда изменяет только IP , т.е. передача управления внутри сегмента, то переход называется ближний переход NEAR.
-
если изменяется пара регистров CS:IP, - это межсегментный переход или далекий переход FAR.
Обычно адрес перехода ассоциируется с меткой команды. Метка – это имя команды, которое располагается до мнемоники команды и отделяется двоеточием. Любая программная метка (включая имя процедуры) имеет атрибут NEAR или FAR.
Например,
АМ1: ADD AX,4
………………….
JMP AM1
Адресация переходов
а) Прямая адресация.
Команда содержит в себе базовый адрес сегмента и смещение. Это допускается только в командах межсегментного перехода или вызова процедур. Метка, которой передается управление, должна иметь атрибут FAR.
JMP CATS
где CATS – метка команды или имя процедуры, а JMP – аналог GOTO.
б) Косвенная адресация