2016-11-20 1 views
0

J'ai donc ce code dans C, en gros, une structure qui contient un pointeur vers un tableau et une fonction qui change la valeur du tableau dans l'index 0Modifier le pointeur vers un tableau contenu dans une structure utilisant l'assemblage en ligne ia32

typedef struct archivo 
{ 
    unsigned char *info; 
} FILE; 

void funct(FILE *arch) { 
    arch->info[0] = 'b'; 
} 

Je dois donc traduire la fonction funct en assemblage en ligne. J'ai essayé de faire ce qui suit

void funct(FILE *arch) { 
    _asm { 
    mov eax, 0 
    mov ebx, arch.info[eax] 
    mov ecx, [ebx] 
    mov ecx, 'b' 
    } 
} 

Mais lorsque j'imprime la sortie, l'information continue d'avoir la même valeur. J'essaie donc la sortie avec le code suivant

void funct(ARCHIVO *arch) 
{ 
    printf("\n--%c--\n", arch->info[0]); 

    _asm { 
     mov eax, 0 
     mov ebx, arch.info[eax] 
     mov ecx, [ebx] 
     mov ecx, 'b' 
     } 

    printf("\n--%c--\n", arch->info[0]); 
} 

et je reçois en tant que sortie

--P-- 

--P-- 

Comment puis-je gérer pour modifier la valeur du tableau C en position 0?

+0

"tableau de changement qui est contenu dans une struct" - Il n'y a pas dans votre tableau 'struct'. Un pointeur n'est pas un tableau. Et 'char *' n'est pas un pointeur sur array, mais sur 'char'. – Olaf

+0

'mov ecx, 'b'' n'écrira rien à' info'. Il va juste assigner une valeur au registre ecx. –

+0

@DavidWohlferd comment puis-je changer la valeur de l'info? – ravelinx

Répondre

1

vous pouvez utiliser

void funct(FILE *arch) { 
    _asm{ 
     mov eax, arch 
     mov eax,[eax]archivo.info 
     mov byte ptr [eax],'b' 
    } 
} 

ou mieux

__declspec(naked) void __fastcall funct2(FILE * /*arch*/) { 
    _asm{ 
     mov eax,[ecx]archivo.info 
     mov byte ptr [eax],'b' 
     ret 
    } 
} 
+0

merci l'homme, fonctionne comme un charme – ravelinx