Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМСиС.docx
Скачиваний:
23
Добавлен:
22.04.2019
Размер:
278.98 Кб
Скачать

18.Процессор х86: инструкции сложения, сложения с переносом.

Операция сложения целых чисел имеет мнемокод add и требует наличия двух операндов одинакового размера – приемника и источника. Результат выполнения, в данном случае сумма операндов, помещается в приемник. После выполнения операции в регистре флагов устанавливаются или сбрасываются флаги z (нуль), s (знак) , c (перенос) и o (переполнение). Признаком выхода результата за пределы разрядной сетки, а следовательно, получения неправильного результата является для знаковых операндов установка флага переполнения, а для беззнаковых – флага переноса.

Например:

unsigned int c,d;

short s,t;

char m;

unsigned char p;

asm{

mov ax, s

add ax, -5

add t, ax

mov ecx, c

add d, ecx

mov al, m

mov bl, p

add al, bl // Неверно !!!

mov al, m // Следует делать так

cbw

movzx bx, p

add ax, bx

}

На практике часто возникает необходимость использования целых чисел повышенной разрядности. Хранение таких чисел в памяти и загрузка и выгрузка в регистры по частям не представляют проблемы. Для выполнения операции сложения таких чисел, осуществляемой по частям, предусмотрена операция adc – сложение с переносом. При выполнении этой инструкции вычисляется сумма не двух слагаемых (приемника и источника), а трех – приемника, источника и флага переноса. При этом младшие части операндов складываются при помощи инструкции add, а все последующие – при помощи инструкции adc.

Например, реализация хранения в памяти и сложения 48-разрядных чисел:

typedef unsigned char myint[6];

myint A,B,C;

. . .

// вычисление C = A + B

asm{

mov ax, word ptr A

mov bx, word ptr A+2

mov cx, word ptr A+4

add ax, word ptr B

adc bx, word ptr B+2

adc cx, word ptr B+4

mov word ptr C, ax

mov word ptr C+2, bx

mov word ptr C+4, cx

}

19.Процессор х86: сложение чисел в формате bcd.

20.Процессор х86: инструкции вычитания, вычитания с заемом.

Операция вычитания очень похожа на операцию сложения и имеет мнемокод sub. Для вычитания чисел повышенной разрядности используется операция вычитания с заемом, также очень похожая на сложение с переносом.

21.Процессор х86: инструкции умножения.

Операция умножения, помимо того, что имеет реализации для одно-, двух- и четырехбайтовых сомножителей, также имеет различные реализации для знаковых и беззнаковых сомножителей и помимо этого может быть одно-, двух- и трехоперандной.

В первых моделях процессоров х86 было реализовано только однооперандное умножение. Требовалось только задать операнд-источник, который мог быть регистром или объектом в памяти. Приемником при однооперандном умножении всегда является аккумулятор или точнее регистры данных A и D. А так как при целочисленном умножении произведение как правило много больше сомножителей, то под приемник всегда отводится вдвое больше места, чем под источник. Инструкция умножения беззнаковых чисел имеет мнемокод mul, а знаковых – imul.

Например:

unsigned int d;

short s;

char m;

asm{

imul m // регистр ax содержит произведение m и al

imul s // регистровая пара dx:ax содержит произведение s и ax

mul d // регистровая пара edx:eax содержит произведение d и eax

}

В тех случаях, когда заранее известно, что результат умножения не выйдет за пределы разрядной сетки сомножителей, используется двух- и трехоперандное умножение. Это происходит в основном при вычислении сдвигов до нужных элементов массива при индексной адресации.

При двухоперандном умножении приемником может быть только регистр (не обязательно аккумулятор), а источником – регистр, объект в памяти или непосредственное значение.

При двухоперандном умножении приемником может быть только регистр (не обязательно аккумулятор), первым источником – регистр или объект в памяти, вторым источником – только непосредственное значение.

Например:

struct s{

int t;

char sx[20];

};

s ms[200];

int I;

asm{

mov edi, i

imul edi, 24 // edi содержит сдвиг до i-го элемента массива ms

}