• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            C++整數、浮點數、結構體的返回值

             

            #include "stdafx.h"


            struct person{
                
            int age;
                
            int sex;
                
            char name[20];
            };

            struct person GetPerson(int age,int sex,char* name)
            {
                
            struct person p;
                p.age 
            = age;
                p.sex 
            = sex;
                strcpy(p.name,name);
                
            return p;
            }

            int main()
            {
                
            int m = 0x7ffff123;
                
            int n = 0x7ffff456;
                
            int k = 0x7fffffff;

                
            //匯編指令:imul,mul
                long long x = (long long)(m * n);    //返回值類型為 int,然后強制轉換為long long,最后賦值給x,
                long long y = (long long)m * n;        //返回值類型為 long long,然后賦值給y,注意強制類型轉換括號的位置,
                

                
            long long z = m * n;                //返回值類型為 int,然后賦值給x.
            /*

            匯編指令:
                004114BC  mov         eax,dword ptr [m] 
                004114BF  imul        eax,dword ptr [n] 
                004114C3  cdq          //數據擴展指令,將雙字數據擴展為四字類型
                //CDQ—Convert Double to Quad (386+),該指令把edx擴展為eax的高位,也就是說變為64位。     
                004114C4  mov         dword ptr [z],eax 
                004114C7  mov         dword ptr [ebp-4Ch],edx 
            */

                printf(
            "m = %d,n = %d \n",m,n);
                printf(
            "x = %lld\n",x);
                printf(
            "y = %lld\n",y);
                printf(
            "z = %lld\n",z);





                
            int m1 = 8;
                
            int n1 = 3;
                
            int k1 = m1/n1;

                
            double k2 = m1/n1;        //返回值類型為 int,然后賦值給k2,匯編指令:idiv
            /*

            匯編指令:
                0041155E  mov         eax,dword ptr [m1] 
                00411561  cdq              
                00411562  idiv        eax,dword ptr [n1] 
                00411565  mov         dword ptr [ebp-1F4h],eax 
                0041156B  fild        dword ptr [ebp-1F4h] 
                00411571  fstp        qword ptr [k2] 

                fild和fstp都是x87指令 
                fild浮點加載整數 然后轉換為長雙精度  
                fild是將整數轉化為長雙精FP80壓棧(壓到st0),
                fstp是將彈棧指令,將st0彈出。

            */


                
            double k3 = (double)(m1/n1);    //返回值類型為 int,然后強制轉換為double,最后賦值給k3,匯編指令:idiv


                
            double k4 = (double)m1/n1;        //返回值類型為double,然后賦值給k4,注意強制類型轉換括號的位置,匯編指令:fidiv
            /*

                匯編指令:
                00411590  fild        dword ptr [m1] 
                00411593  fidiv       dword ptr [n1] 
                00411596  fstp        qword ptr [k4] 
            */

                printf(
            "k1=%d \r\n",k1);
                printf(
            "k2=%f \r\n",k2);
                printf(
            "k3=%f \r\n",k3);
                printf(
            "k4=%f \r\n",k4);

                
            char l1 = 127;
                
            char l2 = 122;
                
            int  l3 = l1* l2;
            /*
            匯編指令:
                0041162E  movsx       eax,byte ptr [l1] 
                00411635  movsx       ecx,byte ptr [l2] 
                0041163C  imul        eax,ecx 
                0041163F  mov         dword ptr [l3],eax 
            */



                
            char l4 = l1* l2;
            /*
                匯編指令:
                00411645  movsx       eax,byte ptr [l1] 
                0041164C  movsx       ecx,byte ptr [l2] 
                00411653  imul        eax,ecx 
                00411656  mov         byte ptr [l4],al 
            */




                
            int l5 = l1/l2;
                
            int l6 = double(l1)/l2;


                
            long double k5 = l1* l2;
            /*
                匯編指令:
                004116A6  movsx       eax,byte ptr [l1] 
                004116AD  movsx       ecx,byte ptr [l2] 
                004116B4  imul        eax,ecx 
                004116B7  mov         dword ptr [ebp-1F4h],eax 
                004116BD  fild        dword ptr [ebp-1F4h] 
                004116C3  fstp        qword ptr [k5] 
            */


                printf(
            "l3=%d \r\n",l3);
                printf(
            "l4=%d \r\n",l4);
                printf(
            "k4=%lf \r\n",k5);

                
            long long o1 = 0xff34567812345677;    
                
            long long o2 = 0xab34567834125615;
                
            long long o3 = o1 * o2;    //溢出

                
            int age = 5;
                
            int sex = 1;
                
            char name[20= "Aaron";

                
            struct person p1 = {5,1,"Aaron"};
                
            struct person p2;
                
            struct person* pp1 = &p1;
                
            struct person* pp2 = &p2;
                p2
            = p1;
            /*
            匯編指令:
            00414348  mov         ecx,7 
            0041434D  lea         esi,[ebp-188h] 
            00414353  lea         edi,[ebp-1ACh] 
            00414359  rep movs    dword ptr es:[edi],dword ptr [esi] 

            //ecx 是計數器(counter),是重復(REP)前綴指令和LOOP指令的內定計數器。
            因為sizeof(person) = 28,所以才有mov ecx,7 
            */


                
            struct person p3;
                p3
            = GetPerson(age,sex,name);


            //結論:
            /*

            整數類型:
                小于等于4字節的返回值放在eax中,
                8字節的返回值放在edx + eax中,其中edx為高位,eax為低位.

            浮點數類型:
            計算是通過壓棧的方式,如匯編指令:fild
            返回是通過出棧的方式,如匯編指令:fstp

            結構體類型賦值:
            是通過內存拷貝的方式,如匯編指令:rep movs
            將源值的地址放入esi,
            將目標值的地址放入edi,

            00414393  lea         esi,[ebp-2D8h] 
            00414399  lea         edi,[ebp-1D0h] 
            0041439F  rep movs    dword ptr es:[edi],dword ptr [esi] 


            結構體類型返回值:
            通過eax將結構體的指針返回
            */

                system(
            "pause");
                
            return 0;
            }
            //111111111111111111111111111111
            //00000000000000000000000000000001
            //
            //111111111111111111001010111100
            //10000000101011010101110111000010
            //取反加一 1111111010100101010001000111110
            //11111001111111111111111111111110000011000

            //11111111111111111111110000011000
            //1111101000


            //11111010000000000000000000000000000000000 = 0
            //00000000000000000000000000000000
            //
            //1111111111111111111110000011000

             

            posted on 2013-03-01 10:16 天下 閱讀(1085) 評論(0)  編輯 收藏 引用 所屬分類: C/C++匯編語言

            <2013年3月>
            242526272812
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            欧美丰满熟妇BBB久久久| 久久五月精品中文字幕| 久久综合久久自在自线精品自| 国产成人精品三上悠亚久久| 日日噜噜夜夜狠狠久久丁香五月| 国产麻豆精品久久一二三| 精品久久人人做人人爽综合| 国产香蕉久久精品综合网| 久久99国产精一区二区三区| 一本综合久久国产二区| 久久亚洲欧美日本精品| 2020久久精品亚洲热综合一本| 久久精品午夜一区二区福利| 久久亚洲国产成人影院网站 | 久久国产精品99久久久久久老狼 | 亚洲国产精品无码久久九九| 日韩av无码久久精品免费| 国产精品伦理久久久久久| 乱亲女H秽乱长久久久| 久久久久人妻精品一区三寸蜜桃| 久久人人爽爽爽人久久久| 色综合久久88色综合天天 | 狠狠色婷婷综合天天久久丁香 | 久久99精品国产麻豆蜜芽| 狠狠色狠狠色综合久久| 久久久久亚洲AV综合波多野结衣 | 精品久久久久久国产潘金莲 | 久久九九亚洲精品| 亚洲AV日韩精品久久久久久| 性做久久久久久久久老女人| 久久久久亚洲精品天堂久久久久久| 精品久久久久久| 精品久久久久久久| 精品一区二区久久| 久久国产精品久久精品国产| 狠狠色丁香久久综合五月| 久久精品国产亚洲AV麻豆网站| 久久国产免费直播| 性欧美大战久久久久久久久| 亚洲AV无一区二区三区久久| 无码人妻久久一区二区三区免费|