1

私は次のアセンブリコードを見つけましたが、それが何をしているのかわかりません(主にcmovgがmovl命令に従うため):

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movl %edx, %eax
sarl $31, %eax
testl %edx, %edx
movl $1, %edx
cmovg %edx, %eax
popl %ebp
ret

これが私がこれまでに解釈した方法です:スタックにプッシュします

新しいポインタ(スタックポインタ)は、ベースポインタと同じ場所を指すように作成されます

入力を取得します(xと呼びましょう)

xをレジスタ%eaxにコピーします(res = x)

res = res>>31符号拡張

テストx

x=1を設定します

>の場合、res = x

ポインタを復元します

resを返します

ただし、このサブルーチンの重要性はわかりません。私にはそれは役に立たないようです。ここで何が行われているのかご指摘いただければ幸いです。

4

1 に答える 1

6

このコードはXの符号を返します。Cの場合:

int sign(int x) {
    if (x>0)
        return 1;
    else if (x==0)
        return 0;
    else
        return -1;
}

負の場合、またはそれ以外の場合、命令sarl $31, %eaxが挿入-1されます。次に、命令はこの値をifが正であった場合に置き換えます。eax0cmovg1x

于 2012-04-18T11:52:05.473 に答える