Странный вывод ассемблера для энергозависимой переменной в ARM - PullRequest
0 голосов
/ 25 января 2020

Я пробовал следующий код в Compile Explorer ( ссылка для кода ), компилятор ARM g cc 8.3.1 и опции -std = gnu ++ 2a -O3

#include <cstdint>
#include <type_traits>

template<std::uint32_t TP_Address, typename TP_Type = bool>
TP_Type foo(){
    return *reinterpret_cast<TP_Type*>(TP_Address);
};

volatile bool b1;
volatile bool b2;

[[noreturn]] int main(void) {
b1 = foo<0x42000000, volatile bool>();

}

и получил следующий результат на панели ассемблера

main:
        mov     r3, #1107296256
        ldrb    r3, [r3]        @ zero_extendqisi2
        ldr     r2, .L2
        and     r3, r3, #255
        strb    r3, [r2]
.L2:
        .word   .LANCHOR0
b1:
b2:

Я не могу понять причину "и операции" с # 255 (0xFF). Фактически, если исключить изменчивый квалификатор, это явно лишнее «и операция» исчезнет, ​​но тогда (как и ожидалось) компилятор оптимизирует код, игнорируя то, что значение склонно к изменению и приводя к неверным результатам в последующих чтениях.

Учитывая, что я точно знаю, что этот указанный c адрес содержит логическое значение (ie, шестнадцатеричное значение равно 0x0 или 0x1), как я могу избавиться от «и операции»?

...