Приветствую...новичок на этом форуме, если что упущу - сильно не пинайте...
по ряду причин пришлось заняться реверсом мелкомягкой библиотеки компрессии файлов для WinCE...опыта в реверсе не то, чтобы много, но набираюсь...столкнулся со следующей ситуацией...
имеем дизассемблированный IDA кусок функции, назовем ее CompressBlock:
тут мы четко видим, что в стеке переменные v10 и v11 идут друг за другом: [ebp+var_4] и [ebp+var_8]. Т.к. в VS я не нашел, как отображать смещения в стеке, то сравнил по адресам: [ebp+var_8] = 0054EDEC, [ebp+var_4] = 0054EDF0. Разница - 4 байта.
В функции LZInitialize метод qmemcpy перемещает 8 байт (8u) с адреса переменной v10 (&v10) по адресу первого аргумента функции. Соответственно перемещаются переменные v10 и v11 (т.к. они оба int и имеют размерность 4 байта).
теперь смотрим, как HexRays декомпилировал это место:
в принципе, все нормально...но вот, что происходит, когда этот код компилирует VS:
и вроде все нормально, кроме того, что разница между адресами - [v11] = 0x0029E9A0, [v10] = 0x0029E998 - 8 байт! И когда метод qmemcpy в функции LZInitialize перемещает 8 байт с адреса переменной v10, то перемещается только переменная v10 и пустота за ней...
вопрос: как обойти такую ситуацию? почему VS помещает переменные в стек не друг за другом, как описано в коде? можно на это как-то повлиять настройками компилятора?