2010-12-05 7 views
1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void main() 
{ 
typedef int (FuncPtr)(); 
char asmFunc[] = {0x90, 0xB8, 0x10, 0x00, 0x00, 0x00, 0xC3}; 
FuncPtr *cFunc = malloc(7); 
memmove(cFunc, asmFunc, 7); 
int result = cFunc(); 
printf("result = %d\n", result); 
} 

serait génial si quelqu'un pouvait fixer la partie assembleur sur un PC Core i7 intel parce qu'il résulte d'une erreur de segmentation sur mon ubuntu :)code assembleur dans le programme ac

Est-ce la meilleure façon de mettre le code assembleur en programme ac?

+0

Bien que je ne puisse pas dire si vos opcodes sont corrects, je sais que cela pourrait aussi planter pour d'autres raisons. Savez-vous si la mémoire que vous avez allouée peut être utilisée pour exécuter du code? Habituellement, ce que vous obtenez avec 'malloc' ne peut pas l'être. – detunized

+0

Je n'ai aucune idée :) –

Répondre

4

La meilleure façon de mettre du code d'assemblage dans un fichier source C serait d'utiliser l'assemblage en ligne. Voici un bon starting point. Exemple:

int main(void) 
{ 
int x = 10, y; 

asm ("movl %1, %%eax;" 
     "movl %%eax, %0;" 
    :"=r"(y) /* y is output operand */ 
    :"r"(x) /* x is input operand */ 
    :"%eax"); /* %eax is clobbered register */ 
} 
2

Il est possible de l'écrire sans le typedef, mais jette des pointeurs de fonction sans typedef sont très moche.

int (*testFuncPtr)(void); 

casting à ce pointeur de fonction serait fait à l'aide

(int (*)(void)) 
+0

thx pour la réponse, tout en posant je redis la question désolé –

+1

Vous ne devez pas déréférencer le pointeur de fonction pour appeler la fonction. Les compilateurs d'aujourd'hui sont assez intelligents pour le faire par eux-mêmes - donc vous pouvez simplement appeler 'testFuncPtr();' – ThiefMaster

+0

ok thx j'ai mis à jour le code encore mais en utilisant typedef cela semble plus complexe? Parce que je ne peux pas faire ceci typedef int (* FuncPtr)(); FuncPtr = malloc (7); –

1

Eh bien, il est certainement pas la meilleure façon d'inclure le code de la machine dans votre programme C. Utilisez l'assemblage en ligne. Depuis que vous metnion Ubuntu, je vais mentionner que gcc est parfaitement capable de le faire.

Voir http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html pour un début.

Questions connexes