Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прогр.docx
Скачиваний:
23
Добавлен:
21.12.2018
Размер:
2.58 Mб
Скачать

Директива extrn Режимы Ideal, masm

EXTRN определение[,определение].

Указывает, что идентификатор определен в другом модуле. Оп-

ределение описывает идентификатор и имеет следующий формат:

[язык] имя[счетчик_1]:тип[:счетчик_2]

где "язык" задает, что к идентификатору с указанным именем должны

применяться соглашения заданного языка (C, PASCAL, BASIC,

FORTRAN, ASSEMBLER или PROLOG). "Имя" - это идентификатор, кото-

рый определен в другом модуле и за которым может следовать "счет-

чик_1", множитель элемента массива, значение которого по умолча-

нию равно 1. "Тип" должен соответствовать типу идентификатора,

указанному при его определении, и может быть следующим: NEAR,

FAR, PROC, BYTE, WORD, DWORD, DATAPTR, CODEPTR, FWORD, PWORD,

QWORD, TBYTE, ABS или именем структуры. Значение "счетчика_2" за-

дает, сколько элементов определяет данный внешний идентификатор.

Если оно не задается, то по умолчанию равно 1.

Блок-схема подсчета выражения: y=10x

Инициализируется сопроцессор.

Загружаем степень X в стек ST(0): FILD X

Загружаем константу Е=log2(10) в ST(0): FLDL2T

Умножаем константу Е на степень: FMULP ST(1),ST(0)

Сохраняем значение регистра CR для указания способа округления при вычислениях.

Сохраняем значение регистра CR для указания способа округления при вычислениях. Настраиваем регистр CR так, чтобы округления производились к ближайшему числу.

FNSTCW OLD_CW

FWAIT

MOV AX,OLD_CW

AND AX,NOT 0C00H

OR AX,0400H

MOV NEW_CW,AX

FLDCW NEW_CW

Выделяем из степени x*log210 целую часть:

FLD ST(1)

FRNDINT

Вычитаем из степени х*log2(10) целую часть степени для получения дробной части:

FSUB ST(0),ST(2) ; 9.965784284662087-9=0,965784284662087=Р

Делим Р на 2, для того, чтобы воспользоваться командой F2XM1, так как Р>0.5:

FSCALE; ST(0)=Р*2-1=P/2

Для получения результата 2Р/2 отнимаем от ST(0) минус единицу, которая находится в регистре ST(1). Результат в ST(0):

FSUBRP ST(1),ST(0) ; ST(0)=P/2

Умножаем 2Р/2 *2Р/2.= :

FMUL ST(0),ST(0)

Возводим 2 в степень Р/2 для:

F2XM1 ;

Умножаем *29. ST(1)=9:

FSCALE

Записываем полученный результат в переменную Y. Выводим значение переменной Y на экран с помощью функции MessageBoxA.

5. ВСD –числа. Упакований та неупакований формат. Задавання ВСD чисел у програмі. Алгоритм виведення на екран дійсного числа, що зберігається у регістрі ST(0) сопроцесору у форматі ?,*********Е+*.

FBSTP BCD_Mantisa ; Записываем мантиссу как ВСD число в переменную

BCD - сокращение от binary coded decimal,  т.е. двоично кодированное десятичное число. Это когда либо в тетрадах (упакованное BCD), либо в целом байте  (неупакованное BCD) лежит десятичная цифра 0-9. Значения 0ah-0fh - недействительны.  Для выполнения арифметических команд с такими числами есть специальные команды приведения формата опять к BCD 

. Двоично-десятичный кодbinary-coded decimalBCD, 8421-BCD  — форма записи целых чисел, когда каждый десятичный разряд числа записывается в виде его четырёхбитного двоичного кода. Например, десятичное число 31110 будет записано в двоичной системе счисления в двоичном коде как 1 0011 01112, а в двоично-десятичном коде как 0011 0001 0001BCD.