Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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 FLD X; загрузить вещественное число в стек 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; = 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; просмотров: 824; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.255.247 (0.009 с.) |