Я не могу найти прямой ответ на этот вопрос нигде. Регистры для ARM являются 32-разрядными, я знаю, что LDRB загружает значение размера байта в регистр и обнуляет оставшиеся 3 байта, даже если вы передадите ему значение больше байта, оно просто примет первое значение байта.
Моя программа объединяет C с ARM Assembly. У меня есть переменная extern в C, которая загружается в регистр напрямую.
Однако, если я вызову только LDR для этой байтовой переменной, есть ли гарантия, что он загружает байт и ничего больше, или он загрузит случайные вещи в оставшемся 3-байтовом пространстве из соседних вещей в памяти, чтобы заполнить весь 32-битный регистр?
Я спрашиваю только потому, что я сделал LDR R0, = var и всегда получал правильное значение из вероятно, сто миллионов выполнений (программное обеспечение работало в течение длительного времени и тщательно тестировалось / перекомпилировалось много раз, прежде чем эта проблема была поднята на другой установке).
Однако кто-то другой с другой настройкой (не такой уж другой, компилятор это та же версия, я думаю) успешно скомпилировал код, однако значение, загруженное в R0, было загрязнено случайными битами из окружающей памяти переменной. Они должны были сделать LDRB, чтобы исправить это.
Это компилятор? Может ли он обнаружить это и автоматически переключиться на LDRB? Или мне просто повезло, что окружающая память переменной была просто нулевой из-за некоторой оптимизации?
В качестве примечания, компилятор - ARM G CC 9.2.1