Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
LupusEques
0 / 0 / 3
Регистрация: 18.04.2016
Сообщений: 38
#1

Сравнение вещественных чисел - Assembler

16.12.2017, 18:45. Просмотров 182. Ответов 10
Метки нет (Все метки)

Будто бы простая задача: сравнить два действительных числа в стеке, то, которое является меньшим - вытолкнуть. Но почему-то работает некорректно - между 6 и 9 выберет 6 как больше, но между 6 и 4 выберет 4 большим
Assembler
1
2
3
4
5
6
7
8
    getMax:
        fcom st(1)
        ja B_max
        jmp fin
        B_max:
        fstp trash
        fin:
    ret
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2017, 18:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сравнение вещественных чисел (Assembler):

Сравнение вещественных чисел
Помоготе пожалуйста с задачкой. Нужно сравнить 2 вещественных числа и записать...

Деление вещественных чисел в сопроцессоре
Задание: Составить и отладить программу на ассемблере для нахождения результата...

Неточное умножение вещественных чисел
Помогите, пожалуйста! Мне нужно умножить 0.95 на 60 при заданном режиме...

Ассемблерная вставка, деление вещественных чисел
Если числа целого типа, то все нормально работает, а с вещественными всегда...

CMP: Происходит неправильное сравнение вещественных чисел
Дорого времени суток! Написал программу с простейшим ветвлением. Возникла...

Представление вещественных чисел в памяти ЭВМ
Помогите разобраться как представляются вещественные числа в памяти ЭВМ...

10
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
16.12.2017, 22:02 #2
Лучший ответ Сообщение было отмечено LupusEques как решение

Решение

После сравнения fcom нужно поместить флаги сравнения из FPU в CPU.
Есть два способа, в зависимости от древности CPU
Assembler
1
2
3
4
5
                fcom st(1)
                fstsw   ax
                sahf
 
        ja      B_max
Assembler
1
2
3
4
5
6
7
8
FPU_Stat dw ?
..............
                fcom st(1)
                fstsw   FPU_Stat
                mov ax, FPU_Stat
                sahf
 
        ja      B_max
1
LupusEques
0 / 0 / 3
Регистрация: 18.04.2016
Сообщений: 38
16.12.2017, 22:18  [ТС] #3
ФедосеевПавел, второй способ сработал - спасибо
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,449
16.12.2017, 22:25 #4
При работе в masm32 (32-разрядные приложения для Windows) используются процессоры, "понимающие" первый вариант.

Строки 69-74 из Вычислить сумму ряда с заданной точностью
0
Jin X
❗❗ RTFM 👈
3996 / 1140 / 151
Регистрация: 14.12.2014
Сообщений: 2,281
Записей в блоге: 4
Завершенные тесты: 2
17.12.2017, 00:05 #5
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от LupusEques Посмотреть сообщение
второй способ сработал - спасибо
Зачем делать такое извращение, когда первый вариант явно проще и быстрее???

Есть инструкции для .686 (Pentium Pro+), которые записывают результат сразу во флаги: fcomi, fcomip, fucomi, fucomip:
Assembler
1
2
fcomi st,st(1)  ; указывается 2 регистра, первый из которых всегда st, он же st(0)
ja ...
Добавлено через 1 минуту
И вместо вот этого
Цитата Сообщение от LupusEques Посмотреть сообщение
ja B_max
jmp fin
B_max:
Не проще ли написать просто jna fin (он же jbe fin)?
2
LupusEques
0 / 0 / 3
Регистрация: 18.04.2016
Сообщений: 38
17.12.2017, 12:34  [ТС] #6
Цитата Сообщение от Jin X Посмотреть сообщение
Есть инструкции для .686 (Pentium Pro+)
К сожалению - Illegal instruction
0
Jin X
❗❗ RTFM 👈
3996 / 1140 / 151
Регистрация: 14.12.2014
Сообщений: 2,281
Записей в блоге: 4
Завершенные тесты: 2
17.12.2017, 13:44 #7
LupusEques, в TASM этого нет, он слишком древний
Только MASM (UASM). Ну и fasm, NASN, разумеется (без директивы) и пр.
1
proc3nt
волшебник
632 / 494 / 150
Регистрация: 26.05.2012
Сообщений: 1,415
18.12.2017, 03:15 #8
Цитата Сообщение от Jin X Посмотреть сообщение
NASN
оЧепятка
NASM
0
Ol44
703 / 84 / 15
Регистрация: 10.07.2016
Сообщений: 146
18.12.2017, 18:22 #9
Цитата Сообщение от Jin X Посмотреть сообщение
в TASM этого нет, он слишком древний
У меня на Тасме5.1 есть
0
Jin X
❗❗ RTFM 👈
3996 / 1140 / 151
Регистрация: 14.12.2014
Сообщений: 2,281
Записей в блоге: 4
Завершенные тесты: 2
18.12.2017, 23:41 #10
Ol44, а вот это интересно. Я установил TASM 5.4 (типа). По факту же TASM под Windows версии 5.4, а вот для DOS только 4.1. Где брать 5.1 ?
0
Ol44
703 / 84 / 15
Регистрация: 10.07.2016
Сообщений: 146
20.12.2017, 21:36 #11
Я уже сейчас и не найду откуда брал, там с 5.0+ до 5.3 версии от tE!
Откуда 5.4? Но наверно это не сильно важно, главное фишка этих версий для меня это .686 и .mmx
0
20.12.2017, 21:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2017, 21:36
Привет! Вот еще темы с решениями:

Ввести матрицу А вещественных чисел размерности NxN
Ввести матрицу А вещественных чисел размерности NxN.

Массив из вещественных чисел в ассемблерных вставках на FreePascal
Всем привет!=) Пишу программу на ассемблере, возникла проблема с обработкой...

Сравнение чисел
Прошу помощи в решении. Сравнить два числа X и Y. Если они равны, вывести на...

Сравнение 4х чисел
Недавно начала учить ассемблер.Помогите найти ошибку.Если ввожу поочереди...


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

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

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