Recently I try to reverse piece of assembly code that written for C166/C167 Arch. But I have a problem with some places for convert to C code, such as:

mov     r9, #4
add     r9, r0
mov     r12, #0FFFFh
mov     r4, r9
add     r4, #2
calls   0, sub_37C2
mov     r13, r4
mov     r14, r5
mov     r15, #6
calls   0, CRC_16_Calculate

and in sub_37C2 :

mov     r5, r4
shr     r5, #14
shl     r5, #1
mov     r5, [r5+0FE00h] ; ==> Or DPP0
bmov    r4.14, r5.0
bmov    r4.15, r5.1
shr     r5, #2

also in CRC_16_Calculate:

mov     r4, r13
mov     r5, r14
add     r13, #1
addc    r14, #0
exts    r5, #1
movb    rl3, [r4]
movbz   r7, rl3

I guess in sub_37C2 code try to convert the near address to far. But I can't convert this to C code correctly. My CRC16 implementation shown below:

static uint16_t Crc16(uint8_t* cBuffer, uint16_t iBufLen, uint16_t wPreset)
    uint16_t temp;
    while (iBufLen--)
        temp = *cBuffer++;
        for (uint8_t j = 0; j < 8; ++j)
            if ((wPreset ^ temp) & 0x01) wPreset = (wPreset >> 1) ^ 0xA001;
            else wPreset >>= 1;
            temp >>= 1;
    return wPreset;

As you see, I convert loc_29A4 to temp = *cBuffer++ where temp is uint16 but cBuffer is uint8_t

  • What is your question?
    – Igor Skochinsky
    Commented Aug 26, 2020 at 17:34
  • Actually, I wanna to calculate the first address of an array that [r5+DPP0] pointing them.
    – Unicornux
    Commented Aug 28, 2020 at 11:12


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.