1

これは、gcc スタイルの asm インライン アセンブリ コードに変換しようとしている実際のコードです。

#include<iostream>
using namespace std;

int reverse(int num);

int main(){
    int num;
    cout << "enter number: ";
    cin >> num;
    cout << endl;
    cout << reverse(num);
    return 0;
}

int reverse(int num){
    if(num == 0 || num == 1){
        return num;
    }
    __asm
    {
        xor eax, eax
        xor ecx, ecx     
        mov ebx, num    
        clc             ; clear carry
not_found:
        inc ecx
        shl ebx, 1
        jnc not_found


        rcr eax, 1
        mov edx, ecx
again:
        shl ebx, 1
        rcr eax, 1
        inc ecx
        cmp ecx, 32
        jne again

        dec edx     
again2:     
        shr eax, 1
        dec edx
        cmp edx, 0
        jne again2
    }

}

上記のコードを gcc でコンパイルできなかったので、gcc コンパイラで正常にコンパイルできるものに変換しようとしましたが、これまでのところ意味のある結果を得ることができませんでした。

4

1 に答える 1

0

OP のコメントのコードに基づいて、インライン アセンブリを使用して 1 ビットずつシフトする変更例を次に示します。

#include<iostream>
using namespace std;
int reverse(int num);
int main()
{
    int num;
    cout << "enter number: ";
    cin >> num;
    cout << endl;
    cout << reverse(num) << endl;
    return 0;
}

int reverse(int num)
{
    if (num == 0 || num == 1)
    {
        return num;
    }
    int temp = 0;
    asm( "shll $1, %0 \n\t" : "=r"(temp) : "0"(num));
    return temp;
}

制約gccを使用して要求した場合、オペランドをレジスターに入れることに注意してください。そのため、自分でオペランドを使用する理由はありません (少なくともこの小さなサンプルでは)。また、入力制約で使用して、出力と同じレジスターにする必要があることを通知しました。これが機能するためです。rmov0shl

条件についてnum == 1はまだわかりませんが、おそらくそれは完全な機能の実際の機能がわからないためです。

于 2013-01-05T15:25:16.027 に答える