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.

¿Fue útil?

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top