mpi_x86.asm
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1. ;
  2. ;  mpi_x86.asm - assembly language implementation of s_mpv_ functions.
  3. ;  The contents of this file are subject to the Mozilla Public
  4. ;  License Version 1.1 (the "License"); you may not use this file
  5. ;  except in compliance with the License. You may obtain a copy of
  6. ;  the License at http://www.mozilla.org/MPL/
  7. ;  
  8. ;  Software distributed under the License is distributed on an "AS
  9. ;  IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10. ;  implied. See the License for the specific language governing
  11. ;  rights and limitations under the License.
  12. ;  
  13. ;  The Original Code is the Netscape security libraries.
  14. ;  
  15. ;  The Initial Developer of the Original Code is Netscape
  16. ;  Communications Corporation. Portions created by Netscape are 
  17. ;  Copyright (C) 2000 Netscape Communications Corporation.  All
  18. ;  Rights Reserved.
  19. ;  
  20. ;  Contributor(s):
  21. ;  
  22. ;  Alternatively, the contents of this file may be used under the
  23. ;  terms of the GNU General Public License Version 2 or later (the
  24. ;  "GPL"), in which case the provisions of the GPL are applicable 
  25. ;  instead of those above. If you wish to allow use of your 
  26. ;  version of this file only under the terms of the GPL and not to
  27. ;  allow others to use your version of this file under the MPL,
  28. ;  indicate your decision by deleting the provisions above and
  29. ;  replace them with the notice and other provisions required by
  30. ;  the GPL.  If you do not delete the provisions above, a recipient
  31. ;  may use your version of this file under either the MPL or the
  32. ;  GPL.
  33. ;   $Id: mpi_x86.asm,v 1.1 2000/09/02 05:33:15 nelsonb%netscape.com Exp $
  34. .386p
  35. .MODEL FLAT
  36. ASSUME  CS: FLAT, DS: FLAT, SS: FLAT
  37. _TEXT   SEGMENT
  38. ;   ebp - 36: caller's esi
  39. ;   ebp - 32: caller's edi
  40. ;   ebp - 28:
  41. ;   ebp - 24:
  42. ;   ebp - 20:
  43. ;   ebp - 16:
  44. ;   ebp - 12:
  45. ;   ebp - 8:
  46. ;   ebp - 4:
  47. ;   ebp + 0: caller's ebp
  48. ;   ebp + 4: return address
  49. ;   ebp + 8: a argument
  50. ;   ebp + 12: a_len argument
  51. ;   ebp + 16: b argument
  52. ;   ebp + 20: c argument
  53. ;   registers:
  54. ;   eax:
  55. ;  ebx: carry
  56. ;  ecx: a_len
  57. ;  edx:
  58. ;  esi: a ptr
  59. ;  edi: c ptr
  60. public _s_mpv_mul_d
  61. _s_mpv_mul_d PROC NEAR
  62.     push   ebp
  63.     mov    ebp,esp
  64.     sub    esp,28
  65.     push   edi
  66.     push   esi
  67.     push   ebx
  68.     mov    ebx,0 ; carry = 0
  69.     mov    ecx,[ebp+12] ; ecx = a_len
  70.     mov    edi,[ebp+20]
  71.     cmp    ecx,0
  72.     je     L_2 ; jmp if a_len == 0
  73.     mov    esi,[ebp+8] ; esi = a
  74.     cld
  75. L_1:
  76.     lodsd ; eax = [ds:esi]; esi += 4
  77.     mov    edx,[ebp+16] ; edx = b
  78.     mul    edx ; edx:eax = Phi:Plo = a_i * b
  79.     add    eax,ebx ; add carry (ebx) to edx:eax
  80.     adc    edx,0
  81.     mov    ebx,edx ; high half of product becomes next carry
  82.     stosd ; [es:edi] = ax; edi += 4;
  83.     dec    ecx ; --a_len
  84.     jnz    L_1 ; jmp if a_len != 0
  85. L_2:
  86.     mov    [edi],ebx ; *c = carry
  87.     pop    ebx
  88.     pop    esi
  89.     pop    edi
  90.     leave  
  91.     ret    
  92.     nop
  93. _s_mpv_mul_d ENDP
  94. ;   ebp - 36: caller's esi
  95. ;   ebp - 32: caller's edi
  96. ;   ebp - 28:
  97. ;   ebp - 24:
  98. ;   ebp - 20:
  99. ;   ebp - 16:
  100. ;   ebp - 12:
  101. ;   ebp - 8:
  102. ;   ebp - 4:
  103. ;   ebp + 0: caller's ebp
  104. ;   ebp + 4: return address
  105. ;   ebp + 8: a argument
  106. ;   ebp + 12: a_len argument
  107. ;   ebp + 16: b argument
  108. ;   ebp + 20: c argument
  109. ;   registers:
  110. ;   eax:
  111. ;  ebx: carry
  112. ;  ecx: a_len
  113. ;  edx:
  114. ;  esi: a ptr
  115. ;  edi: c ptr
  116. public _s_mpv_mul_d_add
  117. _s_mpv_mul_d_add PROC NEAR
  118.     push   ebp
  119.     mov    ebp,esp
  120.     sub    esp,28
  121.     push   edi
  122.     push   esi
  123.     push   ebx
  124.     mov    ebx,0 ; carry = 0
  125.     mov    ecx,[ebp+12] ; ecx = a_len
  126.     mov    edi,[ebp+20]
  127.     cmp    ecx,0
  128.     je     L_4 ; jmp if a_len == 0
  129.     mov    esi,[ebp+8] ; esi = a
  130.     cld
  131. L_3:
  132.     lodsd ; eax = [ds:esi]; esi += 4
  133.     mov    edx,[ebp+16] ; edx = b
  134.     mul    edx ; edx:eax = Phi:Plo = a_i * b
  135.     add    eax,ebx ; add carry (ebx) to edx:eax
  136.     adc    edx,0
  137.     mov    ebx,[edi] ; add in current word from *c
  138.     add    eax,ebx
  139.     adc    edx,0
  140.     mov    ebx,edx ; high half of product becomes next carry
  141.     stosd ; [es:edi] = ax; edi += 4;
  142.     dec    ecx ; --a_len
  143.     jnz    L_3 ; jmp if a_len != 0
  144. L_4:
  145.     mov    [edi],ebx ; *c = carry
  146.     pop    ebx
  147.     pop    esi
  148.     pop    edi
  149.     leave  
  150.     ret    
  151.     nop
  152. _s_mpv_mul_d_add ENDP
  153. ;   ebp - 36: caller's esi
  154. ;   ebp - 32: caller's edi
  155. ;   ebp - 28:
  156. ;   ebp - 24:
  157. ;   ebp - 20:
  158. ;   ebp - 16:
  159. ;   ebp - 12:
  160. ;   ebp - 8:
  161. ;   ebp - 4:
  162. ;   ebp + 0: caller's ebp
  163. ;   ebp + 4: return address
  164. ;   ebp + 8: a argument
  165. ;   ebp + 12: a_len argument
  166. ;   ebp + 16: b argument
  167. ;   ebp + 20: c argument
  168. ;   registers:
  169. ;   eax:
  170. ;  ebx: carry
  171. ;  ecx: a_len
  172. ;  edx:
  173. ;  esi: a ptr
  174. ;  edi: c ptr
  175. public _s_mpv_mul_d_add_prop
  176. _s_mpv_mul_d_add_prop PROC NEAR
  177.     push   ebp
  178.     mov    ebp,esp
  179.     sub    esp,28
  180.     push   edi
  181.     push   esi
  182.     push   ebx
  183.     mov    ebx,0 ; carry = 0
  184.     mov    ecx,[ebp+12] ; ecx = a_len
  185.     mov    edi,[ebp+20]
  186.     cmp    ecx,0
  187.     je     L_6 ; jmp if a_len == 0
  188.     cld
  189.     mov    esi,[ebp+8] ; esi = a
  190. L_5:
  191.     lodsd ; eax = [ds:esi]; esi += 4
  192.     mov    edx,[ebp+16] ; edx = b
  193.     mul    edx ; edx:eax = Phi:Plo = a_i * b
  194.     add    eax,ebx ; add carry (ebx) to edx:eax
  195.     adc    edx,0
  196.     mov    ebx,[edi] ; add in current word from *c
  197.     add    eax,ebx
  198.     adc    edx,0
  199.     mov    ebx,edx ; high half of product becomes next carry
  200.     stosd ; [es:edi] = ax; edi += 4;
  201.     dec    ecx ; --a_len
  202.     jnz    L_5 ; jmp if a_len != 0
  203. L_6:
  204.     cmp    ebx,0 ; is carry zero?
  205.     jz     L_8
  206.     mov    eax,[edi] ; add in current word from *c
  207.     add    eax,ebx
  208.     stosd ; [es:edi] = ax; edi += 4;
  209.     jnc    L_8
  210. L_7:
  211.     mov    eax,[edi] ; add in current word from *c
  212.     adc    eax,0
  213.     stosd ; [es:edi] = ax; edi += 4;
  214.     jc     L_7
  215. L_8:
  216.     pop    ebx
  217.     pop    esi
  218.     pop    edi
  219.     leave  
  220.     ret    
  221.     nop
  222. _s_mpv_mul_d_add_prop ENDP
  223. ;   ebp - 20: caller's esi
  224. ;   ebp - 16: caller's edi
  225. ;   ebp - 12:
  226. ;   ebp - 8: carry
  227. ;   ebp - 4: a_len local
  228. ;   ebp + 0: caller's ebp
  229. ;   ebp + 4: return address
  230. ;   ebp + 8: pa argument
  231. ;   ebp + 12: a_len argument
  232. ;   ebp + 16: ps argument
  233. ;   ebp + 20:
  234. ;   registers:
  235. ;   eax:
  236. ;  ebx: carry
  237. ;  ecx: a_len
  238. ;  edx:
  239. ;  esi: a ptr
  240. ;  edi: c ptr
  241. public _s_mpv_sqr_add_prop
  242. _s_mpv_sqr_add_prop PROC NEAR
  243.      push   ebp
  244.      mov    ebp,esp
  245.      sub    esp,12
  246.      push   edi
  247.      push   esi
  248.      push   ebx
  249.      mov    ebx,0 ; carry = 0
  250.      mov    ecx,[ebp+12] ; a_len
  251.      mov    edi,[ebp+16] ; edi = ps
  252.      cmp    ecx,0
  253.      je     L_11 ; jump if a_len == 0
  254.      cld
  255.      mov    esi,[ebp+8] ; esi = pa
  256. L_10:
  257.      lodsd ; eax = [ds:si]; si += 4;
  258.      mul    eax
  259.      add    eax,ebx ; add "carry"
  260.      adc    edx,0
  261.      mov    ebx,[edi]
  262.      add    eax,ebx ; add low word from result
  263.      mov    ebx,[edi+4]
  264.      stosd ; [es:di] = eax; di += 4;
  265.      adc    edx,ebx ; add high word from result
  266.      mov    ebx,0
  267.      mov    eax,edx
  268.      adc    ebx,0
  269.      stosd ; [es:di] = eax; di += 4;
  270.      dec    ecx ; --a_len
  271.      jnz    L_10 ; jmp if a_len != 0
  272. L_11:
  273.     cmp    ebx,0 ; is carry zero?
  274.     jz     L_14
  275.     mov    eax,[edi] ; add in current word from *c
  276.     add    eax,ebx
  277.     stosd ; [es:edi] = ax; edi += 4;
  278.     jnc    L_14
  279. L_12:
  280.     mov    eax,[edi] ; add in current word from *c
  281.     adc    eax,0
  282.     stosd ; [es:edi] = ax; edi += 4;
  283.     jc     L_12
  284. L_14:
  285.     pop    ebx
  286.     pop    esi
  287.     pop    edi
  288.     leave  
  289.     ret    
  290.     nop
  291. _s_mpv_sqr_add_prop ENDP
  292. ;  Divide 64-bit (Nhi,Nlo) by 32-bit divisor, which must be normalized
  293. ;  so its high bit is 1.   This code is from NSPR.
  294. ;  mp_err s_mpv_div_2dx1d(mp_digit Nhi, mp_digit Nlo, mp_digit divisor,
  295. ;             mp_digit *qp, mp_digit *rp)
  296. ;  Dump of assembler code for function s_mpv_div_2dx1d:
  297. ;  
  298. ;   esp +  0:   Caller's ebx
  299. ;   esp +  4: return address
  300. ;   esp +  8: Nhi argument
  301. ;   esp + 12: Nlo argument
  302. ;   esp + 16: divisor argument
  303. ;   esp + 20: qp argument
  304. ;   esp + 24:   rp argument
  305. ;   registers:
  306. ;   eax:
  307. ;  ebx: carry
  308. ;  ecx: a_len
  309. ;  edx:
  310. ;  esi: a ptr
  311. ;  edi: c ptr
  312. ;  
  313. public _s_mpv_div_2dx1d
  314. _s_mpv_div_2dx1d PROC NEAR
  315.        push   ebx
  316.        mov    edx,[esp+8]
  317.        mov    eax,[esp+12]
  318.        mov    ebx,[esp+16]
  319.        div    ebx
  320.        mov    ebx,[esp+20]
  321.        mov    [ebx],eax
  322.        mov    ebx,[esp+24]
  323.        mov    [ebx],edx
  324.        xor    eax,eax ; return zero
  325.        pop    ebx
  326.        ret    
  327.        nop
  328. _s_mpv_div_2dx1d ENDP
  329. _TEXT ENDS
  330. END