Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
inquisitor
16 / 7 / 17
Регистрация: 22.12.2015
Сообщений: 1,925
1

Сложить два 16 разрядные числа в формате с фиксированной точкой

07.11.2018, 20:38. Просмотров 2413. Ответов 15
Метки нет (Все метки)

первое -2,45
формат 5,11
второе слагаемое 0,428
формат 2,14
формат ответа/результата 4,12
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2018, 20:38
Ответы с готовыми решениями:

Вычислите среднее арифметическое элементов массива. Числа представлены в формате с фиксированной точкой
Вычислите среднее арифметическое элементов массива Array dw 5 dup(?). Числа представленны в формате...

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

Разделить 32 разрядные числа, используя 16 разрядные регистры
мне нужно поделить 32 разрядные числа используя 16 разрядные регистры, я делал деления 16 разрядных...

Задача сложить и вычесть 64-разрядные переменные
Написать код на ассемблере. Даны 64-разрядные переменные x и y. Реализовать операции. //a x+=y...

Даны два числа: одно размером dd, другое dw. Сложить эти числа
Дана задачка на ассемблере помогите сделать, а то совсем не шарю Даны два числа одно размером -...

15
ФедосеевПавел
Модератор
4468 / 2496 / 1008
Регистрация: 01.02.2015
Сообщений: 8,178
07.11.2018, 20:45 2
Я никогда не умел работать с числами в формате "фиксированная запятая". Но принцип тот же, что и с обычными числами, особенно при сложении и вычитании.
Видимо, для начала приводите всё к одному формату 4,12. Т.е. первое число сдвигаете влево на 1, а второе - вправо на 2. Потом обычное add.
1
inquisitor
16 / 7 / 17
Регистрация: 22.12.2015
Сообщений: 1,925
07.11.2018, 22:05  [ТС] 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я никогда не умел работать с числами в формате "фиксированная запятая". Но принцип тот же, что и с обычными числами, особенно при сложении и вычитании.
Видимо, для начала приводите всё к одному формату 4,12. Т.е. первое число сдвигаете влево на 1, а второе - вправо на 2. Потом обычное add.
К 4,12 как привести все числа в этот формат?
Почему первое на 1,а второе на 2 сдвигаем ?
0
ФедосеевПавел
Модератор
4468 / 2496 / 1008
Регистрация: 01.02.2015
Сообщений: 8,178
07.11.2018, 22:11 4
Я не видел вашу методичку. Могу с некоторой степенью достоверности предполагать, что формат 5,11 в первом поле содержит целую часть числа (т.е. -5). А для формата 4,12 нужно расположить целую часть в 4 старших битах. Т.е. (5,11) сдвинуть влево для перехода к (4,12).

Хотя могу и заблуждаться.
1
07.11.2018, 22:11
inquisitor
16 / 7 / 17
Регистрация: 22.12.2015
Сообщений: 1,925
08.11.2018, 00:51  [ТС] 5
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я не видел вашу методичку. Могу с некоторой степенью достоверности предполагать, что формат 5,11 в первом поле содержит целую часть числа (т.е. -5). А для формата 4,12 нужно расположить целую часть в 4 старших битах. Т.е. (5,11) сдвинуть влево для перехода к (4,12).
Хотя могу и заблуждаться.
Медочки нет.Уверен так и есть.
Так?
Assembler
1
2
3
4
 
shr ax,2         ;Логический сдвиг AX на 1 бит вправо
    shr byte[bx],cl  ;Лог. сдвиг байта по адресу BX на СL бит вправо
    shr cl,4         ;CL = CL / 16 (для числа без знака)
Добавлено через 1 час 49 минут
Assembler
1
 mov ax,-2,45;**Error** hello.asm(23) Extra characters on line
0
inquisitor
16 / 7 / 17
Регистрация: 22.12.2015
Сообщений: 1,925
08.11.2018, 14:44  [ТС] 6
формат числа 4,12
Это следует понимать 4 числа может быть до запятой и 12 после запятой то есть вот так?
0004,120000000000
0
ФедосеевПавел
Модератор
4468 / 2496 / 1008
Регистрация: 01.02.2015
Сообщений: 8,178
08.11.2018, 20:41 7
Попробуйте уточнить у преподавателей, сокурсников. Такие вещи, как нетривиальный формат данных, алгоритмы обязательно должны поясняться. В методичках, на семинарах, в лекциях.
1
Ethereal
7347 / 2188 / 298
Регистрация: 17.02.2013
Сообщений: 3,227
09.11.2018, 08:02 8
Цитата Сообщение от scherbakovss201 Посмотреть сообщение
формат числа 4,12
Это следует понимать 4 числа может быть до запятой и 12 после запятой то есть вот так?
4 старших бита отводится под целую часть, 12 младших битов под дробную часть. Всего 16 бит.

