Команды пересылки данных FPU 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команды пересылки данных FPU



1)

 Команда: FLD источник
 Назначение: Загрузить вещественное число в стек

Команда помещает в стек содержимое источника (32-, 64- или 80-битная переменная или ST(n)). Команда FLD ST(0) делает копию вершины стека.

 

2)

 Команда: FST приемник
 Назначение: Скопировать вещественное число из стека
 Команда: FSTP приемник
 Назначение: Считать вещественное число из стека

Копирует ST(0) в приемник (32- или 64-битную переменную или пустой ST(n) в случае FST; 32-, 64- или 80-битную переменную или пустой ST(n) в случае FSTP). FSTP после этого выталкивает число из стека (помечает ST(0) как пустой).

 

3)

 Команда: FILD источник
 Назначение: Загрузить целое число в стек

Преобразовывает целое число со знаком из источника (16-, 32- или 64-битная переменная) в вещественный формат и помещает в вершину стека.

 


4)

 Команда: FIST приемник
 Назначение: Скопировать целое число из стека
 Команда: FISTP приемник
 Назначение: Считать целое число из стека

Преобразовывает число из вершины стека в целое со знаком и записывает его в приемник (16- или 32-битная переменная для FIST; 16-, 32- или 64-битная переменная для FISTP). FISTP после этого выталкивает число из стека (помечает ST(0) как пустой).

 

5)

 Команда: FXCH приемник
 Назначение: Обменять местами два регистра стека

Обмен местами содержимого регистра ST(0) и приёмника (регистр ST(n)). Если операнд не указан, обменивается содержимое ST(0) и ST(1).


Базовая арифметика FPU

Сопроцессор использует шесть основных типов арифметических команд:

Fxxx Используются ST(1) и ST(0). Первый операнд берется из верхушки стека (источник), второй - следующий элемент стека. Результат выполнения команды записывается в стек.
Fxxx память Источник берется из памяти, приемником является верхушка стека ST(0). Указатель стека ST не изменяется, команда действительна только для операндов с одинарной и двойной точностью.
FIxxx память Аналогично предыдущему типу команды, но операндами могут быть 16- или 32-битовые целые числа.
пр, ист. Fxxx ST, ST(i) Для этого типа регистр ST(i) является источником, а ST(0) - верхушка стека - приемником. Указатель стека не изменяется.
Fxxx ST(i), ST Для этого типа регитр ST(0) является источником, а ST(i) - приемником. Указатель стека не изменяется.
FxxxP ST(i), ST Регистр ST(i) - приемник, регистр ST(0) - источник. После выполнения команды источник ST(0) извлекается из стека.

Строка "xxx" может принимать следующие значения:

ADD Сложение

 

SUB Вычитание

 

SUBR Обратное вычитание, уменьшаемое и вычитаемое

меняются местами

 

MUL Умножение

 

DIV Деление

 

DIVR Обратное деление, делимое и делитель меняются местами

1)

 Команда: FADD приемник,источник
 Назначение: Сложение вещественных чисел
 Команда: FADDP приемник,источник
 Назначение: Сложение вещественных чисел с выталкиванием из стека
 Команда: FIADD источник
 Назначение: Сложение целых чисел

Команда выполняет сложение источника и приемника и помещает результат в приемник. Команда FADDP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды сложения могут принимать следующие формы:

· FADD источник, когда источником является 32- или 64-битная переменная, а приемником — ST(0);

· FADD ST(0),ST(n), FADD ST(n),ST(0), FADDP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

· FADD без операндов — эквивалентно FADD ST(0),ST(1); FADDP без операндов — эквивалентно FADDP ST(1),ST(0);

· FIADD источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).


2)

 Команда: FSUB приемник,источник
 Назначение: Вычитание вещественных чисел
 Команда: FSUBP приемник,источник
 Назначение: Вычитание с выталкиванием из стека
 Команда: FISUB источник
 Назначение: Вычитание целых чисел

Выполняет вычитание источника из приемника и сохраняет результат в приемнике. Команда FSUBP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды вычитания могут принимать следующие формы:

· FSUB источник, когда источником является 32- или 64-битная переменная, содержащая вещественное число, а приемником — ST(0);

· FSUB ST(0),ST(n), FSUB ST(n),ST(0), FSUBP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

· FSUB без операндов — эквивалентно FSUB ST(0),ST(1); FSUBP без операндов — эквивалентно FSUBP ST(1),ST(0);

· FISUB источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).

Если один из операндов — бесконечность, результат — бесконечность соответствующего знака. Если оба операнда — бесконечности одного знака, результат не определен (происходит исключение «недопустимая операция»).

