memmove.s
来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· S 代码 · 共 121 行
S
121 行
TEXT memmove(SB), $0 MOVL n+8(FP), R0 /* count */ BEQ return BGT ok MOVL 0, R0ok: MOVL s1+0(FP), A2 /* dest pointer */ MOVL s2+4(FP), A1 /* source pointer */ CMPL A2,A1 BHI back/* * byte-at-a-time foreward copy to * get source (A1) alligned. */f1: MOVL A1, R1 ANDL $3, R1 BEQ f2 SUBL $1, R0 BLT return MOVB (A1)+, (A2)+ BRA f1/* * check that dest is alligned * if not, just go byte-at-a-time */f2: MOVL A2, R1 ANDL $3, R1 BEQ f3 SUBL $1, R0 BLT return BRA f5/* * quad-long-at-a-time forward copy */f3: SUBL $16, R0 BLT f4 MOVL (A1)+, (A2)+ MOVL (A1)+, (A2)+ MOVL (A1)+, (A2)+ MOVL (A1)+, (A2)+ BRA f3/* * cleanup byte-at-a-time */f4: ADDL $15, R0 BLT returnf5: MOVB (A1)+, (A2)+ SUBL $1, R0 BGE f5 BRA returnreturn: MOVL s1+0(FP),R0 RTS/* * everything the same, but * copy backwards */back: ADDL R0, A1 ADDL R0, A2/* * byte-at-a-time backward copy to * get source (A1) alligned. */b1: MOVL A1, R1 ANDL $3, R1 BEQ b2 SUBL $1, R0 BLT return MOVB -(A1), -(A2) BRA b1/* * check that dest is alligned * if not, just go byte-at-a-time */b2: MOVL A2, R1 ANDL $3, R1 BEQ b3 SUBL $1, R0 BLT return BRA b5/* * quad-long-at-a-time backward copy */b3: SUBL $16, R0 BLT b4 MOVL -(A1), -(A2) MOVL -(A1), -(A2) MOVL -(A1), -(A2) MOVL -(A1), -(A2) BRA b3/* * cleanup byte-at-a-time backward */b4: ADDL $15, R0 BLT returnb5: MOVB -(A1), -(A2) SUBL $1, R0 BGE b5 BRA return
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?