📄 crc.s
字号:
SECTION .bss
;#define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */
_CRC32_PLOY equ 0x04c11db7
;u_long crc32_table[256];
.type _CRC32_TABLE,@object
.size _CRC32_TABLE,4
XDEF _CRC32_TABLE
_CRC32_TABLE DS.B 1024
SECTION .text
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* */
;/* init_crc32 */
;/* */
;/* DESCRIPTION */
;/* */
;/* This function builds auxiliary table for parallel */
;/* byte-at-a-time CRC-32. */
;/* */
;/* AUTHOR */
;/* */
;/* Xiaohuan Zhang, Start Network Technology CO., LTD. */
;/* */
;/* CALLED BY */
;/* */
;/* INT_Initialize Initialize system */
;/* */
;/* CALLS */
;/* */
;/* None */
;/* */
;/* INPUTS */
;/* */
;/* None */
;/* */
;/* OUTPUTS */
;/* */
;/* available values of CRC32_TABLE */
;/* */
;/* HISTORY */
;/* */
;/* NAME DATE REMARKS */
;/* */
;/* X. Zhang 10-09-2000 Created and verified version 1.0 */
;/* */
;/*************************************************************************/
ALIGN 4
XDEF _init_crc32
_init_crc32:
; void init_crc32(void)
; {
MOVE.L D7,-(A7) ; D7 = c
MOVE.L #_CRC32_TABLE,A0
MOVE.L D6,-(A7) ; D6 = i
; int i, j;
; u_long c;
;
; for (i = 0; i < 256; ++i) {
MOVEQ #0,D6
MOVE.L #256,D0
_init_crc32_loop:
; for (c = i << 24, j = 8; j > 0; --j)
MOVE.L D6,D7
MOVEQ #24,D1
LSL.L D1,D7 ;c = i << 24
MOVEQ #8,D1
_init_crc32_subloop:
; c = (c & 0x80000000) ? (c << 1) ^ CRC32_POLY : (c << 1);
TST.L D7
JPL _init_crc32_plus ; test c&0x80000000
ADD.L D7,D7 ; c << 1
EOR.L #_CRC32_PLOY,D7 ; ^CRC32_PLOY
JRA _init_crc32_subloop_end
_init_crc32_plus:
ADD.L D7,D7 ; c << 1
_init_crc32_subloop_end:
SUBQ.L #1,D1 ; --j
JNE _init_crc32_subloop
; crc32_table[i] = c;
MOVE.L D7,(A0)+ ; crc32_table[i] = c
ADDQ.L #1,D6 ; ++i
CMP.L D0,D6
JLT _init_crc32_loop
; }
; }
MOVE.L (A7)+,D6
MOVE.L (A7)+,D7
RTS
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* */
;/* crc32 */
;/* */
;/* DESCRIPTION */
;/* */
;/* This function Calculates string's CRC32 . */
;/* */
;/* AUTHOR */
;/* */
;/* Xiaohuan Zhang, Start Network Technology CO., LTD. */
;/* */
;/* CALLED BY */
;/* */
;/* INT_Initialize Initialize system */
;/* */
;/* CALLS */
;/* */
;/* None */
;/* */
;/* INPUTS */
;/* */
;/* buf String */
;/* len String's length */
;/* */
;/* OUTPUTS */
;/* */
;/* CRC32 of string */
;/* */
;/* HISTORY */
;/* */
;/* NAME DATE REMARKS */
;/* */
;/* X. Zhang 10-09-2000 Created and verified version 1.0 */
;/* */
;/*************************************************************************/
ALIGN 4
XDEF _crc32
_crc32:
; u_long crc32(u_char *buf, int len)
; {
LEA -12(A7),A7
MOVEM.L D6/D7/A5,(A7)
MOVE.L 16(A7),A1 ; A1 = buf
MOVE.L 20(A7),D6 ; D6 = len
MOVE.L #_CRC32_TABLE,A5
; u_char *p;
; u_long crc;
;
; crc = 0xffffffff; /* preload shift register, per CRC-32 spec */
MOVEQ #-1,D7
; for (p = buf; len > 0; ++p, --len)
TST.L D6
JLE _crc32_end
_crc32_loop:
; crc = (crc << 8) ^ crc32_table[(crc >> 24) ^ *p];
MOVE.L D7,D1
MOVEQ #24,D0
LSR.L D0,D1
MOVEQ #0,D0
MOVE.B (A1)+,D0
EOR.L D0,D1
MOVE.L (A5,D1*4),D1
MOVE.L D7,D0
LSL.L #8,D0
EOR.L D1,D0
MOVE.L D0,D7
SUBQ.L #1,D6
JNE _crc32_loop
_crc32_end:
; return crc; /* transmit complement, per CRC-32 spec */
MOVE.L D7,D0
; }
MOVEM.L (A7),D6/D7/A5
LEA 12(A7),A7
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -