Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/23: Рейтинг темы: голосов - 23, средняя оценка - 5.00
Shamrock
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 5
1

Арифметические операции для чисел с плавающей точкой

24.10.2010, 23:09. Просмотров 4524. Ответов 4
Метки нет (Все метки)

При написании программы возникла проблема с использованием операторов для чисел с плавающей точкой(FADD, FSUB, FMUL etc).
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.8087 ; используются инструкции процессорова 8086 и сопроцессора 8087
.model small
.stack 100h
org 100h
.code; начало сегмента кода
Start:
    finit; инициализация сопроцессора
    fld dword [a];ST(0)=183.5
    fld dword [b];ST(1)=183.5, ST(0)=-83.5
    fadd; сложение a и b
    fst dword [res]; запись результата в переменную Res
    mov AX,4C00h; завершение программы
    int 21h
.data; начало сегмента данных
a dd 183.5; число a
b dd -83.5; число b
res dd ?; переменная для записи результата
END Start
Насколько я понял, результат выполнения операции оказывается в вершине стека. Как видно из кода, сумма должна составить 183.5 + (-83.5) = 100, но в вершине стека оказывается совершенно другой результат. При отладке пробовал вручную менять значения в двух верхних элементах стека и результат получался таким, каким я и хотел бы его видеть. Это подтолкнуло меня на мысль, что я в неправильном формате указываю операнды, или неправильно передаю их в стек. Или может быть я неправильно трактую значение результата? Пробовал задавать значение операндов в двоичном коде(IEEE 754) - безрезультатно. Может быть кто-то знает причину?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2010, 23:09
Ответы с готовыми решениями:

Арифметические действия над числами с плавающей точкой
Дали задание оценить производительность над различными типами данных в АСМ. Первую часть сделал,...

Сложение и вычитание чисел с плавающей точкой
Доброго времени суток. Прошу помочь. Нужно где-то откопать програмку: "Сложение и вычитание чисел...

Использование FPU для вычислений с плавающей точкой
Добрый день! Помогите пожалуйста написать подпрограмму, которая вычисляет значение функции...

Вычитание чисел с плавающей точкой в прямом коде
Надо сделать вычитание чисел с плавающей запятой, действия над мантиссами производится в прямых...

Формат данных с плавающей точкой
Всем прива! Не могу по ассемблеру найти ответ на тему :"Формат данных с плавающей точкой"... если...

4
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
24.10.2010, 23:52 2
Попробовал. На вершине стека оказалось 100.
Какой у вас компилятор? Как смотрели какое там число ?
0
Shamrock
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 5
25.10.2010, 00:35  [ТС] 3
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Попробовал. На вершине стека оказалось 100.
Какой у вас компилятор? Как смотрели какое там число ?
Благодарю за оперативность
Компилятор TASM. Смотрел в дебаггере(TD) через View - > Numeric processor и там это выглядело так:
Assembler
1
fld dword [a];ST(0)=183.5:
Valid ST(0) -1.5990716635229709e+38
Empty ST(1)
Assembler
1
fld dword [b];ST(1)=183.5, ST(0)=-83.5:
Valid ST(0) 8.4098518157302314e-38
Valid ST(1) -1.5990716635229709e+38
Assembler
1
 fadd; сложение a и b:
Valid ST(0) -1.5990716635229709e+38
Empty ST(1)
0
Goodwin98
2523 / 819 / 10
Регистрация: 31.05.2009
Сообщений: 1,672
25.10.2010, 04:51 4
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.8086 ; используются инструкции процессорова 8086 и сопроцессора 8087
.model tiny
.stack 100h
.code; начало сегмента кода
org 100h
Start:
 
        finit; инициализация сопроцессора
        fld [a];ST(0)=183.5
        fld  [b];ST(1)=183.5, ST(0)=-83.5
        fadd; сложение a и b
        fst  [res]; запись результата в переменную Res
        mov AX,4C00h; завершение программы
        int 21h
.data; начало сегмента данных
a dd 183.5; число a
b dd -83.5; число b
res dd ?; переменная для записи результата
END Start
com программа
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.8086 ; используются инструкции процессорова 8086 и сопроцессора 8087
.model small
.stack 100h
.code; начало сегмента кода
Start:
        mov ax,@data
        mov ds,ax
        finit; инициализация сопроцессора
        fld [a];ST(0)=183.5
        fld  [b];ST(1)=183.5, ST(0)=-83.5
        fadd; сложение a и b
        fst  [res]; запись результата в переменную Res
        mov AX,4C00h; завершение программы
        int 21h
.data; начало сегмента данных
a dd 183.5; число a
b dd -83.5; число b
res dd ?; переменная для записи результата
END Start
exe программа
1
Shamrock
0 / 0 / 0
Регистрация: 20.02.2010
Сообщений: 5
28.10.2010, 13:45  [ТС] 5
На com компилятор обиделся по причине наличия в программе сегмента стека. Зато с ехе всё отлично и этого более чем достаточно.
Насколько я понял всё дело было в работе с данными. Чтобы работать с данными необходимо настроить регистр сегмента данных. Для этого необходимо записать адрес сегмента данных @DATA в регистр DS (Data Segment). Из-за особеностей архитектуры записать адрес непосредственно в этот регистр нельзя, поэтому используется регистр AX.
В AX записывается адрес сегмента кода:
Assembler
1
mov ax,@DATA
зетем содержимое AX пересылается в регистр DS:
Assembler
1
mov ds, ax
Теперь регистр DS содержит адрес начала сегмента данных.
Благодарности за быстрое и верное решение
0
28.10.2010, 13:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2010, 13:45

Числа с плавающей точкой на ассемблере
Помогите пожалуйста написать программу на ассемблере для сложения чисел сплавающей точкой.

Представление числа с плавающей точкой
Диапазон значений типа данных signed char от -128 (10000000) до 127 (01111111). Старший разряд...

Двоичное представление числа с плавающей точкой
День добрый, имея 4 байта от float/single средствами языка высокого уровня я могу перевести их в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru