Цитата(sz36 @ May 29 2012, 22:11)

Мамой клянус! :-) Я ассемблер для АРМ не знаю, но вот, к примеру, кусочек кода
Код
IRQDisable PROC
mrs r0, cpsr
orr r0, r0, #0x80
msr cpsr_c, r0
mov pc,lr
ENDP
Мы купили у них пример работы с VideoCapture, там все на С, но один модуль на ассемблере. Используются, собс-но, из этого модуля только 2 ф-ии - IRQDisable и IRQEnable
Уже понятно

, модуль видеозахвата тот самый случай, когда что-то на asm может быть уместно. Я попутал глобальное запрещение прерываний IRQenable с системными InterruptEnable и т.д., которые идут в их либах, так же как и GetCPUId.
А этот запрет по разному можно реализовывать. Коллега просто маскировал отображенные в память регистры контролера прерываний (я правда считал, что глобальная блокировка прерываний не очень оправдана в таких системах).
Правильно было бы использовать intrinsics _enable()/_disable(), если в MS положила их в студию для ARM, как для других ядер.
Если не хочется из-за нескольких строк кода подключать ассемблерный файл, то можно через прямое вложение кода:
Код
inline void _IRQDisable(void)
{
__emit(0xe10f0000);
__emit(0xe3800080);
__emit(0xe121f000);
}
Или набраться наглости и поиспользовать невнятные instrinsics для ARM _ReadStatusReg/_WriteStatusReg:
Код
int CPSR = _ReadStatusReg(0);
CPSR |= 0x80;
_WriteStatusReg(CPSR,0,1);
Результирующий код будет одинаковым.