熟悉浮點數的機器彙編指令

主要練習兩個轉換;
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字節來傳遞數據
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章