Поможите люди добрые! Сами мы не местные (не ассемблерщики и вообще не очень умные, как видно).
Есть весы, работающие по протоколу Тензо М. В описании протокола для расчета 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 - разделители, и вот тут вообще не понятно, надо ли их пихать в расчет контрольной суммы. Если кто имеет опыт с протоколом Тензо М, подскажите пожалуйста.
Но основной вопрос - что делать с ассемблерной вставкой.