Консультация онлайн # 161001

Раздел: Assembler
Автор вопроса: Muzaffar Akromov
Дата: 20.02.2009, 15:48 Консультация неактивна
Поступило ответов: 1
А как можно в TMS320xxx работать с большими числами, можно ли это делать в ассемблере, так как можно сделать в С++ (LINT)? Точнее как вычесляется 2^512, 2^1024?
Здравствуйте, Muzaffar Akromov!
Если вопрос только в том, "как вычисляется 2^512, 2^1024", то
число, равное 2 в любой степени, строится очень просто (для случая младший байт первым):
1) обнуляем буфер
2) делим показатель степени на 8 (сдвигом на 3 вправо) - полученное число определяет адрес байта
3) делаем логическое "и" показателя и числа 7 - столько раз сдвигаем единицу влево
4) найденную маску OR-им с байтом по найденному ранее адресу

Лысков Игорь Витальевич

Академик
20.02.2009, 16:19
Нет оценки ответа

Мини-форум консультации # 161001

неизвестный

177121

= общий =    20.02.2009, 15:49
А как можно в TMS320xxx работать с большими числами, можно ли это делать в ассемблере, так как можно сделать в С++ (LINT)? Точнее как вычесляется 2^512, 2^1024?
Зенченко Константин Николаевич

Старший модератор

ID: 31795

177136

= общий =    20.02.2009, 18:16
Цитата: Программирование (все языки)-Assembler

нет не факториал типо 2^512, 2^1024 надо вычеслять, а ассемблера как ето вычесляется? ето тоже зависит от параметрах процессора? Например, TMS320vc5402-160: тактовая частота 160МГц, разрядност 40.



2512 это значит Вам нужно такой 512 битный регистр smile smile smile для работы - правильно? А в наличии только 40 бит - правильно?
Т.к. информации по Вашему микроконтролеру у меня нет. Поэтому буду показать на основе 386-го процессра:
в процессре есть 32-х(еах и т.д.), 16-ти(ах и т.д.) и 8-ми(al и т.д.) битные регистры, и к примеру сложение выглядит так
add eax,ebx(для 32-х бит) просто - правда?
А теперь тоже самое для 16-ти бит:
add ax,bx +
adc dx,cx где(dx:ax=eax, a cx:bx=ebx) после этого в паре регистров dx:ax будет такая информация, что и в регистре eax
теперь о командах:
add - сложение двух регистров А=А+В
adc - сложение двух регистров А=А+В, но с учетом флага переноса CF, т.е получается A=A+B+CF
флаг переноса CF установится в 1 если результат команды add(adc) R,R превысил разрядность данного регистра.
Это был пример для регистров, при работе с памятью действуете также:
к примеру у Вас есть три участка памяти и четырех-разрядный регистр А smile
М1)0000.1110.1101-первое число
М2)0000.1101.1011-второе число
М3)0000.0000.0000-результат
начинаем сложение:
CF=0 сбрасывам флаг.

mov A,M1.0 = М1)0000.1110.1101
adс A, M2.0 = М2)0000.1101.1011
смотрим:
1.1110 - состояние фалга переноса с младшего разряда
0.1101 - первое число
0.1011 - второе число
=====
0.1000 - результат в регистре А
записываем его: т.е. М3)0000.0000.1000
переходим к следующим ячейкам памяти
mov A,M1.1 = М1)0000.1110.1101
adс A, M2.1 = М2)0000.1101.1011
смотрим:
1.1111 - состояние флага перноса с младшего разряда
0.1110 - первое число
0.1101 - второе число
=====
0.1100 - результат в регистре А
записываем результат в память М3)0000.1100.1000
и так далее, для нулей показывать не буду, т.к. очевидно, что результат будет 0.0001
итого получилось М3)0001.1100.1000
теперь включаем калькулятор переходим в двоичную систему и проверяем.
smile
получилось? но мы заметьте складывали только по 4-е бита и получили 12-ти битный результат, что превышает разрядность нашего процессора smile smile smile smile
=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.