2012-04-16 15 views
0

こんにちは私は現在、自分でアセンブリをC++で学習しようとしています。私は、私は可能性は、ここで私は、現時点ではそれを持ってどのようにコードであれば、これはentirlyアセンブリする変換を助ける必要がある、ループのためのハイレベルのC++に現在ある私のプロジェクトでアセンブリコードを持っている:アセンブリーのforループをゼロから書く

char temp_char; 
for (int i = 0; i < length; i++){ 
    temp_char = characters [i]; 
    __asm {       
     push eax  
     push ecx 
     movsx ecx,temp_char 
     movsx eax,key 
     push ecx  
     push eax 
     call test 
     add esp, 8 
     mov temp_char,al 
     pop ecx 
     pop eax 
    } 
} 
+0

セマンティクス:[assembly](http://en.wikipedia.org/wiki/Assembly_language)コードではなく[アセンブラ](http://en.wikipedia.org/wiki/Assembly_language)を探していることに注意してください。 #アセンブラ)。アセンブラはアセンブリをバイナリコードに変換するものです... – amit

+0

@amit編集ありがとうございました:) – Paul

+0

なぜコンパイラの結果を単にチェックしていませんか? Visual C++でもC/C++コードをコンパイルした結果からアセンブリ言語ファイルを出力することができます。それが失敗した場合は、結果のバイナリで逆アセンブラを使用してコンパイラから学びます。 – Till

答えて

1

あなたforには3つの部分があります。アセンブリレベルで考えているとき、これらを分けることができます。これを行うための簡単な方法はwhileように再書き込みfor次のとおりです。

char temp_char; 

int i = 0; 
while (i < length) { 
    temp_char = characters [i]; 
    __asm {       
     push eax  
     push ecx 
     movsx ecx,temp_char 
     movsx eax,key 
     push ecx  
     push eax 
     call test 
     add esp, 8 
     mov temp_char,al 
     pop ecx 
     pop eax 
    } 
    i++; 
} 

あなたはかなり簡単にアセンブリにint i=0i++ラインを変換することができるはずです。残っているのはwhileです。 whileの先頭は、通常、条件とジャンプ(またはプラットフォームがそのような操作をサポートしている場合は条件ジャンプ)として実装されます。条件が真であれば、ループに移動します。条件が偽の場合は、ループをスキップします(最後にジャンプします)。 whileの下部は、ループの先頭に無条件にジャンプするだけです。

+0

助けてくれてありがとう、もう少し近づいていますが、少し混乱していますが、そこに着いているのは、学習の本質です。 – Paul

+0

@ Paul-できるだけ基本的なものから始めましょう。できるだけ簡単なループを作成します。おそらく 'for(int i = 0; i <10; ++ i){++ x; } '。すべての最適化を無効にしてコンパイルし、発行されたアセンブリを確認します。デバッガを使用してコードを2回歩く(一度Cレベルでデバッグし、アセンブリレベルでデバッグする)。何回か実際に何回か見たら、何が起きているのかを感じ取るようにしてください。 Cコードと発行されたアセンブリを並べて表示できるデバッガを使用すると、これが簡単になります。 – bta

関連する問題