- •Тема 4 Программная модель микропроцессоров архитектуры ia-32
- •1. Особенности архитектуры ia-32
- •2. Структура микропроцессоров ia-32
- •3. Регистры
- •4. Формат команды микропроцессора ia-32
- •5. Типы данных
- •6. Пространство памяти
- •7. Режимы адресации
- •8. Система команд
- •8.1. Инструкции пересылки данных
- •8.2. Инструкции двоичной арифметики
- •8.3. Инструкции десятичной арифметики
- •8.4. Инструкции логических операций
- •8.5. Инструкции сдвигов
- •8.6. Инструкции обработки бит и байт
- •8.7. Инструкции передачи управления
- •8.8. Инструкции строковых операций
- •8.9. Инструкции работы с флагами
- •8.10. Инструкции загрузки указателей
- •8.11. Разные инструкции
8.3. Инструкции десятичной арифметики
Инструкции позволяют оперировать с неупакованными (биты [7–4] = 0, биты [3–0] содержат десятичную цифру 0–9) или упакованными (биты [7–4] содержат старшую, биты [3–0] –младшую десятичную цифру 0–9) двоично–десятичными числами. Арифметические операции над этими числами требуют применения инструкций коррекции форматов (таблица 8.4).
Таблица 8.4.
Команда |
Описание |
AAA |
Десятичная коррекция AL после сложения двух неупакованных чисел инструкцией ADD. В случае переполнения инкрементируется регистр AH и устанавливаются флаги CF и AF |
AAD |
Десятичная коррекция AX перед делением неупакованного двузначного числа инструкцией DIV для того, чтобы результат оказался неупакованным числом AL=AL+10*AH, AH=0. |
AAM |
Десятичная коррекция AX после умножения двух неупакованных чисел инструкцией MUL |
AAS |
Десятичная коррекция AL после вычитания двух неупакованных чисел инструкцией SUB. В случае заема декрементируется регистр AH и устанавливаются флаги CF и AF |
DAA |
Десятичная коррекция AL после сложения двух упакованных BCD–чисел инструкцией ADD. В случае десятичного переноса CF = AF = 1 |
DAS |
Десятичная коррекция AL после вычитания двух упакованных BCD–чисел инструкцией SUB. В случае десятичного заема CF = AF = 1 |
8.4. Инструкции логических операций
Инструкции выполняют все функции булевой алгебры над байтами, словами или двойными словами (таблица 8.5).
Таблица 8.5
Команда |
Описание |
AND r/m, r/m/i |
Логическое И (обнуление тех бит в r/m, которые нулевые в r/m/i) |
NOT r/m |
Инверсия всех бит |
OR r/m, r/m/i |
Логическое ИЛИ (установка тех бит в r/m, которые равны единице в r/m/i) |
XOR r/m, r/m/i |
Исключающее ИЛИ (инверсия тех бит в r/m, которые равны единице в r/m/i) |
8.5. Инструкции сдвигов
Сдвиги и вращения (циклические сдвиги) выполняются над регистром или операндом в памяти. Число позиций, на которое производится сдвиг, берется из непосредственного операнда или регистра CL по модулю 8 для однобайтового операнда и по модулю 16 или 32 для операнда–слова, в зависимости от разрядности данных. Биты, выталкиваемые при сдвигах, попадают во флаг CF. При сдвигах влево и простом сдвиге вправо освобождающиеся биты заполняются нулями. При арифметическом сдвиге вправо старший бит (знак) сохраняет свое значение. При циклических сдвигах выталкиваемые биты попадают и во флаг CF и в освобождающиеся позиции. Инструкции сдвигов (таблица 8.6).
Таблица 8.6
Команда |
Описание |
RCL r/m ~ r/m, CL ~ r/m, i8 |
Циклический сдвиг влево через бит переноса CF на одну позицию, на CL позиций, на i8 позиций (286+) |
RCR r/m ~ r/m, CL ~ r/m, i8 |
Циклический сдвиг вправо через бит переноса CF на одну позицию, на CL позиций, на i8 позиций (286+) |
ROL r/m ~ r/m, CL ~ r/m, i8 |
Циклический сдвиг влево на одну позицию, на CL позиций, на i8 позиций (286+) |
ROR r/m ~ r/m, CL ~ r/m, i8 |
Циклический сдвиг вправо на одну позицию, на CL позиций, на i8 позиций (286+) |
SAL r/m ~ r/m, CL ~ r/m, i8 |
Сдвиг арифметический влево на одну позицию, на CL позиций, на i8 позиций (286+) |
SAR r/m ~ r/m, CL ~ r/m, i8 |
Сдвиг арифметический вправо на одну позицию, на CL позиций, на i8 позиций (286+) |
SHL r/m ~ r/m, CL ~ r/m, i8 |
Сдвиг влево на одну позицию, на CL позиций, на i8 позиций (286+) |
SHR r/m ~ r/m, CL ~ r/m, i8 |
Сдвиг вправо на одну позицию, на CL позиций, на i8 позиций (286+) |
SHLD r/m16, r16, i8 ~ r/m32, r16, i8 ~ r/m16, r16, CL ~ r/m32, r16, CL |
Сдвиг влево r/m16 (r/m32) на i8 бит, вставка данных из r16 (r32) в освободившиеся позиции (386+) то же, но счетчик сдвигов CL
|
SHRD r/m16, r16, i8 ~ r/m32, r16, i8 ~ r/m16, r16, CL ~ r/m32, r16, CL |
Сдвиг вправо r/m16 (r/m32) на i8 бит, вставка данных из r16 (r32) в освободившиеся позиции (386+) то же, но счетчик сдвигов CL
|
Ниже показан пример, демонстрирующий работу инструкций сдвигов. В примере используется функция _Itoa, определенная ранее.
; пример 4
; программа быстрого умножения числа 125 на
; число, являющееся степенью 2 (степень вводится с клавиатуры)
CSEG SEGMENT
ASSUME cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
ORG 100h
Start:
jmp Beg
Extrn _Itoa : proc
Prompt DB 'Введите число x – степень 2 в диапазоне 0–9: $'
End_mes DB 0ah,0dh,'Результат выражения 125*2**x: $'
Str_num DB 5 DUP(0)
DB '$'
Beg:
mov ah,9
lea dx,Prompt ; вывод приглашения
int 21h
mov ah,1
int 21h ; ввод символа
sub al,'0' ; преобразование его в число
mov cl,al
mov ax,125
shl ax,cl ; сдвиг – умножение
mov cx,5 ; число преобразуемых цифр
lea bx,Str_num+4 ; адрес конца строки
mov si,10
call _Itoa ; вызов функции преобразования
lea dx,End_mes
mov ah,9
int 21h
lea dx,Str_num ; вывод полученной строки
int 21h ; на экран
int 20h
CSEG ENDS
end Start