Цитата(romas2010 @ Jun 6 2012, 18:48)

Добрый день! подскажите,как в тексте программы на С вставить ассемблерную инструкцию.Именно вставить,а не вызвать ассемблерную функцию. Нужно что-то типа оператора inline в Паскале....Пробовал через конструкцию static __asm __inline FUNC()....и через __forceinline и через #pragma inline-компилятор упорно генерит вызов,в окне дизассемблера вижу BL.W func....может все дело в т.н. embrdded assembler для процессоров Cortex M3?
Если строка одна, то можно так:
CODE
AT91C_BASE_PMC->PMC_SCDR = 0x00000001; //Выключить Processor Clock
sbz = 0;
__asm{MCR p15, 0, sbz, c7, c0, 4}
Normal_Power_Mode();
AT91C_BASE_PIOC->PIO_CODR = 0x00000010; //И зажигаем светодиод
А если много строк, то вот так:
CODE
/* computes x/R == x (mod N) via Montgomery Reduction */
void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp)
{
fp_digit *_c, *tmpm, mu;
signed int oldused, x, y, pa;
/* bail if too large */
if (m->used > (FP_SIZE/2)) return;
/* now zero the buff */
memset(gl_c, 0, sizeof gl_c);
pa = m->used;
/* copy the input */
oldused = a->used;
for (x = 0; x < oldused; x++) gl_c[x] = a->dp[x];
MONT_START;
for (x = 0; x < pa; x++){fp_digit cy = 0;
/* get Mu for this round */
LOOP_START;
_c = gl_c + x;
tmpm = m->dp;
y = 0;
for (; y < pa; y++){//INNERMUL;
fp_digit t_h, t_l;
__asm{umull t_l,t_h,mu,*tmpm++
adds t_l,t_l,_c[0]
adc t_h,t_h,0
adds t_l,t_l,cy
adc t_h,t_h,0
mov _c[0],t_l
mov cy,t_h
}
//fp_word t;
//t = ((fp_word)_c[0] + (fp_word)cy) +
// (((fp_word)mu) * ((fp_word)*tmpm++));
//_c[0] = t;
//cy = (t >> 32);
++_c;
}
LOOP_END;
while (cy){PROPCARRY;
++_c;
}
}
/* now copy out */
_c = gl_c + pa;
tmpm = a->dp;
for (x = 0; x < pa+1; x++) *tmpm++ = *_c++;
for (; x < oldused; x++) *tmpm++ = 0;
MONT_FINI;
a->used = pa+1;
fp_clamp(a);
/* if A >= m then A = A - m */
if (fp_cmp_mag (a, m) != FP_LT) s_fp_sub (a, m, a);
}