Добавлено через 19 минут
0.428 в формате 2,14 будет надо думать 00,01101101100100
Если привести к формату 4,12 то будет 0000,011011011001
2
ФедосеевПавел
Модератор
4468 / 2496 / 1008
Регистрация: 01.02.2015
Сообщений: 8,178
09.11.2018, 09:30 9
scherbakovss201, уточните формат данных, приведите несколько примеров чисел этого формата. Нет гениев, способных предугадать мысли преподавателей. Не нужно в этом плане надеяться на форум с чужими людьми.
1
Ethereal
7347 / 2188 / 298
Регистрация: 17.02.2013
Сообщений: 3,227
09.11.2018, 13:00 10
Лучший ответ Сообщение было отмечено scherbakovss201 как решение

Решение

Да принцип-то известен. Вещественное число представляется как двоичное целое и с ним оперируют как с целым, но при этом между некоторыми разрядами числа мысленно помещается запятая. Которая никак не влияет на рассчеты, она мысленная. Формат 2,14 - это число у которого запятая между 2-мя старшими разрядами и 14-ю младшими.

Добавлено через 33 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      1 0000                     Model   Tiny
      2 0000                     .Code
      3                      Org     100h
      4
      5 0100                 Start:
      6
      7 0100  A1 0110r               mov     ax, x
      8 0103  8B 1E 0112r            mov     bx, y
      9
     10 0107  D1 E0              shl     ax, 1
     11 0109  D1 FB              sar     bx, 1
     12 010B  D1 FB              sar     bx, 1
     13 010D  03 C3              add     ax, bx
     14 010F  C3                 ret
     15
     16 0110  EC67           x       dw      -245 SHL 11 / 100 ; -2,45
     17 0112  1B64           y       dw      428 SHL 14 / 1000 ; 0,428
     18
     19                      End     Start
Результат 1101111110100111 = DFA7 = -2059 (шестнадцатеричное) или с запятой -2,059 (шестнадцатеричное) = -2,022 (десятичное, округлено по правилам арифметического округления).
3
inquisitor
16 / 7 / 17
Регистрация: 22.12.2015
Сообщений: 1,925
10.11.2018, 01:53  [ТС] 11
Цитата Сообщение от Ethereal Посмотреть сообщение
Результат 1101111110100111 = DFA7 = -2059 (шестнадцатеричное) или с запятой -2,059 (шестнадцатеричное) = -2,022 (десятичное, округлено по правилам арифметического округления).
GUI Turbo Assembler чего то в консоль ничего не вывод,хотя компилирует и линкует без ошибок.
Сложить два 16 разрядные числа в формате с фиксированной точкой
0
Ethereal
7347 / 2188 / 298
Регистрация: 17.02.2013
Сообщений: 3,227
10.11.2018, 08:52 12
Так у меня в программе никакого вывода и нет. Только вычисление.

Добавлено через 6 минут
И да, на твоем скриншоте компиляция EXE-программы. А я написал код для COM-программы. При компиляции для tlink нужно /t указывать в параметрах командной строки, чтобы он скомпоновал COM, а не EXE

Добавлено через 2 минуты
Там у тебя на скриншоте для TASM видно using switсh /3 /x /v
А надо еще чтобы для TLINK было using switch /t
2
Mikl___
Автор FAQ
13770 / 6511 / 655
Регистрация: 11.11.2010
Сообщений: 11,737
10.11.2018, 09:59 13
Лучший ответ Сообщение было отмечено scherbakovss201 как решение

Решение

Ethereal,
IMHO, прежде чем складывать числа в формате 5,11 и 2,14 их нужно предварительно перевести в какой-то единый формат, а потом результат сложения выводить в том формате, который требуется по заданию (с минимальной потерей точности)

Добавлено через 36 минут
-2,45 в формате 3,13 -2,45*213=-20070,4~-2007010=B19A
0,428 в формате 3,13 0,428*213=3506,176~350610=0DB2
B19A+0DB2=BF4C=-16564 -16564/213=-2,02197265625
Проверяем: -2,45+0,428=-2,022
3
Mikl___
Автор FAQ
13770 / 6511 / 655
Регистрация: 11.11.2010
Сообщений: 11,737
11.11.2018, 08:52 14
Если интерес не пропал -- посетите страничку всеми признанного эксперта по FPU Raymond Filiatreault, в частности по данному вопросу FIXED POINT MATH
2
Ethereal
7347 / 2188 / 298
Регистрация: 17.02.2013
Сообщений: 3,227
11.11.2018, 09:09 15
Цитата Сообщение от Mikl___ Посмотреть сообщение
их нужно предварительно перевести в какой-то единый формат
Так я и привел к 4,12 . К тому формату в каком нужен ответ. Ну а как привел сложил числа посредством add и получил результат.
1
Mikl___
Автор FAQ
13770 / 6511 / 655
Регистрация: 11.11.2010
Сообщений: 11,737
11.11.2018, 09:14 16
Ethereal,
я не хотел подловить вас на неточности, просто высказал рассуждения общего порядка. Иногда они дают больший эффект, чем пример написанный кем-либо. Просто, извините, если чем-либо задел...
2
11.11.2018, 09:14
StackOverflow
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2018, 09:14

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

Как сложить два числа на masm?
.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include...

Сложить два числа вывести на экран
Такая проблема , складываю 11 и 12 на экран выводит только одно число 3 text segment...


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

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

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