[[weird_mix]]
 

This page is under construction

Some asm code goes like this:

; by here the signs of R10 and R11 are known

; R11 is checked to be different from zero

0532A0:( 002) 1300     : LD R3, #0H
0532A2:( 002) 160F     : LD R6, #fH
0532A4:( 062) 8CFB 0000: CMPEQ R11, #0H
0532A8:( 160) D80D     : BRT rel_0532C4
0532AA:( 078) 9E84     : CLRSR Z0
rel_0532AC:  
0532AC:( 017) 8303     : ADD R3, R3
0532AE:( 017) 8A0A     : ADD R10, R10
0532B0:( 158) D001     : BRF rel_0532B4
0532B2:( 000) 0301     : ADD R3, #1H
rel_0532B4:  
0532B4:( 018) 831B     : SUB R3, R11
0532B6:( 158) D002     : BRF rel_0532BC
0532B8:( 000) 0A01     : ADD R10, #1H
0532BA:( 156) C801     : BRA rel_0532BE
rel_0532BC:   
0532BC:( 017) 830B     : ADD R3, R11
rel_0532BE:  
0532BE:( 154) C676     : BNZD R6, rel_0532AC
0532C0:( 081) 9E98     : NOP
0532C2:( 039) 87E6     : JMP A14 (Return)

The C equivalent is this

This code is wrong… Reason is that carry flag is incorrectly set.

bool carry(reg r0, reg r1) {
  return ((r0 & 0x8000) && (r1 & 0x8000));
}

int main(int argc, char **argv)
{
  reg r3, r10, r11;

  r10 = atoi(argv[1]);
  r11 = atoi(argv[2]);
  r3 = 0;

  if (r11 == 0) {
    printf("r11 = 0!\n");
    return 0;
  }
   
  printf("START : r3 = %4x, r10 = %4x, r11 = %4x  r3 = %6hd, r10 = %6hd, r11 = %6hd\n\n", r3, r10, r11,r3, r10, r11);


  bool t;
  for (int i = 0; i < 16; i++) {
    r3 *= 2;
    
    t = carry(r10, r10);
    r10 *= 2;
    
    if (t) {
      r3++;
    }
    t = carry(r3, -r11);
    r3 -= r11;
    if (t) {
      r3 += r11;
    } else {
      r10 += 1;
    }
  }

  printf("END  : r3 = %4x, r10 = %4x, r11 = %4x  r3 = %6hd, r10 = %6hd, r11 = %6hd\n\n", r3, r10, r11,r3, r10, r11);
  
  return EXIT_SUCCESS;
}

Problem is, how to you know what it does?

Since

  1. signs are checked and,
  2. an operand is checked for non zero

It looks like a division right? Except it obviously is NOT… Yet it is!

 
  weird_mix.txt · Last modified: 2004/11/29 15:35
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki