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

Лабораторная работа №4. Тема: перевод чисел из шестнадцатиричной системы исчисления в десятичную и в двоичную.

Программа преобразования двухзначного шестнадцатиричного числа в десятичное изображение на экране с использованием команды xlat. Вход: исходное шестнадцатиричное число, вводится с клавиатуры. Выход: десятичное число на экране.___________________________________________________________

masm

model small

.stack 100h

.data

message db 'Vvedite dve shestnadcatirichnie cifri',13,10,'$'

tabl db 48 dup (0),0,1,2,3,4,5,6,7,8,9,7 dup (0),0ah,0bh,0ch,0dh,0eh,0fh,26 dup (0),0ah,0bh,0ch,0dh,0eh,0fh

;0ah,0bh,0ch,0dh,0eh,0fh,26 dup (0),

;0ah,0bh,0ch,0dh,0eh,0fh

mes2 db '=','$'

otvet1 db 5 dup (0)

.stack 100h

.code

start:

mov AX,@data

mov DS,AX

lea bx,tabl

mov ah,9

mov dx,offset message

int 21h

xor ax,ax

mov ah,1h

int 21h

xlat

mov dl,al

shl dl,4

int 21h

xlat

add al,dl

mov ah,0h

mov cx,ax

xor bx,bx

mov bx,offset otvet1

mov byte ptr [otvet1+6],'$'

mov si,10

mov di,5

lp1: xor dx,dx

div si

xchg ax,dx

add al,'0'

mov byte ptr [otvet1+di],al

xchg ax,dx

dec di

or ax,ax

jne lp1

Vuvod1:

mov dx,offset mes2

mov ah,09h ;Функция Dos вывода сообщения на

int 21h

mov dx,bx

mov ah,09h ;Функция Dos вывода сообщения на

int 21h ;экран

mov AX,4C00h

int 21h

end start

1.Регістри сопроцесору. Регістри даних, регістр станів, регістр керування. Способи округлення дійсних чисел

Регистры сопроцессора

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

Сопроцессор (FPU) предназначен для выполнения операций над вещественными числами.

Восемь регистров данных разрядностью 80 бит организованы в стек. Минимальный размер значения, загружаемого в сопр, - 2 байта/

Регистры данных FPU (Floating Point Unit - арифметический стек) могут быть представлены в следующем виде:

 

Физические номера

80 бит

Относительные номера

1 бит

15 бит

64 бит

Знак

Порядок

Мантисса

0

 

 

mm0

ST(0)

1

 

 

mm1

ST(1)

2

 

 

mm2

ST(2)

3

 

 

mm3

ST(3)

4

 

 

mm4

ST(4)

5

 

 

mm5

ST(5)

6

 

 

mm6

ST(6

7

 

 

mm7

ST(7)

 

 

 

Регистры MMX/3DNow!

Регистры FPU

FPU предоставляет восемь регистров для хранения данных и пять вспомогательных регистров.

Регистры данных (R0 – R7) рассматриваются как стек, вершина которого называется ST(0), а более глубокие элементы — ST(1), ST(2) и так далее до ST(7).

Рис. 13. Регистры FPU

К регистрам R0 – R7 нельзя обращаться напрямую, по именам, но если процессор поддерживает расширение ММХ, то мантиссы, находящиеся в этих регистрах, становятся доступны, как ММ0 – ММ7

Для хранения данных в сопроцессоре предназначены регистры R0-R7. Эти регистры организованы в стек, и доступ к ним производится относительно вершины стека - ST. Номер регистра, соответствующего вершине стека, хранится в регистре состояния (поле TOS). Как и у ЦП, стек сопроцессора растет к регистрам с меньшими адресами. Команды, которые производят запоминание и извлечение из стека, передают данные из текущего регистра ST, а затем производят инкремент поля TOS в регистре состояния. Многие команды сопроцессора допускают неявное обращение к вершине стека, обозначаемой ST или ST(0). Для указания i-го регистра относительно вершины используется обозначение ST(i), где I = 0,:,7. Например, если поле TOS регистра состояния содержит значение 0112 (вершиной стека является регистр R3), то команда FADD ST,ST(2) суммирует содержимое регистров R3 и R5. Стековая организация упрощает программирование подпрограмм, допуская передачу параметров в регистровом стеке сопроцессора.

Младший байт регистра состояния содержит флажки особых случаев сопроцессора: переполнение стека, потеря точности, потеря значащих разрядов, численное переполнение, деление на ноль, денормализация, недействительная операция. Если соответствующий особый случай возник и не был замаскирован (в слове управления), это приведет к генерации центральным процессором особого случая сопроцессора (#16).

Младшее слово регистра управления содержит биты масок особых случаев. Сопроцессор допускает индивидуальное маскирование особых случаев. Если тот или иной особый случай замаскирован, при возникновении соответствующей ситуации сопроцессор выполняет некоторые заранее определенные внутренние действия, которые зачастую приемлемы для большинства применений. Например, если замаскирован особый случай деления на ноль, то выполнение операции 85,32/0 даст результат + .

Старшее слово регистра управления содержит два поля: управление точностью PC (биты 8 и 9) и управление округлением RC (биты 10 и 11). Биты управления точностью можно использовать для понижения точности вычислений. По умолчанию используется расширенная точность (PC = 112), можно также использовать двойную точность (PC = 102) и одинарную точность (PC = 002) по стандарту IEEE-754.

Если результат численной операции не может быть точно представлен в выбранном формате, сопроцессор выполняет округление в соответствии с полем RC (табл. 8.3). По умолчанию RC = 00. В примерах в табл. 7.3 сделана попытка представить числа +2,23 и +2,05 в виде двоичных вещественных чисел с 3-битной дробной частью мантиссы. В этом формате нельзя подобрать точное двоичное значение для этих чисел. Ближайшие к ним представимые числа - +2,00 (+1,000E21) и +2,25 (+1,001E21).

Таблица 8,3

RC

Режим

Пример 1

1,000E21 < 2,23E100 < 1,001E21

-1,001E21 < -2,23E100 < -1,000E21

Пример 2

1,000E21 < 2,05E100 < 1,001E21

-1,001E21 < -2,05E100 < -1,000E21

00

Округление к ближайшему (или четному)

01

Округление вниз (к  )

10

Округление вверх (к +  )

11

Округление к нулю (усечение)

2. Команди пересилки даних FPU. Приклади завантаження в FPU дійсних чисел, та пересилання з FPU в пам’ять дійсних чисел. Приклади використання команди FXCH.

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

1)

 Команда:

FLD источник

 Назначение:

Загрузить вещественное число в стек

Команда помещает в стек содержимое источника (32-, 64- или 80-битная переменная или ST(n)). Команда FLD ST(0) делает копию вершины стека.

2)

 Команда:

