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=0000000000000000000000003F800000
004117D3 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++反汇编与逆向分析技术揭秘