Лекция по программированию

Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция

Краткое описание

Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.

Содержимое работы - 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. Биты кодов условий сопроцессора отображаются (проецируются) на регистр флагов центрального процессора таким образом, чтобы без дополнительных действий, использовать команды условных переходов.

     Например, в следующем фрагменте программы  выполняется переход к метке error, если операнды несравнимы:

.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))=arctg(x/y).

     Перед выполнением команды числа 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).

Управляющие команды

     Управляющие команды предназначены для работы с нечисловыми регистрами сопроцессора. Некоторые команды имеют альтернативные варианты. Мнемоники этих команд могут начинаться с FN или F. Первый вариант соответствует командам "без ожидания". Для таких команд процессор не проверяет, занят ли сопроцессор выполнением команды, то есть бит занятости B не проверяется. Особые случаи также игнорируются.

     Варианты  команд "с ожиданием" действуют  так же, как и обычные команды  сопроцессора.

     Вот список управляющих команд сопроцессора:

  • 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 Установить защищенный режим работы (переводит сопроцессор в защищенный режим работы).

Информация о работе Лекция по программированию