Это объясняется в "ARM Architecture Reference Manual" (ARM DDI 0100E):
Бит [27] из CPSR
является липкий переполнения флаг, также известный как Q. Этот флаг установлен в 1, если любой из следующих ситуаций:
- Насыщенность результата сложения в
QADD
или QDADD
инструкции
- насыщение результата вычитания в
QSUB
или QDSUB
инструкции
- насыщение удвоение промежуточного результата в
QDADD
или QDSUB
инструкции
- Подпись перелива во время
SMLA<x><y>
или SMLAW<y>
инструкции
Флаг Q равен липким тем, что после того, как он был установлен в 1, на него не влияют, будут ли последующие вычисления насыщены и/или переполнены. Предполагаемое использование:
- Используйте команду
MSR CPSR_f,#0
, чтобы очистить флаг Q (это также очищает флаги кода условий).
- Формирование последовательности расчетов.
- Используйте инструкцию
MRS Rn,CPSR
для чтения CPSR
, затем проверьте значение флага Q. Если он все еще равен 0, ни один из вышеперечисленных типов насыщения или переполнения не произошел во время шага 2. В противном случае, по крайней мере, один экземпляр stauration или overflow произошел.
Пример:
mov r2,#0x70000000
qadd r3,r2,r2
0x70000000 + 0x70000000
стал бы 0xE0000000
, но так как qadd
насыщается, результат насыщается до 0x7FFFFFFF
(наибольшее положительное 32-разрядное целое число) и флаг Q является задавать.
Спасибо, Майкл. Пример - то, что я искал .. :) – vkulkarni