Debug调试版 float指令

来源:互联网 发布:杭州软件培训哪里好 编辑:程序博客网 时间:2024/06/16 21:11

VS2015下的浮点指令。
浮点型与整形转换

int main(int argc,char* argv[]){004117B0 55                   push        ebp  004117B1 8B EC                mov         ebp,esp  004117B3 81 EC CC 00 00 00    sub         esp,0CCh  004117B9 53                   push        ebx  004117BA 56                   push        esi  004117BB 57                   push        edi  004117BC 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  004117C2 B9 33 00 00 00       mov         ecx,33h  004117C7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  004117CC F3 AB                rep stos    dword ptr es:[edi]      float fFloat = (float)argc;004117CE F3 0F 2A 45 08       cvtsi2ss    xmm0,dword ptr [argc]  ;cvtsi2ss 属于SSE指令集,是把一个64位的有符号整型转换为一个浮点值,并把它插入到一个128位的参数中;xmm 是由SSE技术引入的128位的寄存器集,由xmm0到xmm7组成 ;[argc]=1, xmm0=0000000000000000000000003F800000004117D3 F3 0F 11 45 F8       movss       dword ptr [fFloat],xmm0;movss  是将一个单精度数传输到xmm寄存器的低32位或内存    printf("%f", fFloat);004117D8 F3 0F 5A 45 F8       cvtss2sd    xmm0,dword ptr [fFloat]  ; cvtss2sd 将 xmm0/m32 中的一个单精度浮点值转换成 xmm0 中的一个双精度浮点值。;xmm0=00000000000000003FF0000000000000 004117DD 83 EC 08             sub         esp,8  004117E0 F2 0F 11 04 24       movsd       mmword ptr [esp],xmm0 004117E5 68 30 6B 41 00       push        offset string "%f" (0416B30h)  004117EA E8 31 FB FF FF       call        _printf (0411320h)  004117EF 83 C4 0C             add         esp,0Ch      argc = (int)fFloat;004117F2 F3 0F 2C 45 F8       cvttss2si   eax,dword ptr [fFloat]  ;cvttss2si r32, xmm/ m32是把一个32位的浮点值转换为一个32位的整型004117F7 89 45 08             mov         dword ptr [argc],eax      printf("%d", argc);004117FA 8B 45 08             mov         eax,dword ptr [argc]  004117FD 50                   push        eax  004117FE 68 34 6B 41 00       push        offset string "%d" (0416B34h)  00411803 E8 18 FB FF FF       call        _printf (0411320h)  00411808 83 C4 08             add         esp,8      return 0;0041180B 33 C0                xor         eax,eax  }

浮点数作为返回值

int main(){004116E0 55                   push        ebp  004116E1 8B EC                mov         ebp,esp  004116E3 81 EC CC 00 00 00    sub         esp,0CCh  004116E9 53                   push        ebx  004116EA 56                   push        esi  004116EB 57                   push        edi  004116EC 8D BD 34 FF FF FF    lea         edi,[ebp-0CCh]  004116F2 B9 33 00 00 00       mov         ecx,33h  004116F7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  004116FC F3 AB                rep stos    dword ptr es:[edi]      float fFloat = Getfloat();004116FE E8 DE F9 FF FF       call        Getfloat (04110E1h)  00411703 D9 5D F8             fstp        dword ptr [fFloat]  ;fstp ST(0)中的数据以浮点形式存入[fFloat]中, ST(0)出栈    return 0;00411706 33 C0                xor         eax,eax  }float Getfloat(){004116A0 55                   push        ebp  004116A1 8B EC                mov         ebp,esp  004116A3 81 EC C0 00 00 00    sub         esp,0C0h  004116A9 53                   push        ebx  004116AA 56                   push        esi  004116AB 57                   push        edi  004116AC 8D BD 40 FF FF FF    lea         edi,[ebp-0C0h]  004116B2 B9 30 00 00 00       mov         ecx,30h  004116B7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  004116BC F3 AB                rep stos    dword ptr es:[edi]      return 12.25f;;将浮点数保存在ST(0)中,在返回值为浮点数的情况下,无法使用eax;使用ST(0)作为返回值进行传递004116BE D9 05 30 6B 41 00    fld         dword ptr [__real@41440000 (0416B30h)]  ;fld 将浮点数[__real@41440000 (0416B30h)]压入ST(0)中}

参考:C++反汇编与逆向分析技术揭秘

0 0
原创粉丝点击