Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мпс с 1 по 294.doc
Скачиваний:
13
Добавлен:
16.04.2019
Размер:
6.2 Mб
Скачать

2.4.3. Команды пересылки данных

Команды этой группы реализуют операции загрузки, записи в память, обмена и загрузки | констант (табл. 2.28).

Команды загрузки FLD, FILD, FBLD служат для передачи данных (вещественных чи­сел - real, целых чисел - int, двоично-десятичных чисел - bed) в ST(0) - верхний регистр арифметического стека FPU. Перед загрузкой производится декремент содержимого поля ТОР в регистре состояния FPSR, т. е. вершина стека перемещается на один регистр вверх. При этом проверяется значение тега для регистра, ставшего новой вершиной стека. Если для него значение tag = 11, т. е. этот регистр пустой, то производится его загрузка из адресуемой ячейки памяти или регистра ST(i), номер которого i указан в байте MODR/M команды. После загрузки в поле tag устанавливается код, соответствующий значению поступившего числа. Отметим, что регистр ST(i) после выполнения команды увеличива­ет свой номер на единицу, как и все остальные регистры арифметического стека. Если значение tag = 11, т. е. регистр не пустой, то устанавливается флаг 1Е=1 в регистре FPSR, указывающий на выполнение недействительной операции. Если этот флаг не маскирован, т. е. в регистре FPCR бит маски IM = 0, то загрузка не производится, и реализуется ис­ключение типа #MF («ошибка FPU»). Загружаемые числа, принимаемые в форматах ОТ, ДТ (команда FLD), ЦС, КС, ДЦ (команда FILD), DD (команда FBLD), заносятся в арифме­тический стек в формате РТ.

Команды записи в память FST, FIST используются для передачи содержимого ST(0) в па­мять с преобразованием данных из внутреннего формата РТ в ОТ, ДТ или ЦС, КЦ. При этом значение поля ТОР в регистре FPSR не меняется, т. е. состояние стека сохраняется. Команда FST позволяет также переписать содержимое ST(0) в любой другой регистр стека ST(i).

Команды записи с выталкиванием из стека FSTP, FISTP, FBSTP после передачи содержимого осуществляют инкремент значения ТОР в регистре FPSR. Таким образом, вершина арифметического стека перемещается на один регистр вниз. Для регистра ST(0), служившего старой вершиной стека, устанавливается значение tag = 11 (пусто), т. е. он осво­бождается. Отметим, что регистр ST(i) после команды FSTP также уменьшает свой номер i на единицу, как и остальные регистры стека. Если в этой команде задать ST(i) = ST(0), то выполняется сокращение заполненного стека без сохранения содержимого вершины. В со­ответствии с кодом команды, выбираемые из стека числа преобразуются из формата РТ в форматы ОТ, ДТ (команда FSTP), ЦС, КЦ, ДЦ (команда FISTP), ДЦ (команда FBSTP). При этом производится округление чисел в соответствии со значением поля RC в регистре FPSR. Исключение составляет команда FBSTP, которая независимо от значения RC осуществляет округление путем прибавления числа 0,5 и отбрасывания дробной части.

Если при выполнении команд записи в память регистр ST(0) оказывается пустым, содержит NAN, L и число, выходящее за пределы представления в заданном формате, то устанавлива­ется флаг недействительной операции IE = 1 и реализуется прерывание, если значение мас­ки IM = 0. Если установлена маска IM = 1, то прерывание не выполняется. Для команд FIST, FISTP, FBSTP в этом случае в память заносится код неопределенности, представленный в заданном формате: ЦС, КЦ, ДЦ или ДД (см. табл. 2.26).

Команды FCMOVcc выполняют условную пересылку содержимого регистра ST(i) на вершину стека - в регистр ST(0). В качестве условий пересылки (ее) используются значе­ния ряда признаков в регистре EFLAGS (табл. 2.29). При этом мнемокод условия добавляет­ся в качестве суффикса к мнемокоду команды: например, FCMOVB - команда пересылки при значении признака переноса CF = 1.

Команда FXCH производит обмен содержимым регистров ST(0) и ST(i) арифметического стека. Соответственно изменяются и значения тегов для этих регистров. Если в команде FXCH не указан операнд ST(i), то обмен производится между регистрами ST(0) и ST(1), расположенными в верхней части стека. Значение поля ТОР сохраняется неизменным. Если регистры ST(0), ST(i) пустые, то в них помещается код QNAN (не число), а затем выполняется обмен.

Команды загрузки констант FLDZ, FLD1, FLDPI, FLDL2T, FLDL2T, FLDLG2, FLDLN2 вво­дят в регистр-вершину стека значения чисел + 0.0; + 1.0; р(пи); Iog210, Iog2e, In2, которые хранятся в ПЗУ констант FPU. Эти константы представляются в формате РТ и имеют точность 19 десятичных цифр.