Assembly 此代码的64位版本

Assembly 此代码的64位版本,assembly,inline-assembly,Assembly,Inline Assembly,我设法编写了一个接受32位整数并将其转换为数字数组的代码,以在另一个数字系统中表示它 问题:如何将其扩展到64位? 在数字Mars C/C++编译器中: void get_digits_asm() { __asm { pushf movd xmm0,eax movd xmm1,ebx movd xmm2,ecx movd xmm3,edx movd xmm4,edi

我设法编写了一个接受32位整数并将其转换为数字数组的代码,以在另一个数字系统中表示它 问题:如何将其扩展到64位? 在数字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排列的数字数组

示例:在数字系统2中,5是101。232343435是54545。。。在系统8中。我想学习如何在64位中实现这一点。我的操作系统是32位的。我的CPU是pentium-M centrino笔记本电脑我怎么能做到这一点?

您使用

 mov edx,0h
以前

 div ebx
开始循环中:

如果要处理64位数字,请使用EDX寄存器存储数字的高32位。所以,如果你的号码是

int64_t variable_x;
然后将其加载到EDX/EAX对中

而不是

mov eax,[variable_x]

我希望你能得到它。很抱歉,我忘记了x86的确切寻址规则

当然,由于您在每次迭代中都会销毁EDX,因此可以使用堆栈或一个或多个寄存器来存储它


您的问题与64位长模式无关,DIV指令支持64位整数。它们只是成对存储。

您想处理64位数据,还是让代码在64位操作系统上运行?两个不同的问题…我需要处理64位数据128位甚至1024位数据。我可以在我的winows XP(32位)中启用长模式吗?不,没有操作系统的支持,您不能使用64位寄存器。但是,您可以多次运行循环,每次处理32位。我需要使用xmm8-xmm15。我现在正在使用xmm0-xmm7。这还不够。谁在用我的收银机?windows?没有人在使用这些寄存器。额外寄存器需要一个指令前缀,该前缀仅在64位模式下可用。您将不得不保存和恢复代码,或者重新组织代码,使其使用更少的寄存器(硬)。在64位模式下运行有很多优点。一个寄存器的数量是一个寄存器的两倍。
mov esi, variable_x
mov eax, [esi]
mov edx, [esi + 4]