0 / 0 / 0
Регистрация: 19.04.2018
Сообщений: 17
1
NASM

Подсчет CRC32

09.04.2019, 19:54. Показов 2721. Ответов 14

Доброго времени суток, столкнулся с проблемой реализации подсчета массива с помощью crc32. Была написана функция в ассемблере на насме, которая должна использоваться С++. Программа должна считать контрольную
сумму массива двойных слов. Вот что имею:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SECTION .text
GLOBAL crc32c
; unsigned int crc32c(const char * buf, unsigned long len)
; * buf - rdi
; len - rsi
crc32c:
mov eax, -1 ; начальное заполнение
mov r11, 0 ; индекс массива
.oncemore:
crc32 eax, dword [rdi+r11] ; накопление CRC
inc r11 ; следующий элемент массива
cmp r11, rsi ; конец массива?
jne .oncemore ; нет – еще разок
xor eax, -1 ; инверсия результата
ret
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
extern "C" {
unsigned int crc32c(const char* buf, unsigned long len);
}
int main()
{
unsigned int res = crc32c("1,2,3,4,5,6,7,8,9,0",10);
std::cout<<std::hex<<res<<std::endl;
return 0;
}
В чем проблема?

Добавлено через 18 минут
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
extern "C" {
unsigned int crc32c(const char* buf, unsigned long len);
}
int main()
{
unsigned int res = crc32c("1,2,3,4,5,6,7,8,9,0",19);
std::cout<<std::hex<<res<<std::endl;
return 0;
}
Ошибку исправил в длине массива
Но сути не меняе
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2019, 19:54
Ответы с готовыми решениями:

Подсчет CRC32 из нескольких массивов разной длины
Коллеги, добрый день! Есть задача. Имею несколько массивов байт длиной от 0 до 150. Количество...

Подсчет контрольной суммы файла по CRC32: разобрать код
Здравствуйте. Есть вот этот код, суть его в том, что вбивается название файла, подсчитывается...

аппаратный подсчёт CRC32 в STM32 постоянно выдает ноль
имеется: KEIL 4.53 + ULINK2 + STM32F100C4 пройдено: RM0008, +...

CRC32
Здравствуйте! Мне нужно написать CRC32 в MATLAB Но я что-то не могу понять сам алгоритм CRC...

14
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,245
09.04.2019, 20:49 2
Цитата Сообщение от Vlad_b Посмотреть сообщение
В чем проблема?
Так вы может саму суть проблемы для начала опишите?
Цитата Сообщение от Vlad_b Посмотреть сообщение
unsigned int crc32c
А чему у вас равно sizeof(unsigned int) на платформе x64? И включена ли в компиляторе платформа x64, как основная?

Добавлено через 2 минуты
Цитата Сообщение от Vlad_b Посмотреть сообщение
inc r11
А почему не add r11,4, или не crc32 eax, dword [rdi+r11*4], если у вас элементы типа dword?
1
138 / 101 / 102
Регистрация: 03.02.2014
Сообщений: 425
09.04.2019, 20:56 3
Сразу оговорюсь, я в NASM-е не силён, но увидел очевидную ошибку, вместо строки
Assembler
1
inc r11 ; следующий элемент массива
должно быть следующее
Assembler
1
add r11, 4   ; следующий элемент массива
Почему увеличивать на четыре? потому что элемент массива двойное слово, то есть четыре байта.
1
0 / 0 / 0
Регистрация: 19.04.2018
Сообщений: 17
09.04.2019, 21:08  [ТС] 4
При вводе массива {1,2,3,4,5,6,7,8,9,0} ответ должен получаться d9fbf351, а после того как я исправил
Assembler
1
crc32 eax, dword [rdi+r11*4]
у меня 2f9c2d28. Проблема в этом
0
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,245
09.04.2019, 21:20 5
Цитата Сообщение от Vlad_b Посмотреть сообщение
ответ должен получаться d9fbf351
А это вы как узнали? Полиномы CRC и начальные значения одинаковые используются в инструкции crc32 и при каком-то вашем неизвестном "альтернативном" подсчёте? Зачем вы в конце инвертируете результат?
0
0 / 0 / 0
Регистрация: 19.04.2018
Сообщений: 17
09.04.2019, 21:27  [ТС] 6
В задании имеется такой результат, как проверка правильности работы. Конвертирую в шестнадцатеричную по причине того же задания. На счет увеличения на 4 я предполагал, так как там действительно 4 байта составляет двойное слово, я уже даже до этого пробовал. Но вот как добиться того чтоб получаемый результат был равен ожидаемому, я не знаю. Не понятно в чем дело, второй день сижу ломаю голову и читаю учебники
0
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,245
09.04.2019, 21:40 7
Цитата Сообщение от Vlad_b Посмотреть сообщение
был равен ожидаемому
Для начала выяснить, откуда берётся т.н. "ожидаемый" результат. Без этого любые попытки обречены на провал.
0
4148 / 1803 / 213
Регистрация: 06.10.2010
Сообщений: 4,033
10.04.2019, 05:52 8
В rsi передаётся размер массива в байтах или количество элементов массива?

