优秀的编程知识分享平台

网站首页 > 技术文章 正文

我今天才知道INT64转double需要调用函数转换

nanyue 2024-12-27 15:49:12 技术文章 3 ℃

测试环境:Windows平台,vs2019,Release关闭优化

x86下

8字节数值转成double是调用函数来转换, 无符号调用一个函数, 有符号调用另一个函数

8字节数值乘法除法运算, 也是调用函数来实现, 有符合和无符号都调用同一个函数

位运算, 加减法都不是调用函数

其中除法最复杂, 一共70行汇编, 167个字节才能实现

x64下都是不是调用函数, 直接编译成对应的汇编

图1到图5,都是x86下编译的结果

图2: 8字节无符号转double(符号写成符合了,不要在意这些细节)

图3: 8字节有符号转double

图4: 8字节乘法,有符号无符号都一样

图5: 8字节除法,有符号无符号都一样

图6: x64下的截图,x64不是调用函数实现




完整除法汇编代码

0045B040  push edi  
0045B041  push esi  
0045B042  push ebx  
0045B043  xor  edi,edi  
0045B045  mov  eax,dword ptr [esp+14h]  
0045B049  or   eax,eax  
0045B04B  jge  0045B061  
0045B04D  inc  edi  
0045B04E  mov  edx,dword ptr [esp+10h]  
0045B052  neg  eax  
0045B054  neg  edx  
0045B056  sbb  eax,0  
0045B059  mov  dword ptr [esp+14h],eax  
0045B05D  mov  dword ptr [esp+10h],edx  
0045B061  mov  eax,dword ptr [esp+1Ch]  
0045B065  or   eax,eax  
0045B067  jge  0045B07D  
0045B069  inc  edi  
0045B06A  mov  edx,dword ptr [esp+18h]  
0045B06E  neg  eax  
0045B070  neg  edx  
0045B072  sbb  eax,0  
0045B075  mov  dword ptr [esp+1Ch],eax  
0045B079  mov  dword ptr [esp+18h],edx  
0045B07D  or   eax,eax  
0045B07F  jne  0045B099  
0045B081  mov  ecx,dword ptr [esp+18h]  
0045B085  mov  eax,dword ptr [esp+14h]  
0045B089  xor  edx,edx  
0045B08B  div  eax,ecx  
0045B08D  mov  ebx,eax  
0045B08F  mov  eax,dword ptr [esp+10h]  
0045B093  div  eax,ecx  
0045B095  mov  edx,ebx  
0045B097  jmp  0045B0DA  
0045B099  mov  ebx,eax  
0045B09B  mov  ecx,dword ptr [esp+18h]  
0045B09F  mov  edx,dword ptr [esp+14h]  
0045B0A3  mov  eax,dword ptr [esp+10h]  
0045B0A7  shr  ebx,1  
0045B0A9  rcr  ecx,1  
0045B0AB  shr  edx,1  
0045B0AD  rcr  eax,1  
0045B0AF  or   ebx,ebx  
0045B0B1  jne  0045B0A7  
0045B0B3  div  eax,ecx  
0045B0B5  mov  esi,eax  
0045B0B7  mul  eax,dword ptr [esp+1Ch]  
0045B0BB  mov  ecx,eax  
0045B0BD  mov  eax,dword ptr [esp+18h]  
0045B0C1  mul  eax,esi  
0045B0C3  add  edx,ecx  
0045B0C5  jb   0045B0D5  
0045B0C7  cmp  edx,dword ptr [esp+14h]  
0045B0CB  ja   0045B0D5  
0045B0CD  jb   0045B0D6  
0045B0CF  cmp  eax,dword ptr [esp+10h]  
0045B0D3  jbe  0045B0D6  
0045B0D5  dec  esi  
0045B0D6  xor  edx,edx  
0045B0D8  mov  eax,esi  
0045B0DA  dec  edi  
0045B0DB  jne  0045B0E4  
0045B0DD  neg  edx  
0045B0DF  neg  eax  
0045B0E1  sbb  edx,0  
0045B0E4  pop  ebx  
0045B0E5  pop  esi  
0045B0E6  pop  edi  
0045B0E7  ret  10h

Tags:

最近发表
标签列表