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字節來傳遞數據
}
熟悉浮點數的機器彙編指令
主要練習兩個轉換;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.