3)

 Команда: FSUBR приемник,источник
 Назначение: Обратное вычитание вещественных чисел
 Команда: FSUBRP приемник,источник
 Назначение: Обратное вычитание с выталкиванием
 Команда: FISUBR источник
 Назначение: Обратное вычитание целых чисел

Команды эквивалентны FSUB/FSUBP/FISUB, но выполняют вычитание приемника из источника, а не источника из приемника.


4)

 Команда: FMUL приемник,источник
 Назначение: Умножение вещественных чисел
 Команда: FMULP приемник,источник
 Назначение: Умножение с выталкиванием из стека
 Команда: FIMUL источник
 Назначение: Умножение целых чисел

Выполняет умножение источника и приемника и помещает результат в приемник. Команда FMULP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды умножения могут принимать следующие формы:

· FMUL источник, когда источником является 32- или 64-битная переменная, а приемником — ST(0);

· FMUL ST(0),ST(n), FMUL ST(n),ST(0), FMULP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

· FMUL без операндов — эквивалентно FMUL ST(0),ST(1); FMULP без операндов — эквивалентно FMULP ST(1),ST(0);

· FIMUL источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).


5)

 Команда: FDIV приемник,источник
 Назначение: Деление вещественных чисел
 Команда: FDIVP приемник,источник
 Назначение: Деление с выталкиванием из стека
 Команда: FIDIV источник
 Назначение: Деление целых чисел

Выполняет деление приемника на источник и сохраняет результат в приемнике. Команда FDIVP после этого выталкивает ST(0) из стека (помечает ST(0) как пустой и увеличивает ТОР на один). Команды могут принимать следующие формы:

· FDIV источник, когда источником является 32- или 64-битная переменная, содержащая вещественное число, а приемником — ST(0);

· FDIV ST(0),ST(n), FDIV ST(n),ST(0), FDIVP ST(n),ST(0), когда источник и приемник заданы явно в виде регистров FPU;

· FDIV без операндов — эквивалентно FDIV ST(0),ST(1); FDIVP без операндов — эквивалентно FDIVP ST(1),ST(0);

· FIDIV источник, когда источником является 16- или 32-битная переменная, содержащая целое число, а приемником — ST(0).


6)

 Команда: FCHS
 Назначение: Изменить знак

Изменяет знак ST(0), превращая положительное число в отрицательное, и наоборот.

7)

 Команда: FRNDINT
 Назначение: Округлить до целого

Округляет значение ST(0) до целого числа в соответствии с режимом округления, заданным битами RC.

8)

 Команда: FSCALE
 Назначение: Масштабировать по степеням двойки

Умножает ST(0) на два в степени ST(1) и записывает результат в ST(0). Выполняет вычисление:

ST(0)= ST(0)*2ST(1).

Значение ST(1) предварительно округляется в сторону нуля до целого числа.

9)

 Команда: F2XM1
 Назначение: Вычисление 2x-1

Команда F2XM1 возводит 2 в степень X, но только если X меньше или равен 1/2, то есть команда возводит 2 в степень, равную ST(0), и вычитает 1. Результат сохраняется в ST(0). Значение ST(0) должно лежать в пределах от -0,5 до 0.5, иначе результат не определен.

 

ST(0)=2ST(0) -1; -0,5<ST(0)<0,5

29,97=29+0,97/2+0,97/2 =29 *20,97/2 *20,97/2

10)

 Команда: FYL2X
 Назначение: Вычисление y*log2(x);

ST(1) = ST(1)*log2(ST(0)), верхний элемент выталкивается из стека.


Константы FPU

 Команда: FLD1
 Назначение: Поместить в стек 1,0
 Команда: FLDZ
 Назначение: Поместить в стек +0,0
 Команда: FLDPI
 Назначение: Поместить в стек число
 Команда: FLDL2E
 Назначение: Поместить в стек log2(e)
 Команда: FLDL2T
 Назначение: Поместить в стек log2(10)

 

Команды управления FPU

 Команда: FSTCW приемник
 Назначение: Сохранить регистр CR
 Команда: FNSTCW приемник
 Назначение: Сохранить регистр CR без ожидания

Команды копируют содержимое CR в приемник (16-битная переменяя). Команда FSTCW, в отличие от FNSTCW, проверяет наличие произошедших и необработанных исключений и обрабатывает их до выполнения.

 

 Команда: FLDCW источник
 Назначение: Загрузить регистр CR
 Процессор:  

Копирует содержимое источника (16-битная переменная) в регистр CR.

 


Пример 3: Сложить два числа (В+С), используя сопроцессор. (real2.asm)

.386

.model flat, stdcall

includelib import32.lib

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

.data

Ttl db "Arifmeticheskoe viragenie",0h

Msg db 10 dup(' '),0h

db 0h

B DW 10

C DW 3

Y dd?

.code

start:

finit

FILD B

FILD C

FADD

fist Y

mov eax,Y

 

