• <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>

            coreBugZJ

            此 blog 已棄。

            nasm x86 32位匯編實(shí)現(xiàn) int64 帶符號 加 減 乘 除 比較大小

              1 
              2 
              3 // 畢業(yè)論文做 Pascal 編譯器,需要生成的32位 nasm 匯編代碼支持 64位帶符號整數(shù)
              4 
              5 // 幾個(gè)標(biāo)號
              6 String line = genLabel( ip ) + "";
              7 String head = "              ";
              8 String heaA = "           .A ";
              9 String heaB = "           .B ";
             10 String heaC = "           .C ";
             11 String heaD = "           .D ";
             12 String heaE = "           .E ";
             13 
             14 
             15 
             16 // add 次棧頂+棧頂
             17 text.add( line + "pop eax" );
             18 text.add( head + "pop edx" );
             19 text.add( head + "add dword [esp], eax" );
             20 text.add( head + "adc dword [esp+4], edx" );
             21 
             22 
             23 // sub 次棧頂-棧頂
             24 text.add( line + "pop eax" );
             25 text.add( head + "pop edx" );
             26 text.add( head + "not eax" );
             27 text.add( head + "not edx" );
             28 text.add( head + "add eax, 1" );
             29 text.add( head + "adc edx, 0" );
             30 text.add( head + "add dword [esp], eax" );
             31 text.add( head + "adc dword [esp+4], edx" );
             32 
             33                                 
             34 // mul 次棧頂*棧頂                        
             35         // 乘數(shù) X
             36 text.add( line + "mov ecx, dword [esp+12]" );
             37 text.add( head + "mov ebx, dword [esp+8]" );
             38         // 乘數(shù) Y
             39 text.add( head + "mov edi, dword [esp+4]" );
             40 text.add( head + "mov esi, dword [esp]" );
             41         // 結(jié)果符號暫存于 dword [esp-8],正 1,負(fù) -1
             42 text.add( head + "mov dword [esp-8], 1" );
             43         // 乘數(shù) Y
             44 text.add( head + "cmp edi, 0" );
             45 text.add( head + "jge" + heaA );
             46         // 乘數(shù) Y 取相反數(shù)
             47 text.add( head + "not esi" );
             48 text.add( head + "not edi" );
             49 text.add( head + "add esi, 1" );
             50 text.add( head + "adc edi, 0" );
             51 text.add( head + "neg dword [esp-8]" );
             52         // 乘數(shù) X
             53 text.add( heaA + "cmp ecx, 0" );
             54 text.add( head + "jge" + heaB );
             55         // 乘數(shù) X 取相反數(shù)
             56 text.add( head + "not ebx" );
             57 text.add( head + "not ecx" );
             58 text.add( head + "add ebx, 1" );
             59 text.add( head + "adc ecx, 0" );
             60 text.add( head + "neg dword [esp-8]" );
             61         // 無符號64位乘法
             62 text.add( heaB + "mov eax, ecx" );
             63 text.add( head + "mul esi" );
             64 text.add( head + "mov dword [esp-4], eax" );
             65 text.add( head + "mov eax, ebx" );
             66 text.add( head + "mul edi" );
             67 text.add( head + "add dword [esp-4], eax" );
             68 text.add( head + "mov eax, ebx" );
             69 text.add( head + "mul esi" );
             70 text.add( head + "add edx, dword [esp-4]" );
             71         // 設(shè)置結(jié)果符號
             72 text.add( head + "cmp dword [esp-8], 1" );
             73 text.add( head + "jz "  + heaD );
             74 text.add( head + "not eax" );
             75 text.add( head + "not edx" );
             76 text.add( head + "add eax, 1" );
             77 text.add( head + "adc edx, 0" );
             78 text.add( heaD + "add esp, 8" );
             79 text.add( head + "mov dword [esp], eax" );
             80 text.add( head + "mov dword [esp+4], edx" );
             81 
             82 
             83 // div 次棧頂/棧頂,取商
             84         // 絕對值相除,得到商的絕對值,異號得負(fù)
             85         // 結(jié)果符號暫存于 dword [esp-4],正 1,負(fù) -1
             86 text.add( line + "mov dword [esp-4], 1" );
             87         // 除數(shù) Y
             88 text.add( head + "cmp dword [esp+4], 0" );
             89 text.add( head + "jge" + heaA );
             90         // 除數(shù) Y 取相反數(shù)
             91 text.add( head + "not dword [esp]" );
             92 text.add( head + "not dword [esp+4]" );
             93 text.add( head + "add dword [esp], 1" );
             94 text.add( head + "adc dword [esp+4], 0" );
             95 text.add( head + "neg dword [esp-4]" );
             96         // 被除數(shù) X
             97 text.add( heaA + "cmp dword [esp+12], 0" );
             98 text.add( head + "jge" + heaB );
             99         // 被除數(shù) X 取相反數(shù)
            100 text.add( head + "not dword [esp+8]" );
            101 text.add( head + "not dword [esp+12]" );
            102 text.add( head + "add dword [esp+8], 1" );
            103 text.add( head + "adc dword [esp+12], 0" );
            104 text.add( head + "neg dword [esp-4]" );
            105         // 循環(huán)次數(shù)
            106 text.add( heaB + "mov ecx, 64" );
            107         // 余數(shù)
            108 text.add( head + "xor edx, edx" );
            109 text.add( head + "xor eax, eax" );
            110         // 商
            111 text.add( head + "xor edi, edi" );
            112 text.add( head + "xor esi, esi" );
            113         // 循環(huán)
            114 text.add( heaC + "shl dword [esp+8], 1" );
            115 text.add( head + "rcl dword [esp+12], 1" );
            116 text.add( head + "rcl eax, 1" );
            117 text.add( head + "rcl edx, 1" );
            118 text.add( head + "shl esi, 1" );
            119 text.add( head + "rcl edi, 1" );
            120 text.add( head + "mov ebx, eax" );
            121 text.add( head + "sub ebx, dword [esp]" );
            122 text.add( head + "mov ebx, edx" );
            123 text.add( head + "sbb ebx, dword [esp+4]" );
            124 text.add( head + "jl " + heaD );
            125 text.add( head + "sub eax, dword [esp]" );
            126 text.add( head + "sbb edx, dword [esp+4]" );
            127 text.add( head + "add esi, 1" );
            128 text.add( head + "adc edi, 0" );
            129 text.add( heaD + "loop" + heaC );
            130 text.add( head + "cmp dword [esp-4], 1" );
            131 text.add( head + "jz " + heaE );
            132 text.add( head + "not esi" );
            133 text.add( head + "not edi" );
            134 text.add( head + "add esi, 1" );
            135 text.add( head + "adc edi, 0" );
            136 text.add( heaE + "add esp, 8" );
            137 text.add( head + "mov dword [esp], esi" );
            138 text.add( head + "mov dword [esp+4], edi" );
            139 
            140 
            141 // rem 次棧頂/棧頂,取余數(shù)
            142         // 絕對值相除,得到余數(shù)的絕對值,符號與被除數(shù)相同
            143         // 結(jié)果符號暫存于 dword [esp-4],正 1,負(fù) -1
            144 text.add( line + "mov dword [esp-4], 1" );
            145         // 除數(shù) Y
            146 text.add( head + "cmp dword [esp+4], 0" );
            147 text.add( head + "jge" + heaA );
            148         // 除數(shù) Y 取相反數(shù)
            149 text.add( head + "not dword [esp]" );
            150 text.add( head + "not dword [esp+4]" );
            151 text.add( head + "add dword [esp], 1" );
            152 text.add( head + "adc dword [esp+4], 0" );
            153         // 被除數(shù) X
            154 text.add( heaA + "cmp dword [esp+12], 0" );
            155 text.add( head + "jge" + heaB );
            156         // 被除數(shù) X 取相反數(shù)
            157 text.add( head + "not dword [esp+8]" );
            158 text.add( head + "not dword [esp+12]" );
            159 text.add( head + "add dword [esp+8], 1" );
            160 text.add( head + "adc dword [esp+12], 0" );
            161 text.add( head + "neg dword [esp-4]" );
            162         // 循環(huán)次數(shù)
            163 text.add( heaB + "mov ecx, 64" );
            164         // 余數(shù)
            165 text.add( head + "xor edx, edx" );
            166 text.add( head + "xor eax, eax" );
            167         // 商
            168 text.add( head + "xor edi, edi" );
            169 text.add( head + "xor esi, esi" );
            170         // 循環(huán)
            171 text.add( heaC + "shl dword [esp+8], 1" );
            172 text.add( head + "rcl dword [esp+12], 1" );
            173 text.add( head + "rcl eax, 1" );
            174 text.add( head + "rcl edx, 1" );
            175 text.add( head + "shl esi, 1" );
            176 text.add( head + "rcl edi, 1" );
            177 text.add( head + "mov ebx, eax" );
            178 text.add( head + "sub ebx, dword [esp]" );
            179 text.add( head + "mov ebx, edx" );
            180 text.add( head + "sbb ebx, dword [esp+4]" );
            181 text.add( head + "jl " + heaD );
            182 text.add( head + "sub eax, dword [esp]" );
            183 text.add( head + "sbb edx, dword [esp+4]" );
            184 text.add( head + "add esi, 1" );
            185 text.add( head + "adc edi, 0" );
            186 text.add( heaD + "loop" + heaC );
            187 text.add( head + "cmp dword [esp-4], 1" );
            188 text.add( head + "jz " + heaE );
            189 text.add( head + "not eax" );
            190 text.add( head + "not edx" );
            191 text.add( head + "add eax, 1" );
            192 text.add( head + "adc edx, 0" );
            193 text.add( heaE + "add esp, 8" );
            194 text.add( head + "mov dword [esp], eax" );
            195 text.add( head + "mov dword [esp+4], edx" );
            196 
            197 
            198 // cmp 比較 次棧頂 與 棧頂,> 1, == 0, < -1 
            199 text.add( line + "pop eax" );
            200 text.add( head + "pop edx" );
            201 text.add( head + "not eax" );
            202 text.add( head + "not edx" );
            203 text.add( head + "add eax, 1" );
            204 text.add( head + "adc edx, 0" );
            205 text.add( head + "add eax, dword [esp]" );
            206 text.add( head + "adc edx, dword [esp+4]" );
            207 text.add( head + "cmp edx, 0" );
            208 text.add( head + "jle" + heaB );
            209 text.add( head + "mov ecx, 1" );
            210 text.add( head + "jmp" + heaD );
            211 text.add( heaB + "cmp edx, 0" );
            212 text.add( head + "jl " + heaC );
            213 text.add( head + "cmp eax, 0" );
            214 text.add( head + "jz " + heaE );
            215 text.add( head + "mov ecx, 1" );
            216 text.add( head + "jmp" + heaD );
            217 text.add( heaE + "xor ecx, ecx" );
            218 text.add( head + "jmp" + heaD );
            219 text.add( heaC + "mov ecx, -1" );
            220 text.add( heaD + "mov dword [esp], ecx" );
            221 
            222 
            223 
            224 // 測試程序
            225 /*
            226         test int64
            227         小心被優(yōu)化而失去測試效果,盡管目前還優(yōu)化不到這個(gè)程度。
            228 */
            229 const
            230         A =   4123412341L// > max unsigned int32
            231         B =   1111111111L// < max unsigned int32
            232         C =  -4123412341L// -A
            233         D =  -1111111111L// -B
            234         E =   2L;
            235         F =  -2L;
            236         G =  10000000000L;
            237 
            238         U =  7;
            239         V = -7;
            240         X =  3;
            241         Y = -3;
            242 var
            243         a, b : int64;
            244         i    : int32;
            245 begin
            246         i := U;
            247         writeln( i div X );
            248         writeln( i mod X );
            249         writeln( i div Y );
            250         writeln( i mod Y );
            251         i := V;
            252         writeln( i div X );
            253         writeln( i mod X );
            254         writeln( i div Y );
            255         writeln( i mod Y );
            256         writeln( 'V' );
            257 
            258         a := A;
            259         writeln( a + B );
            260         writeln( a + C );
            261         writeln( a + D );
            262         writeln( a + E );
            263         writeln( a + F );
            264         writeln( a + G );
            265         writeln( 'A');
            266 
            267         writeln( a - B );
            268         writeln( a - C );
            269         writeln( a - D );
            270         writeln( a - E );
            271         writeln( a - F );
            272         writeln( a - G );
            273         writeln( 'B');
            274 
            275         writeln( a * B );
            276         writeln( a * C );
            277         writeln( a * D );
            278         writeln( a * E );
            279         writeln( a * F );
            280         writeln( a * G );
            281         writeln( 'C');
            282 
            283         writeln( a div B );
            284         writeln( a div C );
            285         writeln( a div D );
            286         writeln( a div E );
            287         writeln( a div F );
            288         writeln( a div G );
            289         writeln( 'D');
            290 
            291         writeln( a mod B );
            292         writeln( a mod C );
            293         writeln( a mod D );
            294         writeln( a mod E );
            295         writeln( a mod F );
            296         writeln( a mod G );
            297         writeln( 'E');
            298 
            299         a := G;
            300         writeln( a - 1L );
            301         writeln( 'F' );
            302 end.
            303 
            304 
            305 // 測試程序輸出(有乘法溢出int64)
            306 2
            307 1
            308 -2
            309 1
            310 -2
            311 -1
            312 2
            313 -1
            314 V
            315 5234523452
            316 0
            317 3012301230
            318 4123412343
            319 4123412339
            320 14123412341
            321 A
            322 3012301230
            323 8246824682
            324 5234523452
            325 4123412339
            326 4123412343
            327 -5876587659
            328 B
            329 4581569267319620851
            330 1444214739798451335
            331 -4581569267319620851
            332 8246824682
            333 -8246824682
            334 4340635262580896768
            335 C
            336 3
            337 -1
            338 -3
            339 2061706170
            340 -2061706170
            341 0
            342 D
            343 790079008
            344 0
            345 790079008
            346 1
            347 1
            348 4123412341
            349 E
            350 9999999999
            351 F
            352 
            353 

            posted on 2013-04-29 20:46 coreBugZJ 閱讀(3981) 評論(0)  編輯 收藏 引用 所屬分類: AssembleCPUGPU

            久久亚洲AV成人无码软件| 国内精品人妻无码久久久影院导航 | 久久久国产亚洲精品| 无码人妻精品一区二区三区久久| 久久99毛片免费观看不卡| 久久这里有精品| 久久国产精品国产自线拍免费| 久久天天日天天操综合伊人av| 亚洲欧美伊人久久综合一区二区| 秋霞久久国产精品电影院| 精品999久久久久久中文字幕| 手机看片久久高清国产日韩| 久久99久久无码毛片一区二区| jizzjizz国产精品久久| 午夜精品久久久久久久久| 久久国产成人精品国产成人亚洲| 性欧美丰满熟妇XXXX性久久久 | 久久久久人妻精品一区三寸蜜桃| 岛国搬运www久久| 韩国三级中文字幕hd久久精品| 男女久久久国产一区二区三区| 国产精品对白刺激久久久| 久久天天躁狠狠躁夜夜avapp| 亚洲国产精品无码久久一区二区| 久久久久国色AV免费看图片| 波多野结衣中文字幕久久| 日韩人妻无码一区二区三区久久99| 精品久久久久一区二区三区 | 四虎国产精品成人免费久久| 一级做a爰片久久毛片16| 久久久久亚洲AV成人网人人网站| 国产一区二区三区久久精品| 久久精品国产清高在天天线| 66精品综合久久久久久久| 99精品久久精品| 四虎久久影院| 亚洲国产成人久久一区久久| 亚洲日本va中文字幕久久| 久久精品国产99国产精品亚洲| 97视频久久久| 亚洲国产精品无码久久98|