2016-11-20 8 views
0

このコードは基本的に配列へのポインタとインデックスの配列の値を変更する関数を含む構造体です0インラインアセンブリを使用して構造体に格納されている配列へのポインタを変更ia32

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

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

私はfunct関数をインラインアセンブリに変換する必要があります。私は以下をやろうとしました

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

しかし、私が出力を印刷すると、情報は同じ値を持ち続けます。 だから私は、次のコード

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]); 
} 

で出力を試してみて、私は位置0でC配列の値を変更するために管理することができますどのように

--P-- 

--P-- 

出力として取得しますか?

+0

を使用することができます - あなたの 'struct'には配列がありません。ポインタは配列ではありません。 'char *'は配列へのポインタではなく 'char'です。 – Olaf

+0

'mov ecx、 'b''は' info'に何も書き込もうとしません。 ecxレジスタに値を代入するだけです。 –

+0

@DavidWohlferdどのように情報の値を変更できますか? – ravelinx

答えて

1

あなたは、 "構造体に含まれる配列を変更し、"

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

またはより良い

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

感謝の男、魅力のように働く – ravelinx

関連する問題