Арифметические команды
Ассемблер. Команды процессора
По своим функциям все команды процессоров семейства 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;