二、float, double
float : 4byte
double: 8byte
浮点数的操作使用浮点协处理器的浮点寄存器。
1,浮点类型IEEE编码
![](https://img.haomeiwen.com/i15794461/b9968990fae2eeb1.png)
float类型在内存中占4字节(32位)。最高位表示符号,8位表示指数,其余23表示尾数。
2, double类型IEEE编码
double类型在内存中占8字节(64位),最高位表示符号,11位表示指数,剩下52位表示尾数。
3,浮点寄存器
![](https://img.haomeiwen.com/i15794461/0ce4252a45f9f64d.png)
![](https://img.haomeiwen.com/i15794461/9cc3b26d54cf40a4.png)
4,浮点汇编分析
![](https://img.haomeiwen.com/i15794461/fa118a290cb0e74a.png)
cvtpi2ps XMM,MM/m64
源存储器64位两个32位有符号(补码)整数转为两个单精度浮点数,放入目的寄存器低64中,高64位不变.源寄存器是'MM',不是'XMM'
cvtsi2ss XMM,r32/m32
源存储器1个32位有符号(补码)整数转为1个单精度浮点数,放入目的寄存器低32中,高96位不变.
cvtps2pi MM,XMM/m64
把源存储器低64位两个32位单精度浮点数转为两个32位有符号整数,放入目的寄存器.
cvtss2si r32,XMM/m32
把源存储器低32位1个单精度浮点数转为1个32位有符号整数,放入目的寄存器.
movss
是将一个单精度数传输到xmm寄存器的低32位,
movaps
是一次性向寄存器中写入四个单精度数
MOVSB:传送一个字节,之后SI和DI(或者ESI和EDI)加/减1
MOVSW:传送一个字,之后SI和DI(或者ESI和EDI)加/减2
MOVSD:传送一个双字,之后SI和DI(或者ESI和EDI)加/减4
float fFloat = (float)argc;
cvtsi2ss xmm0,dword ptr ss:[ebp+8]
movss dword ptr ss:[ebp-8],xmm0
printf("justin: %f", fFloat);
cvtss2sd xmm0,dword ptr ss:[ebp-8]
sub esp,8
movsd qword ptr ss:[esp],xmm0
push float.10B7B30
call float.10B132F
add esp,C
argc = (int)fFloat;
cvttss2si eax,dword ptr ss:[ebp-8]
mov dword ptr ss:[ebp+8],eax
printf("%d", argc);
mov eax,dword ptr ss:[ebp+8]
push eax
push float.10B7B40
call float.10B132F
add esp,8
fFloat = GetFloat();
call float.10B100F
fstp dword ptr ss:[ebp-8],st(0) //fstp 将st(0)出栈并写入内存
![](https://img.haomeiwen.com/i15794461/9f4316d2f57f9dde.png)
![](https://img.haomeiwen.com/i15794461/eafc7965ecdc1069.png)
![](https://img.haomeiwen.com/i15794461/16ac8262a42493b0.png)
![](https://img.haomeiwen.com/i15794461/fc5a81b3ed9e5468.png)
printf("%f", fFloat);
cvtss2sd xmm0,dword ptr ss:[ebp-8]
sub esp,8
movsd qword ptr ss:[esp],xmm0
push float.10B7B44
call float.10B132F