xor edi,edi

xor esi,esi

mov si,10

mov edi,9

lp2: xor edx,edx

div esi

xchg eax,edx

add al,'0'

mov byte ptr [Msg+edi],al

xchg eax,edx

dec edi

or eax,eax

jne lp2

 

push 0h

push offset Ttl

push offset Msg

push 0h

call MessageBoxA

push 0h

call ExitProcess

end start

 


Лекция №5. Примеры решения задач. Массивы.

Пример 4. Вычислить 10х =y, x=3. (real4.asm)

1)

2) Величину log210 – можно задать как константу с помощью команды FLDL2T.

3) Команда F2XM1 возводит 2 в степень X, но только если X меньше или равен 1/2, то есть команда возводит 2 в степень, равную ST(0), и вычитает 1. Результат сохраняется в ST(0). Значение ST(0) должно лежать в пределах от -0,5 до 0.5, иначе результат не определен.

4) Команда FSCALE умножает ST(0) на два в степени ST(1) и записывает результат в ST(0). Значение ST(1) предварительно округляется в сторону нуля до целого числа.

5) если х=3, то:

 

.386

.model flat, stdcall

includelib import32.lib

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

.data

Ttl db "Arifmeticheskoe viragenie",0h

Msg db 10 dup(' '),0h

db 0h

X Dd 3

Y dd?

OLD_CW DW?

NEW_CW DW?

 

.code

start:

finit

FILD X; загрузить степень в стек ST(0)

FLDL2T;загрузить константу log2(10) в ST(0)

FMULP ST(1),ST(0); умножение с выталкиванием из стека 3*log210=9.965784284662087

FNSTCW OLD_CW; сохранить регистр CR без ожидания

FWAIT; ожидание готовности FPU

MOV AX,OLD_CW; значения регистра управления сохраняем в АХ

AND AX,NOT 0C00H; ax not 0000 1100 0000 0000=>ax and 1111 0011 1111 1111

OR AX,0400H; ax or 0000 0100 0000 0000

MOV NEW_CW,AX

FLDCW NEW_CW; загрузить регистр CR из NEW_CW

FLD1; загрузить вещественное число 1,0 в стек

FCHS; изменяет знак ST(0), превращая положительное число в

; отрицательное, и наоборот.

FLD ST(1); загрузить вещественное число (x*log2(10)) в стек

FRNDINT; Округляет значение ST(0) до целого числа в соответствии с

; режимом округления, заданным битами RC.

; INT(9.965784284662087)=9

FLDCW OLD_CW; Загрузить регистр CR из OLD_CW

FXCH ST(2); Обмен местами содержимого регистра ST(0) и

; источника ST(2). Если операнд не указан,

; обменивается содержимое ST(0) и ST(1).

FSUB ST(0),ST(2); Вычитание вещественных чисел 9,965784285-9=0.965784285

FSCALE; умножает содержимое ST(0) на 2 в степени,

; содержащейся в ST(1)= -1.

; (1/2=2**(-1))=>0.965784284662087/2

F2XM1; возводит 2 в степень, равную ST(0), и вычитает 1.

; Результат сохраняется в ST(0). Значение ST(0) должно

; лежать в пределах от -0,5 до +0,5, иначе результат не

; определен.

FSUBRP ST(1),ST(0); выполняют вычитание приемника из источника, а не

; источника из приемника.=>0.39754248593736856+1

FMUL ST(0),ST(0); умножение источника ST(0) на приёмник ST(0);

; 2^(0.482892142)*2^(0.482892142)

FSCALE; Умножает ST(0) на два в степени ST(1) и записывает

; результат в ST(0).

FIST Y

mov eax,Y

xor edi,edi

xor esi,esi

mov si,10

mov edi,9

lp2: xor edx,edx

div esi

xchg eax,edx

add al,'0'

mov byte ptr [Msg+edi],al

xchg eax,edx

dec edi

or eax,eax

jne lp2

push 0h

push offset Ttl

push offset Msg

push 0h

call MessageBoxA

push 0h

call ExitProcess

end start


Блок-схема подсчета выражения: y=10x

       
   
 
 

 


Пример №2. Вывести на экран вещественное число, находящееся в регистре сопроцессора ST(0). Порядок числа должен быть только положительным. (real5.asm)

FYL2X – Вычисление у*log2(x), то есть ST(1)*log2(ST(0)), помещает результат в ST(1) и выталкивает ST(0) из стека, так что после этой операции результат оказывается в ST(0). Первоначальное значение ST(0) должно быть неотрицательным. Если регистр ST(0) содержал ноль, результат (если ZM = 1) будет равен бесконечности со знаком, обратным ST(1). Например: 855963.36786=8,55963367Е+5;

Для определения порядка:

.386

.model flat, stdcall

includelib import32.lib

