mpi_x86.s
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· S 代码 · 共 333 行
S
333 行
# # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Netscape security libraries. # # The Initial Developer of the Original Code is Netscape # Communications Corporation. Portions created by Netscape are # Copyright (C) 2000 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): # # Alternatively, the contents of this file may be used under the # terms of the GNU General Public License Version 2 or later (the # "GPL"), in which case the provisions of the GPL are applicable # instead of those above. If you wish to allow use of your # version of this file only under the terms of the GPL and not to # allow others to use your version of this file under the MPL, # indicate your decision by deleting the provisions above and # replace them with the notice and other provisions required by # the GPL. If you do not delete the provisions above, a recipient # may use your version of this file under either the MPL or the # GPL. # $Id: mpi_x86.s,v 1.2 2000/08/31 03:45:39 nelsonb%netscape.com Exp $ #.text # ebp - 36: caller's esi # ebp - 32: caller's edi # ebp - 28: # ebp - 24: # ebp - 20: # ebp - 16: # ebp - 12: # ebp - 8: # ebp - 4: # ebp + 0: caller's ebp # ebp + 4: return address # ebp + 8: a argument # ebp + 12: a_len argument # ebp + 16: b argument # ebp + 20: c argument # registers: # eax: # ebx: carry # ecx: a_len # edx: # esi: a ptr # edi: c ptr.globl s_mpv_mul_d.type s_mpv_mul_d,@functions_mpv_mul_d: push %ebp mov %esp,%ebp sub $28,%esp push %edi push %esi movl $0,%ebx # carry = 0 mov 12(%ebp),%ecx # ecx = a_len mov 20(%ebp),%edi cmp $0,%ecx je 2f # jmp if a_len == 0 mov 8(%ebp),%esi # esi = a cld1: lodsl # eax = [ds:esi]; esi += 4 mov 16(%ebp),%edx # edx = b mull %edx # edx:eax = Phi:Plo = a_i * b add %ebx,%eax # add carry (%ebx) to edx:eax adc $0,%edx mov %edx,%ebx # high half of product becomes next carry stosl # [es:edi] = ax; edi += 4; dec %ecx # --a_len jnz 1b # jmp if a_len != 02: mov %ebx,0(%edi) # *c = carry pop %esi pop %edi leave ret nop # ebp - 36: caller's esi # ebp - 32: caller's edi # ebp - 28: # ebp - 24: # ebp - 20: # ebp - 16: # ebp - 12: # ebp - 8: # ebp - 4: # ebp + 0: caller's ebp # ebp + 4: return address # ebp + 8: a argument # ebp + 12: a_len argument # ebp + 16: b argument # ebp + 20: c argument # registers: # eax: # ebx: carry # ecx: a_len # edx: # esi: a ptr # edi: c ptr.globl s_mpv_mul_d_add.type s_mpv_mul_d_add,@functions_mpv_mul_d_add: push %ebp mov %esp,%ebp sub $28,%esp push %edi push %esi movl $0,%ebx # carry = 0 mov 12(%ebp),%ecx # ecx = a_len mov 20(%ebp),%edi cmp $0,%ecx je 4f # jmp if a_len == 0 mov 8(%ebp),%esi # esi = a cld3: lodsl # eax = [ds:esi]; esi += 4 mov 16(%ebp),%edx # edx = b mull %edx # edx:eax = Phi:Plo = a_i * b add %ebx,%eax # add carry (%ebx) to edx:eax adc $0,%edx mov 0(%edi),%ebx # add in current word from *c add %ebx,%eax adc $0,%edx mov %edx,%ebx # high half of product becomes next carry stosl # [es:edi] = ax; edi += 4; dec %ecx # --a_len jnz 3b # jmp if a_len != 04: mov %ebx,0(%edi) # *c = carry pop %esi pop %edi leave ret nop # ebp - 36: caller's esi # ebp - 32: caller's edi # ebp - 28: # ebp - 24: # ebp - 20: # ebp - 16: # ebp - 12: # ebp - 8: # ebp - 4: # ebp + 0: caller's ebp # ebp + 4: return address # ebp + 8: a argument # ebp + 12: a_len argument # ebp + 16: b argument # ebp + 20: c argument # registers: # eax: # ebx: carry # ecx: a_len # edx: # esi: a ptr # edi: c ptr.globl s_mpv_mul_d_add_prop.type s_mpv_mul_d_add_prop,@functions_mpv_mul_d_add_prop: push %ebp mov %esp,%ebp sub $28,%esp push %edi push %esi movl $0,%ebx # carry = 0 mov 12(%ebp),%ecx # ecx = a_len mov 20(%ebp),%edi cmp $0,%ecx je 6f # jmp if a_len == 0 cld mov 8(%ebp),%esi # esi = a5: lodsl # eax = [ds:esi]; esi += 4 mov 16(%ebp),%edx # edx = b mull %edx # edx:eax = Phi:Plo = a_i * b add %ebx,%eax # add carry (%ebx) to edx:eax adc $0,%edx mov 0(%edi),%ebx # add in current word from *c add %ebx,%eax adc $0,%edx mov %edx,%ebx # high half of product becomes next carry stosl # [es:edi] = ax; edi += 4; dec %ecx # --a_len jnz 5b # jmp if a_len != 06: cmp $0,%ebx # is carry zero? jz 8f mov 0(%edi),%eax # add in current word from *c add %ebx,%eax stosl # [es:edi] = ax; edi += 4; jnc 8f7: mov 0(%edi),%eax # add in current word from *c adc $0,%eax stosl # [es:edi] = ax; edi += 4; jc 7b8: pop %esi pop %edi leave ret nop # ebp - 20: caller's esi # ebp - 16: caller's edi # ebp - 12: # ebp - 8: carry # ebp - 4: a_len local # ebp + 0: caller's ebp # ebp + 4: return address # ebp + 8: pa argument # ebp + 12: a_len argument # ebp + 16: ps argument # ebp + 20: # registers: # eax: # ebx: carry # ecx: a_len # edx: # esi: a ptr # edi: c ptr.globl s_mpv_sqr_add_prop.type s_mpv_sqr_add_prop,@functions_mpv_sqr_add_prop: push %ebp mov %esp,%ebp sub $12,%esp push %edi push %esi movl $0,%ebx # carry = 0 mov 12(%ebp),%ecx # a_len mov 16(%ebp),%edi # edi = ps cmp $0,%ecx je 11f # jump if a_len == 0 cld mov 8(%ebp),%esi # esi = pa10: lodsl # %eax = [ds:si]; si += 4; mull %eax add %ebx,%eax # add "carry" adc $0,%edx mov 0(%edi),%ebx add %ebx,%eax # add low word from result mov 4(%edi),%ebx stosl # [es:di] = %eax; di += 4; adc %ebx,%edx # add high word from result movl $0,%ebx mov %edx,%eax adc $0,%ebx stosl # [es:di] = %eax; di += 4; dec %ecx # --a_len jnz 10b # jmp if a_len != 011: cmp $0,%ebx # is carry zero? jz 14f mov 0(%edi),%eax # add in current word from *c add %ebx,%eax stosl # [es:edi] = ax; edi += 4; jnc 14f12: mov 0(%edi),%eax # add in current word from *c adc $0,%eax stosl # [es:edi] = ax; edi += 4; jc 12b14: pop %esi pop %edi leave ret nop # # Divide 64-bit (Nhi,Nlo) by 32-bit divisor, which must be normalized # so its high bit is 1. This code is from NSPR. # # mp_err s_mpv_div_2dx1d(mp_digit Nhi, mp_digit Nlo, mp_digit divisor, # mp_digit *qp, mp_digit *rp) # Dump of assembler code for function s_mpv_div_2dx1d: # # esp + 0: return address # esp + 4: Nhi argument # esp + 8: Nlo argument # esp + 12: divisor argument # esp + 16: qp argument # esp + 20: rp argument # registers: # eax: # ebx: carry # ecx: a_len # edx: # esi: a ptr # edi: c ptr # .globl s_mpv_div_2dx1d.type s_mpv_div_2dx1d,@functions_mpv_div_2dx1d: mov 4(%esp),%edx mov 8(%esp),%eax mov 12(%esp),%ebx div %ebx mov 16(%esp),%ebx mov %eax,0(%ebx) mov 20(%esp),%ebx mov %edx,0(%ebx) xor %eax,%eax # return zero ret nop
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?