熟悉浮点数的机器汇编指令

主要练习两个转换;
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字节来传递数据
} 


发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/53234612