Как мне выполнить бинарное добавление в моде типа в Аде? - PullRequest
4 голосов
/ 06 мая 2011

Очень специфическая проблема здесь ... и нет, это не домашняя работа (оставленная так далеко ... далеко позади). По сути, мне нужно вычислить контрольную сумму для кода, записываемого в EPROM, и я хотел бы написать эту функцию в программе Ada, чтобы попрактиковаться в манипулировании битами на языке.

Раздел файла данных прошивки для EPROM изменен мной, и это изменение требует новой действительной контрольной суммы в конце, чтобы результирующая система приняла измененный код. Эта контрольная сумма начинается с выполнения двоичной суммы по модулю 256 всех данных, которые она покрывает, а затем выполняются другие операции более высокого уровня, чтобы получить контрольную сумму, в которую я не буду вдаваться.

Итак, как мне сделать двоичное добавление для типа мода?

Я предполагал, что если я использую оператор «+» для типа мода, он будет суммирован как целочисленная операция ... результат, который я не хочу. Я действительно озадачен этим. Я не хочу действительно делать упакованный массив и выполнять перенос битов, если мне это не нужно, особенно если это считается «знакомой». Ссылки Я читаю, что вам нужно использовать типы модов, чтобы обеспечить более переносимый код при работе с бинарными операциями. Я хотел бы попробовать это, если это возможно. С помощью этой программы я пытаюсь настроить таргетинг на несколько платформ, поэтому мне нужна мобильность.

Кто-нибудь может подсказать, как я могу выполнить бинарное добавление для типа мода?

Любые начальные места на языке будут очень полезны.

1 Ответ

5 голосов
/ 06 мая 2011

Просто используйте модульный тип , для которого операторы выполняют арифметику без знака.

type Word is mod 2 ** 16; for Word'Size use 16;

Добавление: для модульных типов предопределенные логические операторы работают спобитовая основа.Более того, « бинарные операторы добавления + и - для модульных типов включают в себя окончательное уменьшение по модулю, если результат находится за пределами базового диапазона типа».function Update_Crc является примером.

Приложение: §3.5.4 Целочисленные типы, *19 отмечает, что для модульных типов результаты предопределенные операторы сокращаются по модулю, включая бинарные операторы добавления + и - .Кроме того, функции сдвига в §B.2 Интерфейсы пакетов доступны для модульных типов.Взятые вместе, арифметические, логические и сдвиговые возможности достаточны для большинства побитовых операций.

...