Система команд процессоров фирмы Intel сложилась исторически, начиная с первых разработок фирмы. Все микропроцессоры этой фирмы совместимы снизу вверх, что чрезвычайно привлекательно всем разработчикам программных продуктов. Для исследования работы процессора очень удобна система команд процессора 80386, так как она позволяет использовать как 16, так и 32-разрядные регистры процессора.
Важным для команд является понятие “операнд”. Это то значение данных, которое обрабатывает команда. Операнд обычно рассматривается в качестве “источника” или “приемника”, в зависимости от того, берет ли команда данные из него или помещает данные в операнд. Приемниками могут быть регистры или ячейки памяти, а источниками - еще и непосредственные данные. Обычно операнды могут иметь любой размер (байт, слово, двойное слово и т.д.). В команде после кода операции ставится приемник и через запятую источник. В большинстве команд с несколькими операндами все операнды должны иметь одинаковый размер (тип). Место нахождения операнда (память или регистр) определяется форматом команды.
В таблице 3.1 в алфавитном порядке, перечислены наиболее распространенные команды. Этих команд обычно бывает достаточно для составления простых программ и выполнения контрольных заданий. Если вы внимательно изучите эти команды, то составление простых программ на ассемблере не доставит вам никаких трудностей. Если вы просматриваете эти учебные пособия на компьютере, то можете быстро перейти на подробное описание необходимой команды, нажав Ctrl и щелкнув на нужной команде в таблице 3.1. Подробное описание этих команд приведено в первом разделе этой главы. Примеры программ на ассемблере приведены в главе 5.
Таблица 3.1-Наиболее распространенные команды ассемблера
№ | Мнемокод | Назначение |
1 | ADC r,r/m./im | Сложить два операнда с учетом флага переноса |
2 | ADD r/m,m/im/r | Сложить два операнда |
3 | CALL label | Вызов процедуры |
4 | CBW | Конвертировать байт в слово |
5 | CMP r/m,im/im | Сравнить два операнда |
6 | CWD | Конвертировать слово в двойное слово |
7 | DEC r/m/im | Декремент (уменьшение) операнда на 1 |
8 | DIV r/m | Целочисленное деление без знака |
9 | IDIV r/m | Целочисленное деление со знаком |
10 | IMUL r/m | Целочисленное умножение со знаком |
11 | INC r/m/im | Инкремент (увеличение) операнда на 1 |
12 | INT im | Вызов прерывания |
13 | JE label | Перейти на метку label, если равно (ZF =1) |
14 | JG label | Перейти на метку label, если больше (SF=OF) |
15 | JL label | Перейти на метку label, если меньше (SF<>OF) |
16 | JMP label/r/m | Перейти на метку label безусловно |
17 | JS label | Перейти на метку label, если знак (SF=1) |
18 | JZ label | Перейти на метку label, если ноль (ZF=1) |
19 | LEA r,r/m | Загрузка смещения эффективного адреса |
20 | LOOP label | Управление циклом |
21 | MOV r/m,r/m/im | Пересылка данных |
22 | MUL r/m | Беззнаковое умножение |
23 | NOT r/m | Инвертирование (логическое НЕ) |
24 | POP r/m | Извлечь данные из стека в операнд |
25 | PUSH r/m | Переслать операнд в стек |
26 | RET | Возврат в основную программу |
27 | SUB r/r/m/r,r/r/m/im | Вычитание |
28 | TEST r/m,r/m/im | Логическое сравнение |
29 | XCHG r/m,r/m | Обмен операндами |
30 | XOR r,r/m/im | Исключающее ИЛИ (неравнозначность) |
Подробное описание распространенных команд Ассемблера
Команды сложения - ADD, ADC
Команды ADD (add - сложить) и ADC (add with carry- сложить с переносом) могут складывать как 8, так и 16-битовые операнды.
Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. Формат команды: ADD приемник,источник
В символической нотации ее действия можно описать следующим образом: приемник:= приемник + источник.
Команда ADC делает то же, что и команда ADD, но складывает не два, а три слагаемых. Приемник, источник и флаг переноса. Формат команды: ADC приемник,источник + CF
В символической нотации ее действия можно описать как:
приемник:= приемник + источник + перенос.
Перенос при сложении двоичных чисел аналогичен переносу при сложении десятичных чисел в столбик. Когда ЭВМ складывает двоичные числа и сумма не помещается в операнде-приемнике, то генерируется перенос. Как известно, 8-битовый регистр может содержать значения без знака в диапазоне от 0 до 255. Если мы, например, выполним двоичное сложение чисел 250 и 10, то получим следущее:
1111 1010; двоичное представление числа 250.
+ 0000 1010; двоичное представление числа 10.
1 0000 0100; ответ: десятичное значение 260.
Результат верен, но занимает 9 двоичных битов. Если при выполнении этой операции мы использовали 8-битовые регистры, то младшие 8 битов будут занесены в регистр-приемник, а девятый бит- во флаг переноса CF. Теперь нетрудно понять, почему микропроцессор 8086 имеет две разные команды сложения. Одна из них (ADD) может складывать значения, представляемые байтами или словами, а также младшие части значений повышенной точности. Другая команда (ADC) используется для сложения старших частей значений повышенной точности.
Например, команда ADD AX,CX;
складывает 16-битовые значения регистров АХ и СХ и возвращает результат в регистр АХ. Если операнды имеют длину более 16 битов, то можно воспользоваться командами которые складывают 32-битовое число, находящееся в регистрах СХ и DX, с 32-битовым числом, находящимся в регистрах АХ и ВХ в два приема. Например:
ADD АХ,СХ; Сначала сложить младшие 16 бит, а затем
ADC BX,DX; старшие 16 бит.
Складываемые операнды могут находиться в памяти, регистре или иметь непосредственное значение.
Например:
ADD АХ,MEM_WORD; Добавить содержимое ячейки памяти к регистру
ADD MEM_WORD,AX; или наоборот.
ADD AL, 10; Добавить константу к регистру
ADD MEM_BYTE,OFH; или к ячейке памяти.
Допускается большинство возможных комбинаций, но нельзя добавить значение одной ячейки памяти к другой или использовать в качестве приемника непосредственное значение.
Команды ADD и ADC могут воздействовать на следующие шесть флагов:
флаг переноса CF равен 1, если результат сложения не помещается в операнде-приемнике, в противном случае он равен 0;
флаг четности PF равен 1, если результат имеет четное число битов со значением 1, в противном случае он равен 0;
вспомогательный флаг переноса AF равен 1, если результат сложения десятичных чисел требует коррекции, в противном случае он равен 0;
флаг нуля ZF равен 1, если результат равен 0, в противном случае он равен 0;
флаг знака SF равен 1, если результат отрицателен (старший бит равен 1), в противном случае он равен 0
флаг переполнения OF равен 1, если слагаемое двух чисел одного знака превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. Иначе флаг OF равен 0.
Флаги SF и OF имеют смысл только при сложении чисел со знаком, а флаг AF только при сложении десятичных чисел.
Дата: 2018-11-18, просмотров: 592.