鱼C论坛

 找回密码
 立即注册
查看: 3162|回复: 2

[技术交流] vs2010中对数组复制几种不同方法的汇编结果

[复制链接]
发表于 2011-5-16 18:13:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #define SIZE 50
  2. int x[SIZE], y[SIZE], i, *p1, *p2;
  3. void try1()
  4. {
  5.     for( i = 0; i < SIZE; i++ )
  6.     {
  7.         x[i] = y[i];
  8.     }
  9. }
  10. void try2()
  11. {
  12.     for( p1 = x, p2 = y; p1 - x < SIZE;)
  13.     {
  14.         *p1++ = *p2++;
  15.     }
  16. }
  17. void try3()
  18. {
  19.     for( i = 0, p1 = x, p2 = y; i < SIZE; i++)
  20.     {
  21.         *p1++ = *p2++;
  22.     }
  23. }
  24. void try4()
  25. {
  26.     register int *p1, *p2;
  27.     register int i;
  28.     for( i = 0, p1 = x, p2 = y; i < SIZE; i++)
  29.     {
  30.         *p1++ = *p2++;
  31.     }
  32. }
  33. void try5 ()
  34. {
  35.     register int *p1,*p2;
  36.     for( p1 = x, p2 = y; p1 < &x[SIZE];)
  37.     {
  38.         *p1++ = *p2++;
  39.     }
  40. }
  41. ==============================================================
  42. void try1()
  43. {
  44. 00CC13C0  push        ebp  
  45. 00CC13C1  mov         ebp,esp  
  46. 00CC13C3  sub         esp,0C0h  
  47. 00CC13C9  push        ebx  
  48. 00CC13CA  push        esi  
  49. 00CC13CB  push        edi  
  50. 00CC13CC  lea         edi,[ebp-0C0h]  
  51. 00CC13D2  mov         ecx,30h  
  52. 00CC13D7  mov         eax,0CCCCCCCCh  
  53. 00CC13DC  rep stos    dword ptr es:[edi]  
  54.     for( i = 0; i < SIZE; i++ )
  55. 00CC13DE  mov         dword ptr [i (0CC7140h)],0  
  56. 00CC13E8  jmp         try1+37h (0CC13F7h)  
  57. 00CC13EA  mov         eax,dword ptr [i (0CC7140h)]  
  58. 00CC13EF  add         eax,1  
  59. 00CC13F2  mov         dword ptr [i (0CC7140h)],eax  
  60. 00CC13F7  cmp         dword ptr [i (0CC7140h)],32h  
  61. 00CC13FE  jge         try1+5Bh (0CC141Bh)  
  62.     {
  63.         x[i] = y[i];
  64. 00CC1400  mov         eax,dword ptr [i (0CC7140h)]  
  65. 00CC1405  mov         ecx,dword ptr [i (0CC7140h)]  
  66. 00CC140B  mov         edx,dword ptr y (0CC7148h)[ecx*4]  
  67. 00CC1412  mov         dword ptr x (0CC7210h)[eax*4],edx  
  68.     }
  69. 00CC1419  jmp         try1+2Ah (0CC13EAh)  
  70. }
  71. 00CC141B  pop         edi  
  72. 00CC141C  pop         esi  
  73. 00CC141D  pop         ebx  
  74. 00CC141E  mov         esp,ebp  
  75. 00CC1420  pop         ebp  
  76. 00CC1421  ret  
  77. ===============================================
  78. void try2()
  79. {
  80. 00CC1440  push        ebp  
  81. 00CC1441  mov         ebp,esp  
  82. 00CC1443  sub         esp,0C0h  
  83. 00CC1449  push        ebx  
  84. 00CC144A  push        esi  
  85. 00CC144B  push        edi  
  86. 00CC144C  lea         edi,[ebp-0C0h]  
  87. 00CC1452  mov         ecx,30h  
  88. 00CC1457  mov         eax,0CCCCCCCCh  
  89. 00CC145C  rep stos    dword ptr es:[edi]  
  90.     for( p1 = x, p2 = y; p1 - x < SIZE;)
  91. 00CC145E  mov         dword ptr [p1 (0CC713Ch)],offset x (0CC7210h)  
  92. 00CC1468  mov         dword ptr [p2 (0CC7138h)],offset y (0CC7148h)  
  93. 00CC1472  mov         eax,dword ptr [p1 (0CC713Ch)]  
  94. 00CC1477  sub         eax,offset x (0CC7210h)  
  95. 00CC147C  sar         eax,2  
  96. 00CC147F  cmp         eax,32h  
  97. 00CC1482  jge         try2+71h (0CC14B1h)  
  98.     {
  99.         *p1++ = *p2++;
  100. 00CC1484  mov         eax,dword ptr [p1 (0CC713Ch)]  
  101. 00CC1489  mov         ecx,dword ptr [p2 (0CC7138h)]  
  102. 00CC148F  mov         edx,dword ptr [ecx]  
  103. 00CC1491  mov         dword ptr [eax],edx  
  104. 00CC1493  mov         eax,dword ptr [p1 (0CC713Ch)]  
  105. 00CC1498  add         eax,4  
  106. 00CC149B  mov         dword ptr [p1 (0CC713Ch)],eax  
  107. 00CC14A0  mov         ecx,dword ptr [p2 (0CC7138h)]  
  108. 00CC14A6  add         ecx,4  
  109. 00CC14A9  mov         dword ptr [p2 (0CC7138h)],ecx  
  110.     }
  111. 00CC14AF  jmp         try2+32h (0CC1472h)  
  112. }
  113. 00CC14B1  pop         edi  
  114. 00CC14B2  pop         esi  
  115. 00CC14B3  pop         ebx  
  116. 00CC14B4  mov         esp,ebp  
  117. 00CC14B6  pop         ebp  
  118. 00CC14B7  ret  
  119. ========================================
  120. void try3()
  121. {
  122. 00CC14E0  push        ebp  
  123. 00CC14E1  mov         ebp,esp  
  124. 00CC14E3  sub         esp,0C0h  
  125. 00CC14E9  push        ebx  
  126. 00CC14EA  push        esi  
  127. 00CC14EB  push        edi  
  128. 00CC14EC  lea         edi,[ebp-0C0h]  
  129. 00CC14F2  mov         ecx,30h  
  130. 00CC14F7  mov         eax,0CCCCCCCCh  
  131. 00CC14FC  rep stos    dword ptr es:[edi]  
  132.     for( i = 0, p1 = x, p2 = y; i < SIZE; i++)
  133. 00CC14FE  mov         dword ptr [i (0CC7140h)],0  
  134. 00CC1508  mov         dword ptr [p1 (0CC713Ch)],offset x (0CC7210h)  
  135. 00CC1512  mov         dword ptr [p2 (0CC7138h)],offset y (0CC7148h)  
  136. 00CC151C  jmp         try3+4Bh (0CC152Bh)  
  137. 00CC151E  mov         eax,dword ptr [i (0CC7140h)]  
  138. 00CC1523  add         eax,1  
  139. 00CC1526  mov         dword ptr [i (0CC7140h)],eax  
  140. 00CC152B  cmp         dword ptr [i (0CC7140h)],32h  
  141. 00CC1532  jge         try3+81h (0CC1561h)  
  142.     {
  143.         *p1++ = *p2++;
  144. 00CC1534  mov         eax,dword ptr [p1 (0CC713Ch)]  
  145. 00CC1539  mov         ecx,dword ptr [p2 (0CC7138h)]  
  146. 00CC153F  mov         edx,dword ptr [ecx]  
  147. 00CC1541  mov         dword ptr [eax],edx  
  148. 00CC1543  mov         eax,dword ptr [p1 (0CC713Ch)]  
  149. 00CC1548  add         eax,4  
  150. 00CC154B  mov         dword ptr [p1 (0CC713Ch)],eax  
  151. 00CC1550  mov         ecx,dword ptr [p2 (0CC7138h)]  
  152. 00CC1556  add         ecx,4  
  153. 00CC1559  mov         dword ptr [p2 (0CC7138h)],ecx  
  154.     }
  155. 00CC155F  jmp         try3+3Eh (0CC151Eh)  
  156. }
  157. 00CC1561  pop         edi  
  158. 00CC1562  pop         esi  
  159. 00CC1563  pop         ebx  
  160. 00CC1564  mov         esp,ebp  
  161. 00CC1566  pop         ebp  
  162. 00CC1567  ret  
  163. ====================================
  164. void try4()
  165. {
  166. 00CC1590  push        ebp  
  167. 00CC1591  mov         ebp,esp  
  168. 00CC1593  sub         esp,0E4h  
  169. 00CC1599  push        ebx  
  170. 00CC159A  push        esi  
  171. 00CC159B  push        edi  
  172. 00CC159C  lea         edi,[ebp-0E4h]  
  173. 00CC15A2  mov         ecx,39h  
  174. 00CC15A7  mov         eax,0CCCCCCCCh  
  175. 00CC15AC  rep stos    dword ptr es:[edi]  
  176.     register int *p1, *p2;
  177.     register int i;
  178.     for( i = 0, p1 = x, p2 = y; i < SIZE; i++)
  179. 00CC15AE  mov         dword ptr [i],0  
  180. 00CC15B5  mov         dword ptr [p1],offset x (0CC7210h)  
  181. 00CC15BC  mov         dword ptr [p2],offset y (0CC7148h)  
  182. 00CC15C3  jmp         try4+3Eh (0CC15CEh)  
  183. 00CC15C5  mov         eax,dword ptr [i]  
  184. 00CC15C8  add         eax,1  
  185. 00CC15CB  mov         dword ptr [i],eax  
  186. 00CC15CE  cmp         dword ptr [i],32h  
  187. 00CC15D2  jge         try4+62h (0CC15F2h)  
  188.     {
  189.         *p1++ = *p2++;
  190. 00CC15D4  mov         eax,dword ptr [p1]  
  191. 00CC15D7  mov         ecx,dword ptr [p2]  
  192. 00CC15DA  mov         edx,dword ptr [ecx]  
  193. 00CC15DC  mov         dword ptr [eax],edx  
  194. 00CC15DE  mov         eax,dword ptr [p1]  
  195. 00CC15E1  add         eax,4  
  196. 00CC15E4  mov         dword ptr [p1],eax  
  197. 00CC15E7  mov         ecx,dword ptr [p2]  
  198. 00CC15EA  add         ecx,4  
  199. 00CC15ED  mov         dword ptr [p2],ecx  
  200.     }
  201. 00CC15F0  jmp         try4+35h (0CC15C5h)  
  202. }
  203. 00CC15F2  pop         edi  
  204. 00CC15F3  pop         esi  
  205. 00CC15F4  pop         ebx  
  206. 00CC15F5  mov         esp,ebp  
  207. 00CC15F7  pop         ebp  
  208. 00CC15F8  ret  
  209. ============================================
  210. void try5 ()
  211. {
  212. 00EB13C0  push        ebp  
  213. 00EB13C1  mov         ebp,esp  
  214. 00EB13C3  sub         esp,0D8h  
  215. 00EB13C9  push        ebx  
  216. 00EB13CA  push        esi  
  217. 00EB13CB  push        edi  
  218. 00EB13CC  lea         edi,[ebp-0D8h]  
  219. 00EB13D2  mov         ecx,36h  
  220. 00EB13D7  mov         eax,0CCCCCCCCh  
  221. 00EB13DC  rep stos    dword ptr es:[edi]  
  222.     register int *p1,*p2;
  223.     for( p1 = x, p2 = y; p1 < &x[SIZE];)
  224. 00EB13DE  mov         dword ptr [p1],offset x (0EB7210h)  
  225. 00EB13E5  mov         dword ptr [p2],offset y (0EB7148h)  
  226. 00EB13EC  cmp         dword ptr [p1],offset x+0C8h (0EB72D8h)  
  227. 00EB13F3  jae         try5+53h (0EB1413h)  
  228.     {
  229.         *p1++ = *p2++;
  230. 00EB13F5  mov         eax,dword ptr [p1]  
  231. 00EB13F8  mov         ecx,dword ptr [p2]  
  232. 00EB13FB  mov         edx,dword ptr [ecx]  
  233. 00EB13FD  mov         dword ptr [eax],edx  
  234. 00EB13FF  mov         eax,dword ptr [p1]  
  235. 00EB1402  add         eax,4  
  236. 00EB1405  mov         dword ptr [p1],eax  
  237. 00EB1408  mov         ecx,dword ptr [p2]  
  238. 00EB140B  add         ecx,4  
  239. 00EB140E  mov         dword ptr [p2],ecx  
  240.     }
  241. 00EB1411  jmp         try5+2Ch (0EB13ECh)  
  242. }
  243. 00EB1413  pop         edi  
  244. 00EB1414  pop         esi  
  245. 00EB1415  pop         ebx  
  246. 00EB1416  mov         esp,ebp  
  247. 00EB1418  pop         ebp  
  248. 00EB1419  ret  
  249. ======================================
  250. ======================================
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-16 18:16:17 | 显示全部楼层
C与指针一书中指出:以上各例 运行在Motorola 68000上时 try5数组速度最快,但是用我的vs2010编译后发现try1占尽各种优势
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
头像被屏蔽
发表于 2011-5-16 19:59:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 19:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表