Как установить флаг переноса на ARM на 0 или 1?

Я не смог найти учебник о том, как установить флаги для Carry on ARM на 1 или на 0. Может кто-нибудь помочь мне с этим?

1 ответ

Решение

Как и при установке ARM CPU в разных режимах и в linux irqflags.h, установка режима, IRQ и флагов переноса могут выполняться одинаково.

Как правило, макросы, как,

.macro  set_cflag, temp_reg
mrs \temp_reg, cpsr
bic \temp_reg, \temp_reg, #(1<<29)
msr cpsr_f, \temp_reg 
.endm

.macro  clear_cflag, temp_reg
mrs \temp_reg, cpsr
orr \temp_reg, \temp_reg, #(1<<29)
msr cpsr_f, \temp_reg 
.endm

Это три шага,

  1. Прочитайте старое значение.
  2. Обновите флаг в рабочем реестре.
  3. Запишите значение обратно.

Некоторые дополнительные детали - "атомарное" поведение. Т.е. вам может потребоваться отключить прерывания и ошибки памяти и т. Д. Для некоторого пользовательского кода или простого "режима опроса" голого металла вышеприведенное подойдет.

Если вы действительно хотите быть "эффективным"; Глядя на окружающий контекст и известные регистры, вы можете выполнить некоторые инструкции, которые, как вы знаете, установят / сбросят флаг переноса. Например, если R0 равен 0, то adds r0,r0,r0 очистит флаг переноса. Инструкция как eors R0,R0,R0 не будет касаться бита для переноски. Это может зависеть от того, нужно ли вам также знать о других битах NZV. Обозначение "cpsr_f" будет изменять только биты NZCV. Ты можешь использовать msr cpsr_f, #NZCV_bits если вы хотите установить / очистить все это. То есть вас не волнует старая ценность всех этих арочных ограничений. Другие флаги, такие как mode, IRQ и т. Д., Останутся нетронутыми.

Смотрите также:

Другие вопросы по тегам