主要练习两个转换;
int main(int argc,char*argv[]){
float fFloat=(float)argc;
printf("%f",fFloat);
argc=(float)fFloat;
printf("%d",argc);
}
//分析汇编码;指令fld
fild //将整数压入对应的ST(0)中
fld //将浮点数添加到寄存器ST(0)中;
fild dword ptr[argc]; //C++中VS2010将所有的用ebp+地址偏移改为由变量直接表示;
fstp dword ptr[fFloat]; //取出寄存器中的值然后赋值给对应地址空间;
fld dword ptr[fFloat]; //将对应的浮点数压入栈中ST(0);
sub esp 8; //把esp减去8用来存放由浮点数转换为double类型的空间//实质上浮点数是以8字节来存储的;
fstp qword ptr [esp]; //把对应的浮点的数值传入到寄存器当中;
//然后调用printf函数入口; //qword表示的是8字节的空间;
push offset string "%f" (12D8CE8h)
call @ILT+4425(_printf) (127E14Eh)
add esp,0Ch
//解析从float类型转换为int类型;
fld dowrd ptr[fFloat] //将浮点数添加到寄存器ST(0);
call @ILT+4960(__ftol2_sse) (127E365h) //调用函数之后eax中存放的是整数;
mov dword ptr [argc],eax //把整数传入到对应的地址中;
mov eax,dword ptr [argc] //地址中的值传入到eax;
push eax
push offset string "%d" (12D8C70h)
call @ILT+4425(_printf) (127E14Eh)
add esp,8
//浮点数作为返回值也不能直接通过寄存器eax作为中间容器;
float GetFloat()
{
push ebp
mov ebp,esp
sub esp,0C0h
push ebx
push esi
push edi
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
return 12.25f;
fld dword ptr [__real@41440000 (142DC6Ch)] //通过寄存器ST(0) 8字节来传递数据
}