|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.10.2009, 20:11 | #1 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
большие числа
в общем есть такая задача написать среднее арифметическое длинных чисел используя побитовый сдвиг. Сама программа уже написана но неправильно работает. Число представляется как массив из нескольких элементов. Допустим надо вычислить ср арифм двух элементов 0xffffffff и 1
(0xffffffff+1 ) >> 1 = 0x8000000 но программа дает результат 7fffffff, то есть 0xffffffff >> 1 = 7fffffff я так понимаю 1 не прибавляется Для вычисления используется сложение с учетом cary флага и сдвиг вправо adc и shr программа используется с помощью программы на си , тип элементов unsigned int асемблер 80836 какие есть идеи Последний раз редактировалось NiCola999; 29.10.2009 в 20:19. |
29.10.2009, 20:36 | #2 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
использовать shrd
|
29.10.2009, 21:58 | #3 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
мне кажется сдвиг тут не причем, надо разбираться со сложением
mov eax,0xffffffff mov ebx,1 adc eax,ebx shrd eax,1 выводит ambiguous operand size or operands invalid for 'shrd' Последний раз редактировалось NiCola999; 29.10.2009 в 22:04. |
30.10.2009, 07:02 | #4 | |||
Заснувший
Форумчанин
Регистрация: 13.03.2009
Сообщений: 213
|
Цитата:
в третьей строчке вы используете "сложение с учётом переполнения", при этом до этой команды нет ничего, что может вызвать флаг cary может я жутко не образован, но мне кажется что надо делать примерно так... Цитата:
FFFFFFFF + 1 = 0 + плюс флаг переноса сдвинув число вправо вы всё равно получите 0. следовательно вам нужно использывать простое деление: Цитата:
Последний раз редактировалось Виталий Серов; 30.10.2009 в 07:04. |
|||
30.10.2009, 10:01 | #5 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
угу , но в задаче сказано именно сдвигом
|
30.10.2009, 10:12 | #6 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
угу , но в задаче сказано именно сдвигом
числа представлены в виде массивов, например таких unsigned int a[5] = {1, 0, 0xffffffff, 0xffffffff, 0xffffffff}; unsigned int b[5] = {1, 0, 0, 0, 1}; unsigned int c[5] = {0, 0, 0, 0, 0}; моя прога выдает 1 0 0 7fffffff 0 а правильный ответ 1, 0, 8000000, 0, 0 ф-я должна складывать "в столбик" a и b и после сложения сдвинуть вправо , а флаг cary тут нужен для запоминания единички( ноль пишем один в уме =)) в общем для понимания вот моя программа Код:
Последний раз редактировалось NiCola999; 30.10.2009 в 10:28. |
30.10.2009, 11:33 | #7 |
Форумчанин
Регистрация: 02.04.2008
Сообщений: 358
|
замена сдвига на
Код:
проверьте пример такой на своей программе Код:
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666 mail: airyashov(а)inbox.ru Последний раз редактировалось airyashov; 30.10.2009 в 11:37. |
30.10.2009, 13:14 | #8 |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
rcr как раз выдает то что надо, спасибо. Только вознкла еще одна проблемка
unsigned int a3[5] = {1, 0, 0xffffffff, 0xffffffff, 0xffffffff}; unsigned int b3[5] = {1, 0, 0, 0, 1}; unsigned int c3[5] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}; поидее должен выдать 1 0 80000000 80000000 80000000 но получается так 1 0 80000000 7ffffffff 80000000 массив складывается с конца, тоесть при первом сложении флаг кери должен установиться в 1 т.к переполнение в 0xffffffff+1 след следующий элемент(c[4]) должен быть 0xfffffffff+1 >> 1 = 0x80000000 |
30.10.2009, 13:41 | #9 |
equ asm
Участник клуба
Регистрация: 02.05.2009
Сообщений: 1,605
|
вообще-то rcr изменит флаг CF после себя. Надо бы его как-нибудь обратно вернуть
Можно, для примера, после него поставить bt eax,31. Т.е. если после rcr старший бит в eax = 1, то она установит CF. Вот только я что-то не очень понимаю. Вы считаете среднее арифметическое чисел a и b или отдельных чисел массивов ? И какое значение имеет начальное состояние c3?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4 Последний раз редактировалось Goodwin98; 30.10.2009 в 13:45. |
30.10.2009, 14:00 | #10 | |
Не
Участник клуба
Регистрация: 29.10.2009
Сообщений: 1,456
|
Цитата:
например число 2^96 a = {2^32,2^32,2^32} а какая разница какое состояние c3, я же туда записываю ответ, перетираю старые значения элементов вообще c3 = {0,0,0,0,0} спасибо за bt, всё правильно теперь вопрос пока снят, посмотрим к чему еще придерется препод =) Последний раз редактировалось NiCola999; 30.10.2009 в 14:08. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
поменять большие буквы на маленькие и маленькие на большие в си++ | Барби | Помощь студентам | 4 | 08.04.2008 01:25 |
csv-файл большие числа | nevadimka | Microsoft Office Excel | 1 | 14.03.2008 10:25 |
Большие числа | Лубышев | Помощь студентам | 6 | 27.02.2008 22:57 |
Большие комплексные числа | xoz | Общие вопросы Delphi | 0 | 24.02.2008 03:12 |