ЕДИНСТВЕННЫЙ способ ГАРАНТИРОВАТЬ, что компилятор будет делать правильно, - записать ваши загрузки и сохранить подпрограммы на ассемблере и вызывать их из C. 100% компиляторов, которые я использовал за эти годы, могут и будут ошибаться ( GCC включен).
Иногда оптимизатор выводит вас, например, вы хотите сохранить некоторую константу, которая представляется компилятору в виде небольшого числа 0x10, скажем, в 32-битном регистре, о чем вы конкретно спрашивали, и что я наблюдал за другими хорошими компиляторами. стараться сделать. Некоторые компиляторы решат, что дешевле сделать 8-битную запись вместо 32-битной записи и изменить инструкцию. Цели переменной длины инструкции будут усугублять это, поскольку компилятор пытается сэкономить место программы, а не только циклы памяти на том, что он может считать шиной. (xor ax, ax вместо mov eax, 0 например)
И с чем-то, что постоянно развивается, например, с gcc, код, который работает сегодня, не имеет гарантий работы завтра (вы даже не можете скомпилировать некоторые версии gcc с текущей версией gcc). Аналогично, код, который работает на компиляторе на вашем столе, может не работать универсально для других.
Извлеките из этого догадки и эксперименты и создайте функции загрузки и сохранения.
Дополнительным преимуществом этого является то, что вы создаете хороший уровень абстракции, если / когда вы хотите каким-то образом смоделировать свой код или запустить код в пространстве приложения вместо металла или наоборот, функции ассемблера может быть заменен имитируемой целью или заменен кодом, который пересекает сеть с целью с устройством на ней и т. д.