2014-01-06 86 views
0

開始時我必須說我是mips assembly lanuguge以及Stackoverflow的新成員。MIPS MARS計算給定文本文件的crc。將crc 32更改爲crc 16和crc 8

我已經工作了這是計算CRC 32與給定的文本文件的查找表MIPS彙編語言代碼,我想改變它計算CRC 16和CRC 8

我幾乎可以肯定,對於所有情況,查找表都可以正確生成:crc 32,crc 16和crc 8.我知道我應該更改crc 16的​​初始化值,例如0xffff,但這還不夠。我認爲問題在於,在更改此值後,此算法會從查找表中找到錯誤的索引,對嗎?

在此先感謝您的幫助。

##### This subroutine first generates 256 words crc32 table for ASCII codes and then computes the actual crc32 checksum of the file 
input: 
$a1 = block 
$v0 = length 
output: 
$v0 = crc32 checksum 

crc32_checksum: 
    li  $t0, 0xedb88320   # CRC32 code generator 
    #li  $t0, 0xa001  # CRC16 code generator 
    #li  $t0, 0x8c  # CRC8 code generator 

    la  $t1, crc_tab  # address of the table to fill in 

    li  $t2, 0  # load 0 into $t2 

tab_gen: 
    move $t3, $t2  # move counter of 8 digit hex values packed into table to $t3 

    li $t4, 8  # digit/bit counter equals 8 

tab_byte: 
    and  $t5, $t3, 1  # AND data with 1 
    beqz $t5, shift  # branch to 'shift' if equal 0 

    srl  $t3, $t3, 1  # shift right data 
    xor  $t3, $t3, $t0 # XOR both values (shifted data with CRC polynomial) 
    b  next  # branch to next 

shift: 
    srl  $t3, $t3, 1  # shift right data 

next: 
    sub  $t4, $t4, 1  # decrese digit/bit counter 
    bnez $t4, tab_byte # branch if byte/bit counter is not equal to zero 

    sw  $t3, 0($t1)  # store 8 digit hex value 
    add  $t1, $t1, 4  # move to the next address to be fill 


    add  $t2, $t2, 1  # increase counter of 8 digit hex values packed into table 
    bltu $t2, 256, tab_gen # branch until 256 8 digit hex values are packed into table 


#### # Calculate the actual CRC32 

    li  $t0, 0xffffffff # initialize crc value for CRC32 code 
    #li  $t0, 0x0000  # initialize crc value for CRC16 code 
    #li  $t0, 0xffff  # initialize crc value for CRC16 code 
    #li  $t0, 0xff  # initialize crc value for CRC8 code 

    la  $t1, crc_tab  # point to crc_tab 

crc32: 
    lbu  $t2, 0($a1)  # load byte of data 
    add  $a1, $a1, 1  # advance the data pointer 
    xor  $t2, $t2, $t0 # byte of data XOR with crc 
    and  $t2, $t2, 0xff # (byte of data XOR with crc) AND with 0xff (to produce a table index) 
    sll  $t2, $t2, 2   # scale (*4) the index because of addressing 32-bit words 
    add  $t2, $t2, $t1 # form the final address in the table 

    lw  $t2, 0($t2)  # load a value from the table 
    srl  $t3, $t0, 8  # crc shifted 8 bits right 
    xor  $t0, $t2, $t3 # XOR both values (i.e. shifted crc and the value read from the table) 


    sub  $v0, $v0, 1  # decrement the byte counter 
    bnez $v0, crc32  # repeat untill all bytes of data are processed 

    not  $v0, $t0  # invert all bits of final crc 

    move $t7, $v0 

    jr  $ra  # jump to return address 
+0

我在這裏添加了生成ASCII碼的256個字crc32表的子程序。 我認爲這個CRC 32的實現是這樣完成的:[link] http://www.w3.org/TR/PNG-CRCAppendix.html 我說得對嗎? – user3165319

回答

0

首先,我建議你更好地定義你的目標。沒有單個「CRC 16」,也沒有單個「CRC 8」。看看這個table,然後決定你想實現哪種CRC16和CRC8。 (沒有額外的信息,我猜你對CCITT版本很感興趣,他們是我的經驗中最偏好的。)

一旦你知道你要去哪裏,試試看「ccitt 16 pseudocode」 16位算法。 Dr. Dobbs link是好的,以及this onethis one(雖然它更加面向硬件實現)。 8位算法可以進行類似的研究。嘗試「ccitt 8算法」。 This link是合理的。

一旦掌握了僞代碼,就可以更好地在彙編語言中實現它。

+0

感謝您的回覆。事情是我想實現任何版本的CRC 32位,16位和8位,但在一個相當緊湊的程序。 我也發現這樣的網站:[鏈接] http://www.sanity-free.com/12/crc32_implementation_in_csharp.html 有crc32,crc16和crc8的實現。 – user3165319