2017-01-22 11 views
-1

アセンブリが初めてで、インラインアセンブリを使用してグラフ用の単純な関数を実装することにしました。コンストラクタは、隣接行列のすべての要素を0に初期化するはずですが、私は私がやったことを理解していない、間違った ビジュアルスタジオのインラインアセンブリに関する問題

struct graph { 
int el[MAX_V][MAX_V]; 
int noVert; 
int noEdges; 
bool directed; 

graph() { 
    _asm { 

    mov  ebx, 0 
    mov  esi, MAX_V 
    mov  edi, this 
START_L1: 
    cmp  ebx, MAX_V 
    je  END_L1 

    mov  ecx, 0 
    START_L2: 
    cmp  ecx, MAX_V 
    je  END_L2 

    mov  eax, ebx 
    imul esi 
    add  eax, ecx 
    mov  [edi + eax*4], dword ptr 0 

    inc  ecx 
    jmp  START_L2; 
    END_L2: 

    inc  ebx 
    jmp  START_L1 
END_L1: 

    } 
} 
} 

私はこの命令が実行された後、私は更新していel配列のint型の要素が非ゼロの値が含まれていることを見つけるデバッガを使用

mov  [edi + eax*4], dword ptr 0 

なぜ私はゲッティですこの命令の後にel配列に配置された非ゼロのint値?私はゼロに設定されるように更新しているインデックスの整数を期待しています。

+2

[動作しません](http://meta.stackexchange.com/q/147616/333362)? – wally

+0

それは動作しません、デバッガでメモリのいくつかの部分をいくつかのランダム変数に置き換えて、それはそれです –

+2

それは何をすべきですか?問題を再現するのに十分な情報を投稿してください。何かをコピーしてビジュアルスタジオに貼り付けることができます。コンパイルとデバッグは、あなたが何を期待しているのか、何を得ているのかで、この質問を簡単に答えることができます。 – wally

答えて

3

修飾子がdword ptrのMicrosoftのIntel構文を使用する場合は、メモリのオペランドにサイズを指定し、即値は指定しないでください。

この行は問題です:

mov  [edi + eax*4], dword ptr 0 

あなたは即値0dword ptrを指定しますが、Microsoftのコンパイラ/アセンブラが0はバイトに収まることを理解するであろうとよう指示を出します:

mov  byte ptr [edi+eax*4], 0 

本当にしたいのは、メモリオペランドの項目のサイズが32ビットのDWORDであることをコンパイラ/アセンブラに伝えることです。これを行うにする命令を変更:各配列要素の唯一の最下位バイトが0


に設定したので、あなたのコードは、配列内のゴミを持っているように見えた

mov  dword ptr [edi + eax*4], 0 

理由がありますこれがあなたにこのようにコードを書いてくれる代物でない限り、実際にはC++コードを使って配列をゼロにする必要があります。また、このコードをより保守しやすく読みやすいものにします。合理的な最適化レベルが使用されている場合、コンパイラーはゼロ化を実行するための効率的なコードを生成できなければなりません。

関連する問題