Если писать код для aarch64 в виде ассемблерных вставок, то при отладке в GDB Dashboard видно, что запись mov x5, #100 задействует только младшие 32 бита, а в оставшихся старших 32 битах остаются прежние значения или значения соседних регистров, либо их прошлые значения
Попробую пояснить суть проблемы иначе. Регистр w5 это 32 битный, x5 это 64 битный. Так вот ассемблерная вставка задействует именно регистры x а значит если я записал туда 5, значит весь регистр должен быть равен 5. У меня же 5 попадет только в младшие 32 бита
В результате этих ложных значений не работают такие инструкции как cmp и прочие условные. Я предполагаю что отладчик GDB не просто так показывает такие значения в регистрах
Инструкции типа sub add и прочие - работают как надо. Но полагаю из за того что в старших 32 битах регистров x лежит какая-то хрень, то именно поэтому не работает нормально инструкция cmp и условные переходы b, точнее они срабатывают, но с одним и тем же результатом, потому что в старших 32 битах регистра неизменно торчит какая то каша
Почему mov x1, #100 не запишет всё биты целевого регистра? Нашел что значения из инструкции берутся от 0 до 4095, но неужели остальные старшие не обнуляются? А как тогда всё обнулить? sub x1, x1, x1???
Прошу помощи, чтобы понять суть проблемы. Могу уточнить и вечером показать примеры, если нужно
aarch64, assembler, gdb