我设法编写了一个接受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. 232343435是系统8中的54545 ....我想学习如何在64位中进行此操作。我的操作系统是32位。我的CPU是pentium-M centrino-laptop我该怎么做?
答案 0 :(得分:2)
您使用
mov edx,0h
前
div ebx
在begin_loop:
。
如果要处理64位数字,请使用EDX寄存器存储数字的高32位。所以,如果你的号码是
int64_t variable_x;
然后将其加载到EDX / EAX对中。
而不是
mov eax,[variable_x]
DO
mov esi, variable_x
mov eax, [esi]
mov edx, [esi + 4]
我希望你明白。很抱歉,如果我忘记了x86的确切寻址规则。
当然,由于您在每次迭代时销毁EDX,您可以使用堆栈或一个寄存器来存储它。
您的问题与64位长模式无关,DIV指令支持64位整数。它们只是成对存储。