Арифметические команды

Ассемблер. Команды процессора

По своим функциям все команды процессоров семейства x86 делятся на шесть категорий:

§ команды передачи данных;

§ арифметические команды;

§ логические команды;

§ команды управления потоком;

§ команды управления процессором;

§ команды для работы со строками.

Команды передачи данных

Группа команд передачи данных представлена в табл. 6.1. Эта группа делится на четыре части.

Таблица 6.1. Команды передачи данных.

Мнемокод / Операнды Описание
Основные команды
mov назначение, источник переслать байт или слово
pop назначение извлечение слова из стека
push источник занесение слова в стек
xchg назначение, источник перестановка байтов и слов
xlat/xlatb перекодировка таблицы
Команды ввода / вывода
in аккумулятор, порт ввод байта или слова из порта
out порт, аккумулятор вывод байта или слова в порт
Адресные команды
lds назначение, источник загрузка регистра сегмента данных (ds)
lea назначение, источник загрузка эффективного адреса
les назначение, источник загрузка регистра дополнительного сегмента (es)
Команды флагов
lahf загрузка флагов в регистр ah
popf извлечение регистра флагов из стека
pushf занесение регистра флагов в стек
sahf установка флагов из регистра ah

Основные команды

Команда mov работает следующим образом:

mov назначение ß источник.

Операнды «назначение» и «источник» могут быть записаны в разных режимах адресации. Режимом адресации называется способ определения адреса операнда. Рассмотрим режимы адресации данных.

1. Непосредственный. Значение операнда длиной 8 или 16 бит является непосредственной частью команды.

Пример 6.1: mov ax, 10

2. Прямой. Смещение адреса операнда указано прямо в команде.

Пример 6.2: mov i, ax

3. Регистровый. Операнд содержится в указанном командой регистре; 16-битный операнд может находиться в регистрах ax, bx, cx, dx, si, di, sp, bp, а 8-битный - в регистрах al, ah, bl, bh, cl, ch, dl, dh.

Пример 6.3: inc cx

4. Регистровый косвенный. Смещение адреса операнда находится в базовом регистре bx или bp или в индексном регистре si или di.

Пример 6.4: sub ax, [bx]

5. Регистровый относительный. Смещение адреса операнда определяется как сумма 8- или 16-битного относительного смещения и содержимого базового (bx или bp) или индексного (si или di) регистров.

Пример 6.5: add ax, [bp+2]

6. Базовый индексный. Смещение адреса операнда определяется как сумма содержимого базового (bx или bp) и индексного регистров (si или di).

Пример 6.6: mov ax, [bx+si]

7. Относительный базовый индексный. Смещение адреса операнда определяется как сумма 3-х слагаемых: 8- или 16-битного относительного смещения, содержимого индексного регистра (si или di) и содержимого базового регистра (bx или bp).

Пример 6.7: mov ax, [bx+si+2]

Команды pop и push, а также другие команды, образованные на их основе (popa, pushfw и т.д.) являются командами пересылки данных между стеком и регистрами.

Стек – это специальный сегмент памяти, который выполняет следующие основные функции:

§ временно сохраняет значения регистров;

§ хранит адреса возврата из подпрограмм;

§ хранит динамические переменные.

Стек организован по принципу LIFO (last-in-first-out) – последним вошел, первым вышел. В регистре ss содержится адрес начала стекового сегмента. Регистр sp указывает на смещение относительно этого начального адреса.

Команда push помещает регистр в стек, а команда pop – извлекает. Поэтому правильное управление стеком заключается в том, чтобы на каждую команду push была соответствующая команда pop:

push ax

push bx

push dx

pop dx

pop bx

pop ax

Команда xchg предназначена для двунаправленной пересылки данных.

Пример 6.8: xchg ax, bx меняет значения регистров между собой.

Обмен регистров можно осуществить и через стек, но только в три команды:

push ax

mov ax, bx

pop bx

Пример 6.9: xchg ah, al меняет старшую и младшую часть регистра ax.

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

mov bh, ah

mov ah, al

mov al, bh

Команда xlat предназначена для перекодировки символов по таблице перекодировки.

Пример 6.10: Использование команды xlat

table db 'abcdef'

mov al, 3

lea bx, table

xlat ; (al)='c'

Адресные команды

Команда lea загружает эффективный адрес источника, т.е. его смещения относительно начала сегмента данных. Данная команда является альтернативой оператору ассемблера offset (смещение). В отличие от offset команда lea допускает индексацию операнда, что позволяет более гибко организовать адресацию операндов.

Пример 6.11. Загрузить в регистр bx адрес пятого элемента массива mas

.data

mas db 10 dup (0)

.code

...

mov di, 4

lea bx, mas[di]

;или

lea bx, mas[4]

;или

lea bx, mas+4

Команды lds/les/lgs/lfs/lss – загружают сегментный регистр ds / es / gs / fs / ss указателем из памяти. Например, команда lds di, pointer помещает в пару регистров ds:di адрес переменной pointer.

Арифметические команды

