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

Главное, компилируется.
Ты получил 16-битный код в своем 64-битном бинарнике.
А дальше ты уже поправишь.

bigbit ★★★★★
()
Последнее исправление: bigbit (всего исправлений: 1)
Ответ на: комментарий от James_Holden

В первых двух строках перепутан порядок операндов, если поправить, тогда всё приблизительно работает (на самом деле нет, с gcc -O2 становится заметно, как оно ломается: метки должны быть локальными, и constraints на регистрах надо усилить, чтоб оно не пыталось генерировать mov %dil, %ah, и ещё clobbered-регистры прописать, которые в нашей ситуации, к счастью, ничего не ломают, но это чистое везение).

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

То есть, -O2 оптимизирует и ассемблерные вставки тоже? Я честно думал что нет, а если так, то лично мне лучше с этим не связываться и делать на C, даже если припрет.

Глубоко изучать ассемблер я не готов по роду своих задач.

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

Нет, -О2 делает больно по-другому. Он влияет на то, что происходит «на стыке» ассемблерных вставок и окружающего кода (в данном примере он пытается достать аргумент из регистра %dil, который внезапно нельзя взять и переложить в %ah), ну и на то, что код повторится столько раз, сколько содержащая функция заинлайнится (или там при loop unroll тоже; в данном примере от этого возникает проблема с нелокальными метками, которые не имеют права повторяться).

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