2016-05-15 19 views
0

構造体を持つ配列を作成しました。配列とその配列へのポインタを使用して配列から構造体を取得する必要があります。x86アセンブリ - 構造体を持つ配列から構造体を取得

struct T{ 
    char a, b, c, d, e, f, g; 
}; 

T CtiPrvekPole1(T *pole, int index){ 
    T result; 
    _asm{ 
     mov eax, pole; 
     mov ebx, index; 
     mov eax, [eax + ebx * 8]; 
     mov result, eax; 
    } 
    return result; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    T struct1, struct2, struct3, struct4; 

    struct1.a = 1; 
    struct1.b = 2; 
    struct1.c = 3; 
    struct1.d = 4; 
    struct1.e = 5; 
    struct1.f = 6; 
    struct1.g = 7; 

    struct2.a = 8; 
    struct2.b = 9; 
    struct2.c = 10; 
    struct2.d = 11; 
    struct2.e = 12; 
    struct2.f = 13; 
    struct2.g = 14; 

    struct3.a = 15; 
    struct3.b = 16; 
    struct3.c = 17; 
    struct3.d = 18; 
    struct3.e = 19; 
    struct3.f = 20; 
    struct3.g = 21; 

    struct4.a = 22; 
    struct4.b = 23; 
    struct4.c = 24; 
    struct4.d = 25; 
    struct4.e = 26; 
    struct4.f = 27; 
    struct4.g = 28; 

    T pole1[] = { struct1, struct2, struct3, struct4 }; 

    T result = CtiPrvekPole1(pole1, 2); 
    printf("Cti prvek pole1 : %c\n", result.b); 

} 

どのように構造体を取得する必要がありますか?私は8バイトを使用しました。なぜなら、1つの構造に7バイトがあるため、それは8バイトのアライメントでなければなりません。私は正しい?

ありがとうございました。

答えて

0

あなたの考えは正しいが、あなたのコードは間違っている。あなたは持っている:

T CtiPrvekPole1(T *pole, int index){ 
    T result; 
    _asm{ 
     mov eax, pole; 
     mov ebx, index; 
     mov eax, [eax + ebx * 8]; 
     mov result, eax; 
    } 
    return result; 
} 

だからresultによって占められていますメモリの最初の4バイトにアドレス(ポインタ)を移動しています。データを移動する必要があります。それを行うため

Cコードは次のようになります

T result; 
result = pole[index]; 
return result; 

をコピーresultpole[index]でアレイから8バイト、及び、結果を返します。

実際、CtiPrvekPole1メソッドは必要ありません。

T pole1[] = { struct1, struct2, struct3, struct4 }; 
T result = pole1[2]; 

実際にアセンブリ言語でやりたい場合は、送信元と宛先のアドレスを取得してコピーする必要があります。これを行う方法は次のとおりです。

T CtiPrvekPole1(T *pole, int index){ 
    T result; 
    _asm{ 
     mov eax, pole; 
     mov ebx, index; 
     mov ecx, [eax + ebx * 8]; // ecx = source address 
     lea edx, result   // edx = destination address 
     // copy first four bytes 
     mov eax, [ecx] 
     mov [edx], eax 
     // copy next four bytes 
     mov eax, [ecx+4] 
     mov [edx+4], eax 
    } 
    return result; 
} 
関連する問題