products/Sources/formale Sprachen/C/Linux/Documentation/devicetree/bindings/arm/   (Linux Kernel Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 16 kB image not shown  

Quelle  mpi_i86pc.s  Sprache: unbekannt

 
/
/ This Source Code Form is subject to the terms of the Mozilla Public
/ License, v. 2.0. If a copy of the MPL was not distributed with this
/ file, You can obtain one at http://mozilla.org/MPL/2.0/.

.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,@function
s_mpv_mul_d:
    push   %ebp
    mov    %esp,%ebp
    sub    $28,%esp
    push   %edi
    push   %esi
    push   %ebx
    movl   $0,%ebx  / carry = 0
    mov    12(%ebp),%ecx / ecx = a_len
    mov    20(%ebp),%edi
    cmp    $0,%ecx
    je     L2   / jmp if a_len == 0
    mov    8(%ebp),%esi  / esi = a
    cld
L1:
    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    L1   / jmp if a_len != 0
L2:
    mov    %ebx,0(%edi)  / *c = carry
    pop    %ebx
    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,@function
s_mpv_mul_d_add:
    push   %ebp
    mov    %esp,%ebp
    sub    $28,%esp
    push   %edi
    push   %esi
    push   %ebx
    movl   $0,%ebx  / carry = 0
    mov    12(%ebp),%ecx / ecx = a_len
    mov    20(%ebp),%edi
    cmp    $0,%ecx
    je     L4   / jmp if a_len == 0
    mov    8(%ebp),%esi  / esi = a
    cld
L3:
    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    L3   / jmp if a_len != 0
L4:
    mov    %ebx,0(%edi)  / *c = carry
    pop    %ebx
    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,@function
s_mpv_mul_d_add_prop:
    push   %ebp
    mov    %esp,%ebp
    sub    $28,%esp
    push   %edi
    push   %esi
    push   %ebx
    movl   $0,%ebx  / carry = 0
    mov    12(%ebp),%ecx / ecx = a_len
    mov    20(%ebp),%edi
    cmp    $0,%ecx
    je     L6   / jmp if a_len == 0
    cld
    mov    8(%ebp),%esi  / esi = a
L5:
    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    L5   / jmp if a_len != 0
L6:
    cmp    $0,%ebx  / is carry zero?
    jz     L8
    mov    0(%edi),%eax  / add in current word from *c
    add    %ebx,%eax
    stosl   / [es:edi] = ax; edi += 4;
    jnc    L8
L7:
    mov    0(%edi),%eax  / add in current word from *c
    adc    $0,%eax
    stosl   / [es:edi] = ax; edi += 4;
    jc     L7
L8:
    pop    %ebx
    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,@function
s_mpv_sqr_add_prop:
     push   %ebp
     mov    %esp,%ebp
     sub    $12,%esp
     push   %edi
     push   %esi
     push   %ebx
     movl   $0,%ebx  / carry = 0
     mov    12(%ebp),%ecx / a_len
     mov    16(%ebp),%edi / edi = ps
     cmp    $0,%ecx
     je     L11   / jump if a_len == 0
     cld
     mov    8(%ebp),%esi / esi = pa
L10:
     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    L10   / jmp if a_len != 0
L11:
    cmp    $0,%ebx  / is carry zero?
    jz     L14
    mov    0(%edi),%eax  / add in current word from *c
    add    %ebx,%eax
    stosl   / [es:edi] = ax; edi += 4;
    jnc    L14
L12:
    mov    0(%edi),%eax  / add in current word from *c
    adc    $0,%eax
    stosl   / [es:edi] = ax; edi += 4;
    jc     L12
L14:
    pop    %ebx
    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)

 /  esp +  0:   Caller's ebx
 /  esp +  4: return address
 /  esp +  8: Nhi argument
 /  esp + 12: Nlo argument
 /  esp + 16: divisor argument
 /  esp + 20: qp argument
 /  esp + 24:   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,@function
s_mpv_div_2dx1d:
       push   %ebx
       mov    8(%esp),%edx
       mov    12(%esp),%eax
       mov    16(%esp),%ebx
       div    %ebx
       mov    20(%esp),%ebx
       mov    %eax,0(%ebx)
       mov    24(%esp),%ebx
       mov    %edx,0(%ebx)
       xor    %eax,%eax  / return zero
       pop    %ebx
       ret    
       nop
  

Messung V0.5 in Prozent
C=99 H=100 G=99

[zur Elbe Produktseite wechseln0.16QuellennavigatorsAnalyse erneut starten2026-10-11]