Лекция по программированию
Лекция, 11 Января 2011, автор: пользователь скрыл имя
Краткое описание
Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.
Содержимое работы - 1 файл
LECTS.DOC
— 893.00 Кб (Скачать файл)Для этого типа регистр 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 - Обратное деление, делимое и делитель меняются местами
Кроме основных арифметических команд имеются дополнительные арифметические команды:
- FSQRT - Извлечение квадратного корня
- FSCALE - Масштабирование на степень числа 2
- FPREM - Вычисление частичного остатка
- FRNDINT - Округление до целого
- FXTRACT - Выделение порядка числа и мантиссы
- FABS - Вычисление абсолютной величины числа
- FCHS - Изменение знака числа
По команде FSQRT вычисленное значение квадратного корня записывается в верхушку стека ST(0).
Команда FSCALE изменяет порядок числа, находящегося в ST(0). По этой команде значение порядка числа ST(0) складывается с масштабным коэффициентом, который должен быть предварительно записан в ST(1). Действие этой команды можно представить следующей формулой:
ST(0) = ST(0) * 2n, где -215 <= n <= +215
В этой формуле n - это ST(1).
Команда FPREM вычисляет остаток от деления делимого ST(0) на делитель ST(1). Знак результата равен знаку ST(0), а сам результат получается в вершине стека ST(0).
Действие
команды заключается в сдвигах
и вычитаниях, аналогично ручному
делению "в столбик". После выполнения
команды флаг C2 регистра состояния
может принимать следующие
- 0 - Остаток от деления, полученный в ST(0), меньше делителя ST(1), команда завершилась полностью
- 1 - ST(0) содержит частичный остаток, программа должна еще раз выполнить команду для получения точного значения остатка
Команда RNDINT округляет ST(0) в соответствии с содержимым поля RC управляющего регистра.
Команда FABS вычисляет абсолютное значение ST(0). Аналогично, команда FCHS изменяет знак ST(0) на противоположный.
Команды сравнения чисел
В центральном процессоре команды условных переходов выполняются в соответствии с установкой отдельных битов регистра флагов процессора. В арифметическом сопроцессоре существуют специальные команды сравнений, по результатам выполнения которых устанавливаются биты кодов условий в регистре состояния:
- FCOM - Сравнение
- FICOM - Целочисленное сравнение
- FCOMP - Сравнение и извлечение из стека
- FICOMP - Целочисленное сравнение и извлечение из стека
- FCOMPP - Сравнение и двойное извлечение из стека
- FTST - Сравнение операнда с нулем
- FXAM - Анализ операнда
Команда FCOM вычитает содержимое операнда, размещенного в оперативной памяти, из верхушки стека ST(0). Результат вычитания никуда не записывается и указатель верхушки стека ST не изменяется.
Обозначим операнд команды сравнения как "x". В следующей таблице приведем значения битов кодов условия после выполнения команды "FCOM x":
- C3 = 0, C0 = 0 - ST(0) > x
- C3 = 0, C0 = 1 - ST(0) < x
- C3 = 1, C0 = 0 - ST(0) = x
- C3 = 1, C0 = 1 - ST(0) и x не сравнимы
Последняя комбинация возникает при попытке сравнения нечисел, неопределенностей или бесконечностей, а также в некоторых других случаях.
Команда FICOM в качестве операндов принимает 16- или 32-разрядные числа, в остальном она аналогична команде FCOM.
Команды FCOMP и FICOMP аналогичны, соответственно, командам FCOM и FICOM, за исключением того, что после выполнения операнд выталкивается из стека.
Команда FCOMPP выполняет те же действия, что и FCOM, но она после выполнения выталкивает из стека оба операнда, участвовавших в сравнении.
Для сравнения операнда с нулем предназначена команда FTST. После ее выполнения коды условий устанавливаются в соответствии со следующей таблицей:
- C3=0, C0=0 - ST(0) > 0
- C3=0, C0=1 - ST(0) < 0
- C3=1, C0=0 - ST(0) = 0
- C3=1, C0=1 - ST(0) и 0 не сравнимы
Команда FXAM анализирует содержимое ST(0). После ее выполнения устанавливаются коды условий, по которым можно судить о знаке числа, о его конечности или бесконечности, нормализованности и так далее.
Бит C1 содержит знак анализируемого числа: 0 - положительный, 1 - отрицательный.
С помощью бита C0 можно определить, является число конечным или бесконечным: 0 - конечное число, 1 - бесконечное.
Для конечных чисел дальнейшая классификация может проводиться по содержимому кодов условий C2 и C3:
- C3=0, C2=0 - Ненормализованное число
- C3=0, C2=1 - Нормализованное число
- C3=1, C2=0 - Нулевое число
- C3=1, C2=1 - Число денормализовано
Аналогично, для бесконечных чисел коды условий C2 и C3 имеют следующие значения:
- C3=0, C2=0 - Нечисло
- C3=0, C2=1 - Бесконечное число
- C3=1, C2=0 - Пустое число
- C3=1, C2=1 - Пустое число
С помощью команды "FSTSW AX" программа может переписать содержимое регистра состояния сопроцессора в регистр AX центрального процессора. Далее содержимое регистра AH можно переписать в регистр флагов центрального процессора при помощи команды SAHF. Биты кодов условий сопроцессора отображаются (проецируются) на регистр флагов центрального процессора таким образом, чтобы без дополнительных действий, использовать команды условных переходов.
Например,
в следующем фрагменте
.286
. . .
fcom
fstsw ax
sahf
je error
Трансцендентные команды
Трансцендентные
команды предназначены для
- тригонометрические (sin, cos, tg,...)
- обратные тригонометрические (arcsin, arccos,...)
- показательные (xy, 2x, 10x, ex)
- гиперболические (sh, ch, th,...)
- обратные гиперболические (arsh, arch, arcth,...)
Вот список всех трансцендентных команд математического сопроцессора:
- FPTAN Вычисление частичного тангенса
- FPATAN Вычисление частичного арктангенса
- FYL2X Вычисление y*log2(x)
- FYL2XP1 Вычисление y*log2(x+1)
- F2XM1 Вычисление 2x-1
- FCOS Вычисление cos(x)
- FSIN Вычисление sin(x)
- FSINCOS Вычисление sin(x) и cos(x) одновременно
Команда FPTAN вычисляет частичный тангенс ST(0), размещая в стеке такие два числа x и y, что y/x = tg(ST(0)).
После выполнения команды число y располагается в ST(0), а число x включается в стек сверху (то есть записывается в ST(1)). Аргумент команды FPTAN должен находится в пределах:
0 <= ST(0) <= pi/4
Пользуясь полученным значением частичного тангенса, можно вычислить другие тригонометрические функции по следующим формулам:
- sin(z) = 2*(y/x) / (1 + (y/x)2)
- cos(z) = (1 - (y/x)2) / (1 + (y/x)2)
- tg(z/2) = y/x;
- ctg(z/2) = x/y;
- cosec(z) = (1 + (y/x)2) / 2*(y/x)
- sec(z) = (1 + (y/x)2) / (1 - (y/x)2)
Где z - значение, находившееся в ST(0) до выполнения команды FPTAN, x и y - значения в регистрах ST(0) и ST(1), соответственно.
Команда
FPATAN вычисляет частичный
z=arctg(ST(0)/ST(1))=
Перед выполнением команды числа x и y располагаются в ST(0) и ST(1), соответственно. Аргументы команды FPATAN должен находится в пределах:
0 < y < x
Результат записывается в ST(0).
Команда FYL2X вычисляет выражение y*log2(x), операнды x и y размещаются, соответственно, в ST(0) и ST(1). Операнды извлекаются из стека, а результат записывается в стек. параметр x должен быть положительным числом.
Пользуясь
результатом выполнения этой команды,
можно вычислить следующим
- Логарифм по основанию два: log2(x) = FYL2(x)
- Натуральный логарифм: loge(x) = loge(2) * log2(x) = FYL2X(loge(2), x) =
= FYL2X(FLDLN2, x)
- Десятичный логарифм: log10(x) = log10(2) * log2(x) = FYL2X (log10(2), x) =
= FYL2X(FLDLG2, x)
Функция FYL2XP1 вычисляет выражение y*log2(x+1), где x соответствует ST(0), а y - ST(1). Результат записывается в ST(0), оба операнда выталкиваются из стека и теряются.
На операнд x накладывается ограничение: 0 < x < 1 - 1/sqrt(2)
Команда F2XM1 вычисляет выражение 2x-1, где x - ST(0). Результат записывается в ST(0), параметр должен находится в следующих пределах: 0 <= x <= 0,5
Команда FCOS вычисляет cos(x). Параметр x должен находится в ST(0), туда же записывается результат выполнения команды.
Команда FSIN аналогична команде FCOS, но вычисляет значение синуса ST(0).
Команда FSINCOS вычисляет одновременно значения синуса и косинуса параметра ST(0). Значение синуса записывается в ST(1), косинуса - в ST(0).
Управляющие команды
Управляющие
команды предназначены для
Варианты команд "с ожиданием" действуют так же, как и обычные команды сопроцессора.
Вот список управляющих команд сопроцессора:
- FNSTCW (FSTCW) Записать управляющее слово (записывает содержимое управляющего регистра в оперативную память).
- FLDCW Загрузить управляющее слово (загружает управляющий регистр данными из оперативной памяти и, как правило, используется для изменения режима работы сопроцессора).
- FNSTSW (FSTSW) Записать слово состояния (записывает содержимое регистра состояния в оперативную память).
- FNSTSW AX (FSTSW AX) Записать слово состояния в AX (записывает содержимое регистра состояния в регистр AX центрального процессора, где возможен анализ содержимого при помощи команд условных переходов).
- FNCLEX (FCLEX) Сбросить особые случаи (сбрасывает флаги особых случаев в регистре состояния сопроцессора, также сбрасываются биты ES и B).
- FNINIT (FINIT) Инициализировать сопроцессор (инициализирует регистр состояния, управляющий регистр и регистр тегов следующим образом:
- Управляющий регистр - Проективная бесконечность, округление к ближайшему, расширенная точность, все особые случаи замаскированы
- Регистр состояния - B=0 (бит занятости сброшен), код условия не определен, ST=ES=0, флаги особых случаев установлены в нуль
- Регистр тегов - Все поля регистра тегов содержат значение 11 (пустой регистр)).
- FNSTENV (FSTENV) Записать среду (записывает в память содержимое всех регистров, кроме численных, в предопределенном формате. Команда полезна при обработке особых случаев).
- FLDENV Загрузить среду (загружает регистры, сохраненные ранее командой FNSTENV. Команда полезна при обработке особых случаев).
- FNSAVE (FSAVE) Записать полное состояние (действует аналогично команде FNSTENV, но дополнительно сохраняет содержимое численных регистров).
- FRSTOR Восстановить полное состояние (действует аналогично команде FLDENV, но дополнительно восстанавливает содержимое численных регистров).
- FINCSTP Увеличить указатель стека SP на 1
- FDECSTP Уменьшить указатель стека SP на 1
- FFREE Освободить регистр (помечает численный регистр ST, указанный в качестве операнда, как пустой, записывая в соответствующее поле регистра тегов значение 11).
- FNOP Холостая команда, нет операции (не производит никаких действий).
- FSETPM Установить защищенный режим работы (переводит сопроцессор в защищенный режим работы).