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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top