网站首页 > 技术文章 正文
测试环境: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
猜你喜欢
- 2024-12-27 探讨 Java 中 valueOf 和 parseInt 的区别
- 2024-12-27 每天学一点Excel2010 (103)——学做进制转换器(2)
- 2024-12-27 GO 编程:字符串,各种int类型,map,结构体之间的相互转换和断言
- 2024-12-27 轻松办公-OfficeExcel函数精解(184)数学和三角之INT函数
- 2024-12-27 Excel转化为整数的函数INT excel转化为值
- 2024-12-27 C ++中如何将字符串类型转换为int类型?
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)