А тут всё правильно?
Assembler
1
2
3
mov eax, -1 ; начальное заполнение
...
xor eax, -1 ; инверсия результата
0
0 / 0 / 0
Регистрация: 19.04.2018
Сообщений: 17
10.04.2019, 23:09  [ТС] 9
Ну в rsi я предполагаю что должно быть количество элементов массива. На счет начального заполнения я не уверен, но при работе не с dword а с byte это работало. А инверсия результата думаю правильная, ибо dword рассматривает массив в обратном порядке, поэтому наверное надо произвести инверсию. На самом деле я с ассемблером только знакомлючь, пэтому не могу быть уверен во всем
0
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,245
11.04.2019, 02:16 10
Цитата Сообщение от Vlad_b Посмотреть сообщение
ибо dword рассматривает массив в обратном порядке, поэтому наверное надо произвести инверсию
Что за чушь?
0
4148 / 1803 / 213
Регистрация: 06.10.2010
Сообщений: 4,033
11.04.2019, 04:25 11
Ну в rsi я предполагаю что должно быть количество элементов массива.
Может тогда так?
Assembler
1
2
3
4
5
6
7
8
crc32c:
lea rdi,[rdi+rsi*4]
neg rsi                        ; индекс массива
mov eax, -1                    ; начальное заполнение
.oncemore:
  crc32 eax, dword [rdi+rsi*4] ; накопление CRC
  inc   rsi                    ; следующий элемент массива
jne .oncemore                  ; конец массива? нет – еще разок
0
628 / 140 / 57
Регистрация: 08.04.2015
Сообщений: 357
11.04.2019, 06:13 12
Цитата Сообщение от Vlad_b Посмотреть сообщение
Программа должна считать контрольную сумму массива двойных слов.
Цитата Сообщение от Vlad_b Посмотреть сообщение
При вводе массива {1,2,3,4,5,6,7,8,9,0} ответ должен получаться d9fbf351
Взаимоисключающие утверждения. Такой результат получается для массива байтов (а не для строки "1,2,3,4,5,6,7,8,9,0" и не для массива двойных слов). Всё-таки уточните постановку задачи.
1
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
11.04.2019, 17:40 13
Влад, там Лупанов ошибся в своей методичке, вывод должен быть не такой

Добавлено через 28 секунд
Могу тебе скинуть лабораторную, посмотришь там как надо делать
0
Модератор
Эксперт по электронике
7940 / 4040 / 1553
Регистрация: 01.02.2015
Сообщений: 12,490
Записей в блоге: 3
11.04.2019, 18:30 14
чудач, публикуйте здесь и если получится - с разбором ошибки. Может кому в дальнейшем пригодится.

Добавлено через 1 минуту
Даже лучше - с разбором ошибки.
0
2 / 2 / 2
Регистрация: 10.04.2018
Сообщений: 36
11.04.2019, 18:48 15
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Преподаватель неверно указал предполагаемый вывод программы (сегодня это выяснилось), вот вообщем и все
Верный вариант:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 SECTION .text
 GLOBAL crc32d
; unsigned int crc32d(const int * buf, unsigned long len)
; * buf - rdi
; len - rsi
crc32d:
 mov eax, -1 ; начальное заполнение
 mov r11, 0 ; индекс массива
.oncemore:
 crc32 eax, dword [rdi + r11*4] ; накопление CRC
 inc r11 ; следующий элемент массива
 cmp r11, rsi ; конец массива?
 jne .oncemore ; нет – еще разок
 xor eax, -1 ; инверсия результата
 ret
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
extern "C" {
 unsigned int crc32d(const unsigned int* buf, unsigned long len);
}
int main()
{
 unsigned int in_arr[] = {1,2,3,4,5,6,7,8,9,0};
 unsigned int res = crc32c(in_arr, 10);
 std::cout<<std::hex<<res<<std::endl;
 return 0;
}
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2019, 18:48
Помогаю со студенческими работами здесь

Crc32
Мне необходимо защитить 1 процедуру. Для этого я выбрал rcr23. Ну вопрос как это все реализовать?...

Crc32 файла
Добрый день! Я писала программку для вычисления crc32 файла с таблицей значений, но преподу она не...

Crc32 библиотека
Здравствуйте! =) Подскажите, пожалуйста, знатоки! Нужно посчитать crc32 файла. Нашла...

Расчет CRC32
Добрый день! Подскажите, как рассчитать контрольную сумму: printf(&quot;2506000000%04X9001%02X&quot;, c,...

Про CRC32
Народ, кто шарит в CRC, помогите. Прогу надо доделать или переделать, может у кого-нибудь рабочий...

CRC32 + Optmism
Est ideja primenit CRC32 dla oprdelenija izmenalas li zapis v Access. Podskazhite normalnii...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru