📄 memmove.s
字号:
TEXT memmove(SB), $0 JMP move TEXT memcpy(SB), $0move: MOVW R1, s1+0(FP) MOVW n+8(FP), R3 /* R3 is count */ MOVW R1, R4 /* R4 is to-pointer */ SGT R0, R3, R5 BEQ R5, ok MOVW (R0), R0 /* abort if negative count */ok: MOVW s2+4(FP), R5 /* R5 is from-pointer */ ADDU R3,R5, R7 /* R7 is end from-pointer */ ADDU R3,R4, R6 /* R6 is end to-pointer *//* * easiest test is copy backwards if * destination string has higher mem address */ SGT $4,R3, R2 SGTU R4,R5, R1 BNE R1, back/* * if not at least 4 chars, * dont even mess around. * 3 chars to guarantee any * rounding up to a word * boundary and 4 characters * to get at least maybe one * full word store. */ BNE R2, fout/* * test if both pointers * are similarly word aligned */ XOR R4,R5, R1 AND $3, R1 BNE R1, fout/* * byte at a time to word align */f1: AND $3,R4, R1 BEQ R1, f2 MOVB 0(R5), R8 ADDU $1, R5 MOVB R8, 0(R4) ADDU $1, R4 JMP f1/* * turn R3 into to-end pointer-15 * copy 16 at a time while theres room. * R6 is smaller than R7 -- * there are problems if R7 is 0. */f2: ADDU $-15,R6, R3f3: SGTU R3,R4, R1 BEQ R1, f4 MOVW 0(R5), R8 MOVW 4(R5), R9 MOVW R8, 0(R4) MOVW 8(R5), R8 MOVW R9, 4(R4) MOVW 12(R5), R9 ADDU $16, R5 MOVW R8, 8(R4) MOVW R9, 12(R4) ADDU $16, R4 JMP f3/* * turn R3 into to-end pointer-3 * copy 4 at a time while theres room */f4: ADDU $-3,R6, R3f5: SGTU R3,R4, R1 BEQ R1, fout MOVW 0(R5), R8 ADDU $4, R5 MOVW R8, 0(R4) ADDU $4, R4 JMP f5/* * last loop, copy byte at a time */fout: BEQ R7,R5, ret MOVB 0(R5), R8 ADDU $1, R5 MOVB R8, 0(R4) ADDU $1, R4 JMP fout/* * whole thing repeated for backwards */back: BNE R2, bout XOR R6,R7, R1 AND $3, R1 BNE R1, boutb1: AND $3,R7, R1 BEQ R1, b2 MOVB -1(R7), R8 ADDU $-1, R7 MOVB R8, -1(R6) ADDU $-1, R6 JMP b1b2: ADDU $15,R5, R3b3: SGTU R7,R3, R1 BEQ R1, b4 MOVW -4(R7), R8 MOVW -8(R7), R9 MOVW R8, -4(R6) MOVW -12(R7), R8 MOVW R9, -8(R6) MOVW -16(R7), R9 ADDU $-16, R7 MOVW R8, -12(R6) MOVW R9, -16(R6) ADDU $-16, R6 JMP b3b4: ADDU $3,R5, R3b5: SGTU R7,R3, R1 BEQ R1, bout MOVW -4(R7), R8 ADDU $-4, R7 MOVW R8, -4(R6) ADDU $-4, R6 JMP b5bout: BEQ R7,R5, ret MOVB -1(R7), R8 ADDU $-1, R7 MOVB R8, -1(R6) ADDU $-1, R6 JMP boutret: MOVW s1+0(FP), R1 RET END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -