二、float, double

2019-07-17  本文已影响0人  Justin_901e

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();

call float.10B100F

fstp dword ptr ss:[ebp-8],st(0)   //fstp 将st(0)出栈并写入内存

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)  执行后寄存器    

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

上一篇下一篇

猜你喜欢

热点阅读