-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 排列的数字数组。

示例:在数字系统 2 中,5 是 101。在系统 8 中,232343435 是 54545...。我想了解如何在 64 位中进行此操作。我的操作系统是 32 位的。我的 CPU 是 pentium-M centrino-laptop 我该怎么做?

4

1 回答 1

2

你用

 mov edx,0h

 div ebx

在你的begin_loop:.

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

int64_t variable_x;

然后将其加载到 EDX/EAX 对中。

代替

mov eax,[variable_x]

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

我希望你能明白。抱歉,如果我忘记了 x86 的确切寻址规则。

当然,由于您在每次迭代中销毁 EDX,您可能会使用堆栈或另外一个寄存器来存储它。

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

于 2012-07-25T17:17:41.080 回答