extrn ExitProcess:PROC

extrn MessageBoxA:PROC

.data

Ttl db "Veshestvebboe chiclo",0h

Msg db 23 dup(' '),0h

db 0h

X Dd 855963.36786; 8,55963367Е+5

OLD_CW DW?

NEW_CW DW?

Poryadok DW?

TEN8 DD 100000000

BCD_Mantisa DT?

BCD_Celaya dt?

BCD_Poryadok DT?

.code

start:

finit

FLD X; загрузить вещественное число в стек

FLD1

FXCH ST(1)

FYL2X; ST(1)=1*log2(X)

FLDL2T; поместить в стек log2(10)

Определяем порядок числа Х:  
FXCH

FDIV ST(0),ST(1)

FNSTCW OLD_CW

FWAIT

MOV AX,OLD_CW

AND AX,NOT 0C00H

OR AX,0400H

MOV NEW_CW,AX

FLDCW NEW_CW

FRNDINT; = Poryadok

FLDCW OLD_CW

FIST Poryadok

_________________________________________________________________________

; Блок возведения числа 10 в степень Poryadok. 10Poryadok

FLDL2T; поместить в стек log2(10)

FMULP ST(1),ST(0); 5*log2(10) = 16,60964047

FNSTCW OLD_CW

FWAIT

MOV AX,OLD_CW

AND AX,NOT 0C00H

OR AX,0400H

MOV NEW_CW,AX

FLDCW NEW_CW

FLD1

FCHS

FLD ST(1)

FRNDINT; ST(0)=16

FLDCW OLD_CW

FXCH ST(2)

FSUB ST(0),ST(2)

FSCALE; ST(0)= 1/2*0.60964047

F2XM1; ST(0)=2(1/2*0.60964047) -1;

FSUBRP ST(1),ST(0); ST(0)= 2(1/2*0.60964047)

FMUL ST(0),ST(0); ST(0)= 2(1/2*0.60964047)*2(1/2*0.60964047)

FSCALE; ST(0)= 2(1/2*0.60964047)*2(1/2*0.60964047)*216.

 

__________________________________________________________________________

FLD X; X=855963.36786

FDIV ST(0),ST(1); делим исходное число Х на 10 в степени Poryadok (10Poryadok).

; 855963.36786/105=8,5596336786

FLD ST(0)

 

FNSTCW OLD_CW

FWAIT

MOV AX,OLD_CW

AND AX,NOT 0C00H

OR AX,0400H

MOV NEW_CW,AX

FLDCW NEW_CW;

 

FRNDINT; Округляем для получения целой части 8

FLDCW OLD_CW

FSUB ST(1),ST(0); Выполняем вычитание 8,5596336786-8 =0,5596336786 для

; получения мантиссы.

FXCH

FIMUL TEN8; Умножаем мантиссу на 100000000

; =>0,5596336786*100000000=5596336786. Получаем

; мантиссу как целое число.

FBSTP BCD_Mantisa; Записываем мантиссу как ВСD число в переменную

; BCD_Mantisa

FBSTP BCD_Celaya; Записываем целую часть числа как ВСD число в переменную

; BCD_Celaya

FILD Poryadok; записываем из памяти в стек ST(0) порядок

FBSTP BCD_Poryadok; записываем из стека порядок как BCD число в переменную

; BCD_Poryadok

; __________________________________________________________________________

; Блок вывода на экран значения. Вывод осуществляется справа налево: сначала порядок,

; потом «+», потом Е, потом мантисса, потом «,», потом целая часть.

mov eax,dword ptr [BCD_Poryadok]

xor edi,edi

mov edi,22

lp2: xor edx,edx

mov edx,eax

and edx,0000000Fh; 0000 0101 and 0000 1111 => dl=0000 0101

add dl,'0'

mov byte ptr [Msg+edi],dl

shr eax,4

dec edi

or eax,eax

jne lp2

 

mov byte ptr [Msg+edi],'+'

dec edi

 

mov byte ptr [Msg+edi],'E'

dec edi

 

mov eax,dword ptr [BCD_Mantisa]

lp3: xor edx,edx

mov edx,eax

and edx,0000000Fh

add dl,'0'

mov byte ptr [Msg+edi],dl

shr eax,4

dec edi

or eax,eax

jne lp3

 

mov byte ptr [Msg+edi],','

dec edi

 

mov eax,dword ptr [BCD_Celaya]

lp4: xor edx,edx

mov edx,eax

and edx,0000000Fh

add dl,'0'

mov byte ptr [Msg+edi],dl

shr eax,4

dec edi

or eax,eax

jne lp4

push 0h

push offset Ttl

push offset Msg

push 0h

call MessageBoxA

push 0h

call ExitProcess

end start

 



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 763; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.92.84.253 (0.195 с.)