LINUX.ORG.RU

Помогите с расчетом CRC8 суммы

 ,


0

2

Поможите люди добрые! Сами мы не местные (не ассемблерщики и вообще не очень умные, как видно).

Есть весы, работающие по протоколу Тензо М. В описании протокола для расчета CRC суммы приведен вот такой код на ассемблерной вставке якобы для C++

BYTE CDeviceTestDlg::CRCMaker(BYTE b_input, BYTE b_CRC)
{
__asm
{
  mov al,b_input
  mov ah,b_CRC
  mov cx,8
mod1:
  rol al,1
  rcl ah,1
  jnc mod2
  xor ah,69h
mod2:
  dec cx
  jnz mod1
  mov b_CRC,ah
}
return b_CRC;

Мать их, 16 битный ассемблер в 2021!!! Да чтоб они так жили.

В эту функцию, насколько я понял, надо подставить байты пакета по очереди и в итоге на последнем байте получится CRC. Как это сделать толком тоже не понятно, но ладно - мне бы сначала просто скомпилировать эту функцию! Подскажите, как вообще при помощи gcc собрать такой код на современной системе?

Что делал. В лоб конечно не собирается. Добавлял .code16, .intel_syntax noprefix - ругается все равно что таких инструкций асма нет.

Пример гарантированно правильных кадров с верной CRC суммой, сдамплено сниффером с фирменной утилиты

0xFF 0x02 0xC3 0xE6 0xFF 0xFF
0xFF 0x01 0xC3 0xE3 0xFF 0xFF

Третий с конца байт - это CRC. 0xFF - разделители, и вот тут вообще не понятно, надо ли их пихать в расчет контрольной суммы. Если кто имеет опыт с протоколом Тензо М, подскажите пожалуйста.

Но основной вопрос - что делать с ассемблерной вставкой.

Ответ на: комментарий от James_Holden

хм, 0 - знакоместо для crc?

если да, то плохие новости, это не очень правильно :) например при без буферной реализации. хотя наверное это не очень актуально, моя функция тоже не будет работать с битстримом, надо переписывать

Morin ★★★★
()
Ответ на: комментарий от Morin

если да, то плохие новости, это не очень правильно :)

Согласен. Ну будут проблемы - переделаю.

James_Holden ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.