Pull to refresh
50
0
Send message
Математически — да. На практике — нет.
Только вы по факту имеете дело с floating point, а статья про integer'ы ) А у вас один сплошной var ))
На самом деле, сейчас осознал, что в статье ещё не хватает кусочка про остаток от деления.
> нужно сохранить оригинальный буфер нетронутым, потому что нетронутое содержимое при этих условиях как‐то используется

Явно не тот случай. Явно. Поверьте )

Про когорту компиляторов: MS VC, ЕМНИП, заменяет умножением.
Раз у Вас целая компания этим занимается, то может быть вы в курсе, почему никто из отечественных лидеров индустрии не занимается стандартизацией ГОСТов в TLS? По крайней мере об этом в TLS WG нет ни слова за последние годы.
На неё бы целый сегмент памяти ушел! По тем временам роскошь не позволительная )
Вообще интересный случай. Вы его случайно получили, или аналитически вывели?
> но не по таблице
А что тогда вот это?
    mov si,offset table
Да, это компиляторы научились. Речь идет о реверсе компилированных программ, а не писанных ручным асмом )
1,047,552?

Хотя весьма странно выглядит постобработка. Для беззнакового умножения в ней нет нужды.
Дело даже не в противоугонных средствах, а в прошивках ЭБУ. Для многих моделей стоит угонщику только получить доступ к диагразъёму — прощай авто. Видимо, проблема в дырявости этих прошивок, которые выполняют так же и функцию иммобилайзера. Вот и городят потому всякие перепиновки диагразъема.
Знаковый тип там стопудово не нужен, на счёт деления на 256 — сомневаюсь. Девайсу передаётся размер буфера в одном байте, то есть максимум 255.

Вообще даже по ассемблеру видно, что код писан какой-то школотой ) Например, в функции передаётся буфер, в который надо прочитать данные с устройства. Вместо того, чтобы отдать этот же буфер функции, которая коммуницирует с девайсом, коммуницирующей функции отдается локальный буфер на стеке, а после вызова он копируется memcpy() в оригинальный. И драйвер похоже собран без оптимизации даже )
Поэтому я и написал данную статью )
В кратце смотрите: 1/255 нельзя представить в фиксированной точке абсолютно точно. Придется обрезать по какому-то кол-ву разрядов. И останется некий хвост. Так вот этот хвост на самом деле тоже иногда играет роль, но он может сыграть исключительно в виде ±1 для некоторых значений делимого. Вот этот код, который вы процитировали и занимается этим.

Но для целей определения делителя, которая являлось целью данной статьи, это абсолютно не играет роли.
Допустим, в моем случае для любого размер буфера от 255 до 507, я бы всегда в результате данного кода получал 1, будь это деление на 255 или на 254. А мне нужно написать код, который в точности эмулирует поведение оригинала. Как же мне узнать, что в оригинале с помощью дебагера?
Кстати, проверить это довольно просто. Достаточно написать функцию на С и скомпилировать с сохранением листинга ассемблера.
То что это не какая-нибудь хитрая более операция, а деление, я вам гарантирую. Сомнения могут быть только в том, что это 255 )

Цитрованный вами код — это и есть обработка напильником ) На самом деле она такая сложная потому что используется знаковое деление. Когда деление беззнаковое, то оно заменяется беззнаковым умножением, и там работа с результатом гораздо проще и понятнее (и быстрее). Необходимости использовать именно знаковое деление в данном коде абсолютно нет, оно произошло банально от того, что исходный код оперировал int'ами, а не unsigned. Кстати, если будете использовать целочисленное деление на константы (не степени двойки) в своем коде, то имейте ввиду, что беззнаковое будет работать быстрее. При этом упаси Вас Галилей, самому имплементировать такой трюк — это успешно делает любой современный компилятор.

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

Вот здесь немножечко подробнее об этом. При этом прошу обратить внимание, что у автора похоже произошла ошибка и под делителем в некоторых местах надо понимать делимое.
Аудиторский отчет — тоже вполне себе годная отправная точка, если он подписан представителем аудиторской компании и на нём стоит печать, и организация состоит в соотв. СРО или Палатах.

Писать заяву в полицию и в следственный комитет, прилагать заверенные (думаю, что собственноручно сгодится) копии отчета и лицензий компании-аудитора, требовать возбуждать дело. Если есть реквизиты подставных контор, то можно ещё обратиться в УБЭП с просьбой произвести проверку по фактам легализации и обнала.

Вне зависимости от того в какой группе вы находитесь, защищать свои права законными методами и приструнять оборзевших — это дело правильное по всем канонам.

Information

Rating
5,423-rd
Registered
Activity