Re: [問題] 不用除法,算出整數除以五的商
看板C_and_CPP (C/C++)作者stupid0319 (徵女友)時間14年前 (2012/05/12 13:00)推噓12(12推 0噓 18→)留言30則, 5人參與討論串2/2 (看更多)
00401027: B8 1F 85 EB 51 mov eax,51EB851Fh
0040102C: F7 6C 24 08 imul dword ptr [esp+8]
00401030: C1 FA 04 sar edx,4
00401033: 8B CA mov ecx,edx
00401035: C1 E9 1F shr ecx,1Fh
00401038: 03 CA add ecx,edx
0040103A: 51 push ecx
拿p大的code來反推一下
假設,被除數x,除數o
也就是 x/o
I.當x>0時
x/o = x* (2^n/o) * (1/2^n)
再設(2^n/o)為c
x*c
x/o = ---
2^n
II.當x<0時
x*c
x/o = --- + 1 ;向0取整,負數時要+1
2^n
------------------------------------------
己知c = eax = 51EB851F, o未知
由於imul在edx時會高4個Byte,等於高了32位,再算上sar edx,4
共高了36位取得 n = 36
x/o = x*c >> n ,代入得x/o = x*51EB851F >> 36
得 x/o = x*51EB851F / 2^36
o = 2^36 / 51EB851F ~~ 50 得知這是除於50的除法優化
----------------------------------------------
00401033: 8B CA mov ecx,edx
00401035: C1 E9 1F shr ecx,1Fh
00401038: 03 CA add ecx,edx
這三行是取得結果的正負符號
把edx的值給ecx後,右移31位,如果是正數, 則ecx = 0,add ecx,edx等於+0
如果是負數,則ecx = 1;由於負數除法的結果要+1(這個我就不推導了)
add ecx,edx等於+1
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.170.163.5
→
05/12 13:12, , 1F
05/12 13:12, 1F
→
05/12 13:13, , 2F
05/12 13:13, 2F
→
05/12 13:17, , 3F
05/12 13:17, 3F
推
05/12 13:19, , 4F
05/12 13:19, 4F
推
05/12 23:00, , 5F
05/12 23:00, 5F
→
05/12 23:02, , 6F
05/12 23:02, 6F
推
05/12 23:36, , 7F
05/12 23:36, 7F
→
05/12 23:37, , 8F
05/12 23:37, 8F
推
05/12 23:40, , 9F
05/12 23:40, 9F

推
05/13 00:02, , 10F
05/13 00:02, 10F
推
05/13 00:51, , 11F
05/13 00:51, 11F
推
05/13 03:06, , 12F
05/13 03:06, 12F
推
05/13 11:25, , 13F
05/13 11:25, 13F
→
05/13 11:26, , 14F
05/13 11:26, 14F
→
05/13 11:27, , 15F
05/13 11:27, 15F
→
05/13 11:28, , 16F
05/13 11:28, 16F
→
05/13 11:28, , 17F
05/13 11:28, 17F
推
05/13 14:06, , 18F
05/13 14:06, 18F
→
05/13 14:07, , 19F
05/13 14:07, 19F
→
05/13 14:08, , 20F
05/13 14:08, 20F
→
05/13 14:09, , 21F
05/13 14:09, 21F
→
05/13 14:10, , 22F
05/13 14:10, 22F
推
05/13 20:23, , 23F
05/13 20:23, 23F
→
05/13 20:24, , 24F
05/13 20:24, 24F
→
05/13 20:25, , 25F
05/13 20:25, 25F
→
05/13 20:26, , 26F
05/13 20:26, 26F
推
05/13 20:35, , 27F
05/13 20:35, 27F
推
05/13 20:37, , 28F
05/13 20:37, 28F
→
05/13 20:38, , 29F
05/13 20:38, 29F
→
05/13 20:39, , 30F
05/13 20:39, 30F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章