В таких ситуациях надо скомпилировать без оптимизаций (-O0) и проверить поведение. Вполне может быть, что компилятор думает, что некоторые из твоих операций бессмысленны, потому что не влияют ни на что снаружи, и просто их удаляет. Например, если ты пишешь в какой-нибудь регистр, замапленный на память, то указатель, через который ты это делаешь, надо объявить со словом volatile, чтобы компилятор понимал, что это ты не просто байты туда-сюда перекладываешь.
Ещё, конечно, помогает дизассемблировать и посмотреть что оно там делает на самом деле.
Григорий, ох уж эти вечные проблемы дебаг и релиз версий)