C copia de memoria ensamblado en línea
-
11-09-2019 - |
Pregunta
Estoy tratando de escribir algo de ensamblador en línea en C. Tengo dos matrices como de entrada, lo que necesito es copiar un elemento en array1 en matriz2, y la siguiente es lo que tengo en este momento:
asm (
"movl %0,%%eax;"
"movl %1,%%ebx;"
"movl (%%eax),%%ecx;"
"movl %%ecx,(%ebx);"
"xor %%ecx,%%ecx;"
"movl 4(%%eax),%%ecx;"
//do something on %ecx
"movl %%ecx,4(%ebx);" //write second
:
:"a"(array1),"b"(array2)
);
¿Por qué aparece un fallo de segmentación?
Solución
Su código en línea ensamblador está roto. No se puede utilizar directamente EAX y EBX sin añadir a la lista clobber. De lo contrario, el compilador no ahora, que los registros han sido modificados.
Es muy probable que uno de los registros que ha modificado contenido maldita algo importante que más tarde causó el fallo de segmentación.
Este código se copia un elemento de matriz1 a array2:
asm (
"movl (%0), %%eax \n\t" /* read first dword from array1 into eax */
"movl %%eax, (%1) \n\t" /* write dword into array2
: /* outputs */
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "eax", "memory"
);
Una versión mejor con limitaciones registro adecuado bajaría el EAX duro codificado como esto:
int dummy;
asm (
"movl (%1), %0 \n\t"
"movl %0, (%2) \n\t"
: /* outputs, temps.. */ "=r" (dummy)
: /* inputs */ "r"(array1),"r"(array2)
: /* clobber */ "memory"
);
Por cierto - En general tengo la sensación de que aún no está familiarizado con el ensamblador. La escritura en línea ensamblador es un poco más difícil de conseguir debido a la derecha toda la magia compilador. Le sugiero que comience a escribir algunas funciones simples en ensamblador y los pone en un archivo separado primero .S .. Eso es mucho más fácil ..
Otros consejos
Su mejor opción es el código C:
target_array[target_idx] = source_array[source_idx];
Esto evita fallos de segmentación, siempre que los índices están bajo control.
¿Qué hay de establecimiento de memoria?