2016-11-20 4 views
1

私は4行のサンプル全体をリストアップするべきではありませんが(これは宿題の問題ですから)、これをどのように読んで翻訳するのか混乱します。私はこれまで理解してどのようなC.x86-64 Cコードにアセンブル "cmovge"

cmovge %edi, %eax

は、命令の結果が> =である場合の条件付き移動であるということです。関数%ediの最初のパラメータと整数レジスタ%eax(前のアセンブリコード行の他のパラメータ値%esiが割り当てられています)を比較しています。しかし、私はその結果を理解していません。

私の問題は、最適化されたコードを解釈することです。スタックを操作するのではなく、Cでこれを書く方法がわかりません(少なくともgccスイッチで、コンパイル時に同じ結果を生成するために使用することもできます)。

cmovge命令がCコードに変換される可能性のある小さな例を教えてください。独自のコード行として意味をなさない場合は、何かを自由に作ってください。

これは仮想化されたLinuxオペレーティングシステム(CentOS 7)によるx86-64アセンブリです。私はおそらくここにあなたの全体のソリューションを与えている

+0

あなたがinsnの参照マニュアルを読んだ:HTMLはここに抽出します。http://www.felixcloutier .com/x86/CMOVcc.html。 [the x86 tag wiki]の他のリンク(http://stackoverflow.com/tags/x86/info)。 –

答えて

2

gcc -O3 -masm=intel

int doit(int a, int b) { return a >= b ? a : b; } は次のようになります。

doit: 
.LFB0: 
    .cfi_startproc 
    cmp edi, esi 
    mov eax, esi 
    cmovge eax, edi 
    ret 
    .cfi_endproc 
+0

これは今より多くの意味があります、ありがとう!スイッチ '-O3'のおかげで大きな助けになりました! –

+0

'a> = b? b:a; '? –

+2

@ Miharu461(とBjörn):フラグは何から来てもよいことを忘れないでください。 cmovの部分は実際には 'eax = greater? edl:eax'の部分で、 'bool greater'は何でも設定でき、必ずしも' a'や 'b'を必要としません。したがって、 'a = x> = y:b:a'はまだcmovgeにコンパイルできます。 –

関連する問題