Дизассемблировал я программу, написанную на gcc. Наткнулся на этот кусок кода. Ребята, помогите разобраться в алгоритме работы. Код (Text): loc_2000AB: add ds:dword_202010, 50h mov ecx, ds:dword_202010 mov eax, 66666667h imul ecx sar edx, 5 mov eax, ecx sar eax, 1Fh sub edx, eax mov eax, edx shl eax, 2 add eax, edx shl eax, 4 sub ecx, eax mov eax, ecx sub ds:dword_202010, eax jmp short loc_20010B
Спасибо _basmp_, но это я понял еще утром. Я до сих пор не понимаю почему eax=2^37 / 80+1, а в целом это примерно, что-то вреде Код (Text): (ds:dword_202010)+=50h (ds:dword_202010)-=(ds:dword_202010)%50h
n0name Вы кажется не поняли, но тот код, который это породил, я уже привел. Мне интересно с какой стати используется вот такая константа (именно с +1), а не что-либо другое. (Для все еще не понявших: Объясните логику оптимизации породившую константу 0х66666667)
n0name Я и без этого разборщика прекрасно справляюсь с дизасмом, просто не понятно зачем используется режим округления (спасибо за подсказку _basmp_, как-то забыл про это) в целых числах. Ну а в целом все понятно. Еще раз спасибо _basmp_. Думаю на этом тему можно закрыть.
max7C4 Это не "дефолтное округление", т.к. шестнадцатиричное 0.6h по дефолту округляется к 0, а не к 1. А константа 66666667h получается по "продвинутому" алгоритму (для знаковых чисел), приведенному в мануале по оптимизации AMD
_basmp_ Че "не" ? "Там" вместо 66666666h юзается 66666667h и спрашивается: почему +1 в младшем разряде, т.к. и в десятичном виде дробная часть = 0.4 < 0.5 и в двоичном 0.(6)h < 0.8h, т.е. по "дефолту" округление должно быть вниз, а не вверх ?