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



ЗНАЕТЕ ЛИ ВЫ?

Округляет значение 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

 

Пример 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

       
   
 
 

 

 


Лабораторная работа №12.



Поделиться:


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

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