github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/crypto/rc4/rc4_386.s (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // func xorKeyStream(dst, src *byte, n int, state *[256]byte, i, j *uint8)
     6  TEXT ·xorKeyStream(SB),7,$0
     7  	MOVL dst+0(FP), DI
     8  	MOVL src+4(FP), SI
     9  	MOVL state+12(FP), BP
    10  
    11  	MOVL i+16(FP), AX
    12  	MOVBLZX (AX), AX
    13  	MOVL j+20(FP), BX
    14  	MOVBLZX (BX), BX
    15  	CMPL n+8(FP), $0
    16  	JEQ done
    17  
    18  loop:
    19  	// i += 1
    20  	INCB AX
    21  
    22  	// j += c.s[i]
    23  	MOVBLZX (BP)(AX*4), DX
    24  	ADDB DX, BX
    25  	MOVBLZX BX, BX
    26  
    27  	// c.s[i], c.s[j] = c.s[j], c.s[i]
    28  	MOVBLZX (BP)(BX*4), CX
    29  	MOVB CX, (BP)(AX*4)
    30  	MOVB DX, (BP)(BX*4)
    31  
    32  	// *dst = *src ^ c.s[c.s[i]+c.s[j]]
    33  	ADDB DX, CX
    34  	MOVBLZX CX, CX
    35  	MOVB (BP)(CX*4), CX
    36  	XORB (SI), CX
    37  	MOVBLZX CX, CX
    38  	MOVB CX, (DI)
    39  
    40  	INCL SI
    41  	INCL DI
    42  	DECL n+8(FP)
    43  	JNE loop
    44  
    45  done:
    46  	MOVL i+16(FP), CX
    47  	MOVB AX, (CX)
    48  	MOVL j+20(FP), CX
    49  	MOVB BX, (CX)
    50  
    51  	RET