-1

32 ビット整数を受け取り、それを数字配列に変換して別の数値システムで表すコードを書くことができました。質問: これを 64 ビットに拡張するにはどうすればよいですか? Digital Mars C/C++ コンパイラでは:

void get_digits_asm()
{
    __asm
    {

        pushf       
        movd xmm0,eax
        movd xmm1,ebx
        movd xmm2,ecx
        movd xmm3,edx
        movd xmm4,edi

        mov eax,[variable_x]
        mov ebx,[number_system]
        mov ecx,0h
        mov edi,0h

        begin_loop:
        mov edx,0h
        div ebx             
        lea edi,digits  
        mov [edi+ecx*4],edx
        add ecx,01h
        cmp eax,ebx
        ja begin_loop

        mov edx,0
        div ebx
        lea edi,digits
        mov [edi+ecx*4],edx
        inc ecx
        mov [digits_total],ecx


        movd edi,xmm4//pop edi
        movd edx,xmm3//pop edx
        movd ecx,xmm2//pop ecx
        movd ebx,xmm1//pop ebx
        movd eax,xmm0//pop eax
        popf            
    }

}

この関数が戻ると、LSB から MSB に配置された数字の配列が返されます。

例: 5 は、数体系 2 では 101 です。232343435 は、システム 8 では 54545... です。これを 64 ビットで作成する方法を知りたいです。私のOSは32ビットです。CPU は pentium-M centrino-laptop ですが、どうすればよいですか?

4

1 に答える 1

2

あなたが使う

 mov edx,0h

 div ebx

あなたのbegin_loop:

64ビットの数値を処理する場合は、EDXレジスタを使用して数値の上位32ビットを格納します。だから、あなたの番号が

int64_t variable_x;

次に、それをEDX/EAXペアにロードします。

それ以外の

mov eax,[variable_x]

行う

mov esi, variable_x
mov eax, [esi]
mov edx, [esi + 4]

私はあなたがそれを手に入れることを望みます。x86の正確なアドレス指定ルールを忘れてしまった場合は申し訳ありません。

もちろん、反復ごとにEDXを破棄するため、スタックまたはもう1つのレジスタを使用してEDXを格納できます。

あなたの問題は64ビットロングモードとは何の関係もありません。DIV命令は64ビット整数をサポートします。それらはペアとして保存されます。

于 2012-07-25T17:17:41.080 に答える