美文网首页
二、float, double

二、float, double

作者: Justin_901e | 来源:发表于2019-07-17 14:17 被阅读0次

    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

    相关文章

      网友评论

          本文标题:二、float, double

          本文链接:https://www.haomeiwen.com/subject/khrqlctx.html