Tag: 内联assembly

通过arm c内联汇编程序在内存中操作数组

int smplSize = 48; int Smpl[48]; for(int i = 0; i < smplSize; i++) Smpl[i] = 0x0; Smpl[smplSize-1] = 0x1; int *ptrToSmpl = &Smpl[0]; printf("Sample @%p of Size %i :\n",(void*)ptrToSmpl,smplSize); asm volatile( "@ ————————————————- \n" "@ Invert the sample \n" "@ ————————————————- \n" //"0: \n" "ldr r2,[r3] \n" //"cmp r2,#0x1 \n" //"bne 1f \n" "add […]

gcc内联ARM程序集中的`ldm / stm`

我正在尝试使用内联汇编创建一个ldm ( stm )指令,但是在表达操作数​​方面存在问题(特别是:它们的顺序)。 一件微不足道的事 void *ptr; unsigned int a; unsigned int b; __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 不起作用,因为它可能会将r1和b放入r0 : ldm ip!, {r1, r0} ldm期望寄存器按升序排列(因为它们ldm编码)所以我需要一种方法来说明用于a的寄存器低于b的寄存器。 一个简单的方法是固定分配寄存器: register unsigned int a asm(“r0”); register unsigned int b asm(“r1”); __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 但这会消除很多灵活性,并可能使生成的代码不是最佳的。 gcc(4.8)是否支持ldm/stm特殊约束? 或者,有更好的方法来解决这个问题(例如一些__builtin函数)? 编辑: 因为有建议使用“更高级别”的结构……我想解决的问题是32位32位字的打包(例如输入是8个字,输出是5个字)。 伪代码是 asm(“ldm %[in]!,{ %[a],%[b],%[c],%[d] }” …) asm(“ldm […]