![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Команды пересылки данных FPUСодержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
1)
Команда помещает в стек содержимое источника (32-, 64- или 80-битная переменная или ST(n)). Команда FLD ST(0) делает копию вершины стека.
2)
Копирует ST(0) в приемник (32- или 64-битную переменную или пустой ST(n) в случае FST; 32-, 64- или 80-битную переменную или пустой ST(n) в случае FSTP). FSTP после этого выталкивает число из стека (помечает ST(0) как пустой).
3)
Преобразовывает целое число со знаком из источника (16-, 32- или 64-битная переменная) в вещественный формат и помещает в вершину стека.
4)
Преобразовывает число из вершины стека в целое со знаком и записывает его в приемник (16- или 32-битная переменная для FIST; 16-, 32- или 64-битная переменная для FISTP). FISTP после этого выталкивает число из стека (помечает ST(0) как пустой).
5)
Обмен местами содержимого регистра ST(0) и приёмника (регистр ST(n)). Если операнд не указан, обменивается содержимое ST(0) и ST(1). Базовая арифметика FPU Сопроцессор использует шесть основных типов арифметических команд:
Строка "xxx" может принимать следующие значения:
ADD Сложение
SUB Вычитание
SUBR Обратное вычитание, уменьшаемое и вычитаемое меняются местами
MUL Умножение
DIV Деление
DIVR Обратное деление, делимое и делитель меняются местами 1)
Команда выполняет сложение источника и приемника и помещает результат в приемник. Команда 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)
Выполняет вычитание источника из приемника и сохраняет результат в приемнике. Команда 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)
Команды эквивалентны FSUB/FSUBP/FISUB, но выполняют вычитание приемника из источника, а не источника из приемника. 4)
Выполняет умножение источника и приемника и помещает результат в приемник. Команда 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)
Выполняет деление приемника на источник и сохраняет результат в приемнике. Команда 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)
Изменяет знак ST(0), превращая положительное число в отрицательное, и наоборот. 7)
Округляет значение ST(0) до целого числа в соответствии с режимом округления, заданным битами RC. 8)
Умножает ST(0) на два в степени ST(1) и записывает результат в ST(0). Выполняет вычисление: ST(0)= ST(0)*2ST(1). Значение ST(1) предварительно округляется в сторону нуля до целого числа. 9)
Команда 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)
ST(1) = ST(1)*log2(ST(0)), верхний элемент выталкивается из стека. Константы FPU
Команды управления FPU
Команды копируют содержимое CR в приемник (16-битная переменяя). Команда FSTCW, в отличие от FNSTCW, проверяет наличие произошедших и необработанных исключений и обрабатывает их до выполнения.
Копирует содержимое источника (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
FLD1 FXCH ST(1) FYL2X; ST(1)=1*log2(X) FLDL2T; поместить в стек log2(10)
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; FLDCW OLD_CW FIST Poryadok _________________________________________________________________________
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; просмотров: 835; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.77.240 (0.013 с.) |