Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект по МПиМК / Лекция 04.doc
Скачиваний:
160
Добавлен:
15.06.2014
Размер:
415.74 Кб
Скачать

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

Соседние файлы в папке Конспект по МПиМК