-----------------------<<>>------------------------- ---------------------------------------------------------------------------- ----------------------------- Initialization ------------------------------- | op1: $00 | op2: $01 | mul: $02 MV AC, $00 --> 0000 0000 - 000 000 00 --> 00 00 // AC = 0 ;| mul: $02 ST [$02], AC --> 0000 0010 - 110 000 10 --> 02 C2 // mul = AC ;| mul <- 0 INPUT AC --> 0000 0000 - 000 000 11 --> 00 03 // AC = IN ;| fact: $03 ST [$03], AC --> 0000 0011 - 110 000 10 --> 03 C2 // fact = AC ;| read(fact) ST [$04], AC --> 0000 0100 - 110 000 10 --> 04 C2 // i = AC ;| i: $04 | i = fact ; ----------------------------- factorial loop ------------------------------- do_while : | do_while: $05 LD AC, [$04] --> 0000 0100 - 000 000 01 --> 04 01 // AC = i ;| SUB AC, $01 --> 0000 0001 - 101 000 00 --> 01 A0 // AC-- ;| i--; ST [$04], AC --> 0000 0100 - 110 000 10 --> 04 C2 // i = AC ;| LD AC, [$03] --> 0000 0011 - 000 000 01 --> 03 01 // AC = fact ;| ST [$00], AC --> 0000 0000 - 110 000 10 --> 00 C2 // op1 = AC ;| op1 = fact ; LD AC, [$04] --> 0000 0100 - 000 000 01 --> 04 01 // AC = i ;| ST [$01], AC --> 0000 0001 - 110 000 10 --> 01 C2 // op2 = AC ;| op2 = i ; MV AC, $00 --> 0000 0000 - 000 000 00 --> 00 00 // AC = 0 ;| ST [$02], AC --> 0000 0010 - 110 000 10 --> 02 C2 // mul = AC ;| mul <- 0 ------------------------------ multiply loop ------------------------------- while : | while: $0E LD AC, [$01] --> 0000 0001 - 000 000 01 --> 01 01 // AC = op2 ;| end_while: $19 BEQ $19 --> 0001 1001 - 111 100 00 --> 19 F0 // if(AC==0) | while (op2 != 0) NOP --> 0000 0000 - 000 000 10 --> 00 02 // goto end_while;| LD AC, [$00] --> 0000 0000 - 000 000 01 --> 00 01 // AC = op1 ;| ADD AC, [$02] --> 0000 0010 - 100 000 01 --> 02 81 // AC = AC + mul ;| mul = mul + AC ; ST [$02], AC --> 0000 0010 - 110 000 10 --> 02 C2 // mul = AC ;| LD AC, [$01] --> 0000 0001 - 000 000 01 --> 01 01 // AC = op2 ;| SUB AC, $01 --> 0000 0001 - 101 000 00 --> 01 A0 // AC-- ;| op2--; ST [$01], AC --> 0000 0001 - 110 000 10 --> 01 C2 // op2 = AC ;| B $0E --> 1100 1110 - 111 111 00 --> 0E FC // jmp while ;| while: $0E NOP --> 0000 0000 - 000 000 10 --> 00 02 // ;| ----------------------------- multiply loop end ---------------------------- end_while : | end_while: $19 LD AC, [$02] --> 0000 0010 - 000 000 01 --> 02 01 // AC = mul ;| ST [$03], AC --> 0000 0011 - 110 000 10 --> 03 C2 // fact = AC ;| fact = mul ; LD AC, [$04] --> 0000 0100 - 000 000 01 --> 04 01 // AC = i ;| SUB AC, $01 --> 0000 0001 - 101 000 00 --> 01 A0 // AC-- ;| BGT $dd --> 0000 0101 - 111 001 00 --> 05 E4 // if(AC>0) | do_while (i > 1) NOP --> 0000 0000 - 000 000 10 --> 00 02 // goto do_while;| do_while: $05 LD AC, [$03] --> 0000 0011 - 000 000 01 --> 03 01 // AC = fact ;| MV OUT,AC --> 0000 0000 - 000 110 10 --> 00 1A // out(AC) ;| display(AC) NOP --> 0000 0000 - 000 000 10 --> 00 02 // exit(0) ;| exit: -------------------------------- program end -------------------------------