Traducir ensamblado en línea para apoyar x64
-
20-09-2019 - |
Pregunta
Tengo un pequeño código ensamblador en línea escrita en mi código C. El asm pasa a través de una matriz y, si es necesario, se mueven los valores de una matriz diferente para un registro. En el extremo, una interrupción se llama. El código es similar al siguiente:
cmp arrPointer[2],1h
jne EXIT
mov AX, shortArrPtr[2]
EXIT:
int 3h
Esta todo el trabajo en x86 pero de acuerdo con Microsoft: x64 no admite ensamblado en línea. ¿Cómo puedo traducir todo para apoyar x64? No pude encontrar un procedimiento intrínseca compilador para ejecutar lo que quiero y no puedo imaginar cómo puedo pasar parámetros a un archivo asm externo.
Solución
Creo que acaba de golpear sobre la razón por la cual ensamblado en línea es un dolor en el culo - que es completamente no portables (y no sólo entre las arquitecturas; compiladores a menudo tienen una sintaxis diferentes e incompatibles). Escribir un archivo de ensamblaje externa y hacer lo que necesita de esa manera. Pasando parámetros a las rutinas de montaje es exactamente el mismo que el de pasarlos a las funciones de C; acaba de declarar delante de su firma de función en alguna parte y el código de llamada (en C) va a hacer lo correcto. A continuación, aplicar la rutina en el archivo de ensamblaje externa (asegúrese de obedecer a la convención de llamada) y exportar el símbolo apropiado que el enlazador atar todo correctamente. Presto - ensamblaje de trabajo
Un ejemplo, según lo solicitado. Yo no intento compilar o probar esto de ninguna manera, por lo que puede no ser 100%. Buena suerte.
myHeader.h:
void *someOperation(void *parameter1, int parameter2);
myAssemblyFile.s:
.text
.globl someOperation
someOperation:
add %rdx, %rcx
mov %rcx, %rax
ret
.end
mySourceCode.c:
#include "myHeader.h"
void someFunction(void)
{
void *arg1 = (void *)0x80001000;
int arg2 = 12;
void *returnValue;
printf("Calling with %x %x\n", arg1, arg2);
// call assembly function
returnValue = someOperation(arg1, arg2);
printf("Returned: %x\n", returnValue);
}