• <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>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
                x87的FPU支持很多種浮點(diǎn)運(yùn)算,其中浮點(diǎn)運(yùn)算的比較結(jié)果不放在EFLAGS里,我們需要人手取出。在比較a和b的時(shí)候,C2=0,C3=(a==b),C0=(a<b)。我們可以將FNSTSW AX指令將浮點(diǎn)標(biāo)志位復(fù)制到AX,然后通過(guò)讀取C3、C2和C0(分別位于第14、10、8位)來(lái)判斷結(jié)果。下面是一個(gè)求浮點(diǎn)數(shù)組最大值的匯編函數(shù):

             1 CONSTANT
             2 VARIABLE
             3 CODE
             4 
             5 //double __stdcall double_max(double* numbers , int count)
             6 @DOUBLE_MAX:
             7   //新建堆棧幀
             8   PUSH EBP
             9   MOV EBP, ESP
            10   PUSH EAX //floating status word
            11   PUSH EBX //numbers
            12   PUSH ECX //looping variable
            13   PUSH EDX //count
            14   //temp=numbers[0]
            15   SUB ESP, int32 8
            16   MOV EBX, int32 [EBP+8]
            17   FLD fp64 [EBX]
            18   FSTP fp64 [ESP]
            19   //for(ECX=1;ECX<count;ECX++)
            20   MOV ECX, int32 1
            21   MOV EDX, int32 [EBP+12]
            22 @DOUBLE_MAX_LOOP_BEGIN:
            23   CMP ECX, EDX
            24   JZ @DOUBLE_MAX_LOOP_END
            25   //temp=MAX(temp,numbers[ECX])
            26   FLD fp64 [ESP]
            27   FCOMP fp64 [ECX*8+EBX]
            28   FNSTSW AX
            29   TEST AH, int8 1
            30   JZ @DOUBLE_MAX_LOOP_SIDEEFFECT
            31   FLD fp64 [ECX*8+EBX]
            32   FSTP fp64[ESP]
            33 @DOUBLE_MAX_LOOP_SIDEEFFECT:
            34   INC ECX
            35   JMP @DOUBLE_MAX_LOOP_BEGIN
            36 @DOUBLE_MAX_LOOP_END:
            37   //return temp
            38   FLD fp64 [ESP]
            39   //銷(xiāo)毀堆棧幀
            40   ADD ESP, int32 8
            41   POP EDX
            42   POP ECX
            43   POP EBX
            44   POP EAX
            45   MOV ESP, EBP
            46   POP EBP
            47   RET int16 8

                我們可以通過(guò)一下代碼調(diào)用此函數(shù):
             1 typedef double(__stdcall*ASM_MAX)(double* Numbers , int Count);
             2 
             3 void RunExecutable(VL_AsmProgram* Program , VL_AsmCompiled* Compiled , VL_AsmExecutable* Executable)
             4 {
             5     VInt Offset=(VInt)Compiled->LabelOffsets[Program->LabelNames.IndexOf(L"@DOUBLE_MAX")];
             6     ASM_MAX Function=(ASM_MAX)((VInt)Executable->GetInstruction()+Offset);
             7     double Numbers[]={7,1,12,2,8,3,11,4,9,5,13,6,10};
             8     double Max=Function(Numbers,sizeof(Numbers)/sizeof(*Numbers));
             9     GetConsole()->Write(L"結(jié)果:"+VUnicodeString(Max)+L"\r\n");
            10 }

                得到如下結(jié)果:

                正確得到結(jié)果。
            posted on 2009-03-06 04:56 陳梓瀚(vczh) 閱讀(1494) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): JIT
            99久久做夜夜爱天天做精品| 久久久噜噜噜久久| 久久只有这里有精品4| 色老头网站久久网| 久久婷婷五月综合色奶水99啪| 影音先锋女人AV鲁色资源网久久| AV色综合久久天堂AV色综合在 | 精品久久久久久无码中文字幕一区 | 国产一区二区精品久久凹凸| 久久精品国产一区二区| 亚洲AV无一区二区三区久久| 91精品国产高清久久久久久io| 无码任你躁久久久久久久| 久久久女人与动物群交毛片| 久久精品国产99国产精品| 久久人爽人人爽人人片AV| 久久精品国产一区二区 | 国产激情久久久久久熟女老人| 1000部精品久久久久久久久| 日韩精品久久久久久久电影| 99久久亚洲综合精品成人| 波多野结衣AV无码久久一区| 国产精品成人精品久久久| 久久国产乱子伦免费精品| 久久人人青草97香蕉| 久久亚洲精品无码观看不卡| 久久久久久久综合日本亚洲| 五月丁香综合激情六月久久| 久久久久久国产a免费观看黄色大片| 伊人色综合久久| 久久久久一区二区三区| 久久久久久九九99精品| 97久久国产综合精品女不卡 | 亚洲精品国产成人99久久| 久久精品毛片免费观看| 久久久久久久久无码精品亚洲日韩 | 色综合久久中文字幕无码 | 久久精品国产99久久无毒不卡| 区久久AAA片69亚洲| 国产精品99久久久精品无码| 少妇久久久久久被弄到高潮 |