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

4) Нельзя использовать сегментный регистр cs в качестве операнда назначения.

5) Оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:

.data

flp dw ?

.code

start:

----

mov byte ptr (flp+1),0ffh

----

end start

Для двунаправленной пересылки данных применяют команду xchg. Эту же операцию можно выполнить применив последовательность из нескольких команд mov. Общий вид записи:

XCHG <операнд1>, <операнд2>

Содержимое операнда2 копируется в операнд1, а старое содержимое операнда1 — в операнд2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

Например:

Xchg eax,ebx ; обменять содержимое регистров eax и ebx.

То же, что три команды на языке С:

temp = eax;

eax = ebx;

ebx = temp;

Xchg al,al ; а эта команда не делает ничего

Xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].

Для условной пересылки данных используется команда:

CMOVcc <приёмник><источник>

Набор команд, которые копируют содержимое источника в приемник, если удовлетворяется то или иное условие.

Можно использовать команды CMOVcc сразу после команды СМР (сравнение) с теми же операндами, например:

cmp ах,bх ; сравнить ах и bх

cmovl ax,bx ; если ах < bх, скопировать bх в ах

Слова «выше» и «ниже» в таблице 1 относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

Таблица 4.1. Разновидности команды CMOVcc

Код команды

Реальное условие

Условие для CMP

CMOVA +

CMOVNBE

CF = 0 и ZF = 0

если выше; ax>bx если не ниже или равно; ax>bx or ax=bx

CMOVAE +

CMOVNB

CMOVNC

CF = 0

если выше или равно; ax>bx or ax=bx если не ниже; ax>bx если нет переноса

CMOVB +

CMOVNAE

CMOVC

CF = 1

если ниже; ax<bx если не выше или равно; ax<=bx если перенос;

CMOVBE +

CMOVNA

CF = 1 и ZF = 1

если ниже или равно; ax<=bx если не выше ax<bx

CMOVE +

CMOVZ

ZF = 1

если равно; ax=bx если ноль

CMOVG +

CMOVNLE

ZF = 0 и SF = OF

если больше; ax>bx если не меньше или равно; ax>bx or ax=bx

CMOVGE +

CMOVNL

SF = OF

если больше или равно; ax>bx or ax=bx если не меньше; ax>=bx

CMOVL +

CMOVNGE

SF <> OF

если меньше; ax<bx если не больше или равно

CMOVLE +

CMOVNG

ZF = 1 и SF <> OF

если меньше или равно; ax<bx or ax=bx если не больше

CMOVNE +

CMOVNZ

ZF = 0

если не равно; ax!=bx если не ноль

CMOVNO

OF = 0

если нет переполнения

CMOVO

OF = 1

если есть переполнение

CMOVNP CMOVPO

PF = 0

если нет четности если нечетное

CMOVP CMOVPE

PF = 1

если есть четность если четное

CMOVNS

SF = 0

если нет знака

CMOVS

SF = 1

если есть знак

Для обращения порядка байт в 32-битном регистре используется команда:

BSWAP <регистр 32>

Биты 0 – 15 меняются местами с битами 16–31. Например:

mov eax,12345678h

bswap eax ; теперь в еах находится 78563412h

Чтобы обратить порядок байт в 16-битном регистре, следует использовать команду XCHG:

xchg al,ah ; обратить порядок байт в АХ

Регистры архитектуры x86

Регистры архитектуры x86 (Intel 8086, 80186, 80286, 80386, 80486, Pentium'ы и аналоги этих процессоров от других фирм) представлены на рис. 3.1.

Регистры- указатели

Указатель команд

аккумулятор

база

счётчик

регистр данных

индекс источника

индекс приёмника

указатель базы

указатель стека

Рис. 3.1. Основные регистры процессоров.

Регистры сопроцессора

Сопроцессор (FPU) предназначен для выполнения операций над вещественными числами.

Восемь регистров данных разрядностью 80 бит организованы в стек. Минимальный размер значения, загружаемого в сопр, - 2 байта/

Регистры данных FPU (Floating Point Unit - арифметический стек) могут быть представлены в следующем виде:

 

Физические номера

80 бит

Относительные номера

1 бит

15 бит

64 бит

Знак

Порядок

Мантисса

0

 

 

mm0

ST(0)

1

 

 

mm1

ST(1)

2

 

 

mm2

ST(2)

3

 

 

mm3

ST(3)

4

 

 

mm4

ST(4)

5

 

 

mm5

ST(5)

6

 

 

mm6

ST(6

7

 

 

mm7

ST(7)

 

 

 

Регистры MMX/3DNow!

Расширение MMX (MultiMedia eXtension - мультимединое расширение)

MMX было первым расширением, реализующим технологию SIMD (Single Instruction - Multiple Data).

Расширение MMX использует новые типы упакованных 64-битные целочисленных данных:

- 8 упакованных байт (Packed byte);

- 4 упакованных слова (Packed word);

- 2 упакованных двойных слова (Packed double word);

- 1 учетверенное слово (Quad word);

Каждая инструкция MMX выполняет действие сразу над всем комплектом операндов (8, 4, 2 или 1), размещенных в адресуемых регистрах. Совпадение регистров MMX и FPU накладывает ограничение на чередование кодов FPU и MMX.

Можно поместить в MMX-регистр одну 8-байтовую целую переменную и использовать её различными командами, можно поместить две 4-байтные переменные или четыре 2-байтных, или восемь переменных по одному байту и производить над ними операции одновременно.

MMX-регистры используются в программах обработки звука и видео, в математических программах, в играх.

Расширение 3DNow!

Технология 3DNow!, разработанная AMD, расширяет возможности MMX и разрабатывалась для трёхмерных приложений. Она позволяет оперировать с новым типом данных - парой упакованных вещественных чисел одинарной точности.

Технология использует те же регистры, что и MMX, но позволяет помещать в них два 32-битных числа с плавающей точкой.

Причём процессор выполнял 2 инструкции 3DNow! за такт, обрабатывая 4 числа с плавающей точкой одновременно