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
It looks like a division right? Except it obviously is NOT… Yet it is!