В моей процедуре сборки в какой-то момент мне нужно умножить два беззнаковых 32-битных целых числа и вернуть ошибку, если результат слишком велик, чтобы вписаться в 32-битное целое число.ARM - определение того, подходит ли результат умножения в 32 бит
Так я это сделать:
muls r3, r1, r2 @ r1, r2
bcs multiply_error
К сожалению, это не работает, как я ожидал, - я думал, что флаг переноса будет установлен, если результат слишком велик, но когда r1 = 1 и r2 = 1 , флаг переноса также установлен (почему?). Я также попытался проверить флаг переполнения - оказалось, что он не установлен вообще (по крайней мере, в тестах, которые я пробовал: r1 = 1, r2 = 1 и r1 = UINT_MAX, r2 = 2).
Как работают флаги в этом случае? Как проверить, если r1 * r2 соответствует 32-битным?
Справочник по набору инструкций конкретно указывает: «Не влияет на флаг C или V». – Jester
[Обнаружение переполнения из MUL] (https://community.arm.com/processors/b/blog/posts/detecting-overflow-from-mul) –