Консультация № 161001
20.02.2009, 15:48
0.00 руб.
0 3 1
А как можно в TMS320xxx работать с большими числами, можно ли это делать в ассемблере, так как можно сделать в С++ (LINT)? Точнее как вычесляется 2^512, 2^1024?

Обсуждение

Неизвестный
20.02.2009, 15:49
общий
А как можно в TMS320xxx работать с большими числами, можно ли это делать в ассемблере, так как можно сделать в С++ (LINT)? Точнее как вычесляется 2^512, 2^1024?
давно
Посетитель
7438
7205
20.02.2009, 16:19
общий
это ответ
Здравствуйте, Muzaffar Akromov!
Если вопрос только в том, "как вычисляется 2^512, 2^1024", то
число, равное 2 в любой степени, строится очень просто (для случая младший байт первым):
1) обнуляем буфер
2) делим показатель степени на 8 (сдвигом на 3 вправо) - полученное число определяет адрес байта
3) делаем логическое "и" показателя и числа 7 - столько раз сдвигаем единицу влево
4) найденную маску OR-им с байтом по найденному ранее адресу
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
20.02.2009, 18:16
общий
Цитата: Программирование (все языки)-Assembler
нет не факториал типо 2^512, 2^1024 надо вычеслять, а ассемблера как ето вычесляется? ето тоже зависит от параметрах процессора? Например, TMS320vc5402-160: тактовая частота 160МГц, разрядност 40.


2512 это значит Вам нужно такой 512 битный регистр для работы - правильно? А в наличии только 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 превысил разрядность данного регистра.
Это был пример для регистров, при работе с памятью действуете также:
к примеру у Вас есть три участка памяти и четырех-разрядный регистр А
М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
теперь включаем калькулятор переходим в двоичную систему и проверяем.

получилось? но мы заметьте складывали только по 4-е бита и получили 12-ти битный результат, что превышает разрядность нашего процессора
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа