float : 4byte
double: 8byte
浮点数的操作使用浮点协处理器的浮点寄存器。
1,浮点类型IEEE编码
float 类型的二进制表示说明float类型在内存中占4字节(32位)。最高位表示符号,8位表示指数,其余23表示尾数。
2, double类型IEEE编码
double类型在内存中占8字节(64位),最高位表示符号,11位表示指数,剩下52位表示尾数。
3,浮点寄存器
浮点寄存器 浮点数指令表4,浮点汇编分析
c代码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();
GetFloat将返回值放入ST(0) fstp dword ptr ss:[ebp-8],st(0) 执行前内存 fstp dword ptr ss:[ebp-8],st(0) 执行后内存 fstp dword ptr ss:[ebp-8],st(0) 执行后寄存器call float.10B100F
fstp dword ptr ss:[ebp-8],st(0) //fstp 将st(0)出栈并写入内存
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
网友评论