Группа арифметических командпредставлена в табл. 6.2. Эта группа делится на четыре части:

Таблица 6.2. Арифметические команды.

Мнемокод / Операнды Описание
Команды сложения
aaa коррекция BCD-формата для сложения
adc назначение, источник сложение с переносом
add назначение, источник сложение байт или слов
daa десятичная коррекция для сложения
inc назначение инкремент
Команды вычитания
aas коррекция BCD-формата для вычитания
cmp назначение, источник сравнение
das десятичная коррекция для вычитания
dec назначение декремент
neg назначение изменение знака числа
sbb назначение, источник вычитание с учетом заема (флаг CF)
sub назначение, источник вычитание
Команды умножения
aam коррекция BCD-формата для умножения
imul источник умножение величин со знаком
mul источник беззнаковое умножение
Команды деления
aad коррекция BCD-формата для деления
cbw преобразование байта в слово
cwd преобразование слова в двойное слово
div беззнаковое деление
idiv деление величин со знаком

Примеры команд сложения:

add dl, 5 ;dlßdl+5

add ah, bh ;ahßah+bh

adc ah, bh ;ahßah+bh+cf

inc ah ;ahßah+1

Существует специальный вид представления числовой информации, в основу которой положен принцип кодирования каждой десятичной цифры числа группой из четырех бит. Этот вид называется двоично-десятичным кодом (BCD – Binary-Coded Decimal). Процессор может хранить BCD-числа в двух форматах: упакованном и неупакованном. В упакованном формате каждый байт может хранить числа в диапазоне от 00 до 99. В неупакованном формате в байт записываются числа в диапазоне от 0 до 9 (старшая тетрада байта всегда равна 0).

Пример 6.12. Сложение чисел. Результат BCD-число.

mov ah,08h ;ah=08h

mov al,05h ;al=05h

add al,ah ;al=al+ah=05h+08h=0dh (=13) – не BCD-число

xor ah,ah ;ah=0

aaa ;ah=1, al=3 – результат скорректирован

Пример 6.13. Сложение BCD-чисел.

mov al,69h ;69h — упакованное BCD-число

mov bl,74h ;74h — упакованное BCD-число

adc al,bl ;al=0ddh (=143)

daa ;cf=1, al=43h

jc m1 ;если перенос, то переход на ту ветвь программы, где он будет учтен:

Далее мы не будем рассматривать BCD-числа.

Примеры команд вычитания:

sub dl, 5 ;dlßdl-5

sub ah, bh ;ahßah-bh

dec ah ;ahßah-1

neg ah ;ahß-ah (в ah помещается двоичное дополнение)

cmp ax, bx ;выполняется вычитание ax-bx, но результат в ax не изменяется)

Для умножения чисел без знака предназначена команда mul. Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя:

· если операнд, указанный в команде — байт, то второй сомножитель должен располагаться в al;

· если операнд, указанный в команде — слово, то второй сомножитель должен располагаться в ax;

Результат умножения помещается также в фиксированное место, определяемое размером сомножителей:

· при умножении байтов результат помещается в ax;

· при умножении слов результат помещается в пару dx:ax;

Пример 6.14. Умножение чисел

mn_1 db 15

mn_2 db 25

mov al, mn_1

mul mn_2 ;ax ß mn_1*mn_2

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

Логические команды представлены в таблице 6.3.

Таблица 6.3. Логические команды.

Мнемокод / Операнды Описание
Основные команды
and назначение, источник логическое И
not назначение логическое НЕ
or назначение, источник логическое ИЛИ
test назначение, источник проверка бита
xor назначение, источник логическое исключающее ИЛИ
Сдвиговые команды
rcl назначение, количество циклический сдвиг влево через флаг переноса
rcr назначение, количество циклический сдвиг вправо через флаг переноса
rol назначение, количество циклический сдвиг влево
ror назначение, количество циклический сдвиг вправо
sal назначение, количество арифметический сдвиг влево
sar назначение, количество арифметический сдвиг вправо
shl назначение, количество сдвиг влево
shr назначение, количество сдвиг вправо

Команда test производит логическое умножение (and) операндов, не изменяя их, проводит установку флагов.

Команда sal работает по следующему алгоритму работы:

· сдвиг всех битов операнда влево на один разряд, при этом выдвигаемый слева бит становится значением флага переноса cf;

· одновременно справа в операнд вдвигается нулевой бит;

· указанные выше два действия повторяются количество раз, равное значению второго операнда

Команда sar работает по следующему алгоритму работы:

· сдвиг всех битов операнда вправо на один разряд, при этом выдвигаемый справа бит становится значением флага переноса cf;

· обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, а значение старшего бита операнда, то есть по мере сдвига вправо освобождающиеся места заполняются значением знакового разряда. По этой причине этот тип сдвига и называется арифметическим;

· указанные выше два действия повторяются количество раз, равное значению второго операнда.

 

<== предыдущая лекция | следующая лекция ==>
Аппаратные прерывания | Организация ввода-вывода

Дата добавления: 2020-02-05; просмотров: 616;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.02 сек.