FST приемник

 Назначение:

Скопировать вещественное число из стека

 Команда:

FSTP приемник

 Назначение:

Считать вещественное число из стека

Копирует ST(0) в приемник (32- или 64-битную переменную или пустой ST(n) в случае FST; 32-, 64- или 80-битную переменную или пустой ST(n) в случае FSTP). FSTP после этого выталкивает число из стека (помечает ST(0) как пустой).

3)

 Команда:

FILD источник

 Назначение:

Загрузить целое число в стек

Преобразовывает целое число со знаком из источника (16-, 32- или 64-битная переменная) в вещественный формат и помещает в вершину стека.

4)

 Команда:

FIST приемник

 Назначение:

Скопировать целое число из стека

 Команда:

FISTP приемник

 Назначение:

Считать целое число из стека

Преобразовывает число из вершины стека в целое со знаком и записывает его в приемник (16- или 32-битная переменная для FIST; 16-, 32- или 64-битная переменная для FISTP). FISTP после этого выталкивает число из стека (помечает ST(0) как пустой).

5)

 Команда:

FXCH приемник

 Назначение:

Обменять местами два регистра стека

Обмен местами содержимого регистра ST(0) и приёмника (регистр ST(n)). Если операнд не указан, обменивается содержимое ST(0) и ST(1).

FXCH

Обмен данными между регистрами стека

FXCH (EXCHANGE REGISTER) обменивает содержимые текущего ST(0) и первого ST(1) или произвольного ST(i) регистров стека. Команда FXCH допускает два способа кодирования операндов: только с операндом-приемником (FXCH ST(i)) и без операндов (FXCH). Если в команде операнд-приемник не задан, то используется регистр стека ST(1). Команда FXCH проверяет наличие особого случая - "недействительная операция".

3. Арифметичні команди FPU. Приклади використання команди FDIV. Константи FPU. Алгоритм обчислення виразу 10х.

Сопроцессор использует шесть основных типов арифметических команд:

Fxxx

Используются ST(1) и ST(0). Первый операнд берется из верхушки стека (источник), второй - следующий элемент стека. Результат выполнения команды записывается в стек.

Fxxx память

Источник берется из памяти, приемником является верхушка стека ST(0). Указатель стека ST не изменяется, команда действительна только для операндов с одинарной и двойной точностью.

FIxxx память

Аналогично предыдущему типу команды, но операндами могут быть 16- или 32-битовые целые числа.

пр, ист.

Fxxx ST, ST(i)

Для этого типа регистр 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 Обратное деление, делимое и делитель меняются местами

 Команда:

FDIV приемник,источник

 Назначение:

Деление вещественных чисел

 Команда:

FDIVP приемник,источник

 Назначение:

Деление с выталкиванием из стека

 Команда:

FIDIV источник

 Назначение:

Деление целых чисел

Выполняет деление приемника на источник и сохраняет результат в приемнике. Команда 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).

Вычислить 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, то:

Константы FPU

 Команда:

FLD1

 Назначение:

Поместить в стек 1,0

 Команда:

FLDZ

 Назначение:

Поместить в стек +0,0

 Команда:

FLDPI

 Назначение:

Поместить в стек число

 Команда:

FLDL2E

 Назначение:

Поместить в стек log2(e)

 Команда:

FLDL2T

 Назначение:

Поместить в стек log2(10)

  1. Блок-схема розрахунку виразу 10х з використанням сопроцесору. Команда F2XM1. Директива extrn, призначення.

 Команда:

F2XM1

 Назначение:

Вычисление 2x-1

Команда 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

Директива extrn предназначена для объявления некоторого имени внешним по отношению к данному модулю. Это имя в другом модуле должно быть объявлено в директиве public. Директива public предназначена для объявления некоторого имени, определенного в этом модуле, и видимом в других модулях. Синтаксис этих директив следующий:

extrn имя: тип,..., имя: тип

public имя,... ,имя

Здесь имя - идентификатор, определенный в другом модуле. В качестве идентификатора могут выступать:

  • имена переменных, определенных директивами типа db, dw и т. д.;

  • имена процедур;

  • имена констант, определенных операторами = и equ.

Тип определяет тип идентификатора. Указание типа необходимо, для того, чтобы транслятор правильно сформировал соответствующую машинную команду. Действительные адреса будут вычислены на этапе редактирования, когда будут разрешаться внешние ссылки. Возможные значения типа определяются допустимыми типами объектов для этих директив:

  • если имя - это имя переменной, то тип может принимать значения byte, word, dword, pword, fword, qword и tbyte;

  • если имя - это имя процедуры, то тип может принимать значение near или far;

  • если имя - это имя константы, то тип должен быть abs.