2009-10-12 11 views
6

Tengo un pequeño código ensamblado en línea escrito en mi código C. El asm pasa por una matriz y, si es necesario, mueve los valores de una matriz diferente a un registro. Al final, se llama a una interrupción. El código es similar a esto:Traducir ensamblaje en línea para admitir x64

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 traducirlo todo para soportar x64? No pude encontrar un procedimiento intrínseco al compilador para ejecutar lo que quiero y no puedo entender cómo puedo pasar los parámetros a un archivo de asm externo.

+0

Desde 'int 3h' se utiliza para saltar al depurador, me Diría que la traducción es 'assert (0)'. – avakar

+0

int 3h es solo un ejemplo. También tengo diferentes int, principalmente int 15h. – Eldad

Respuesta

6

Creo que acaba de ver el motivo por el que el ensamblaje en línea es un dolor en el culo: es completamente imposible de usar (y no solo entre arquitecturas, los compiladores a menudo tienen una sintaxis diferente e incompatible). Escriba un archivo de ensamblaje externo y haga lo que necesite de esa manera. Pasar parámetros a rutinas de ensamblaje es exactamente lo mismo que pasarlos a funciones C; solo adelante, declare la firma de su función en algún lugar y el código de llamada (en C) hará lo correcto. Luego implemente la rutina en el archivo de ensamblaje externo (asegúrese de obedecer la convención de llamadas) y exporte el símbolo apropiado para que el vinculador lo vincule todo correctamente. ¡Presto - montaje de trabajo!

Un ejemplo, según lo solicitado. No intenté compilar o probar esto de ninguna manera, por lo que podría 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); 
} 
+0

Todavía no estoy tan familiarizado con el montaje. ¿Me puede dar un código? [Si mi función C fuera: assembleThingy (short shortArr [], char byteArr)] – Eldad

+0

Creo que eso depende casi por completo de la sintaxis de su ensamblador, me temo. –

+0

Depende de la sintaxis de mi ensamblador, pero me diste un buen comienzo. ¡Gracias! – Eldad

Cuestiones relacionadas