Abort this step by step:
Original:
C = A * B
It is equivalent to:
C = 0 while A != 0: dec A C += B
It is equivalent to:
C = 0 while A != 0: dec A
It is equivalent to:
C = 0 Z = 0 while A != 0: dec A
Now we just need to figure out how to translate this construct:
while LOOP_VAR != 0: dec LOOP_VAR ... some code here which does not use LOOP_VAR ...
This can be translated into:
# Next 4 lines do "if LOOP_VAR == 0: goto loop_end" inc LOOP_VAR dec LOOP_VAR # To set flags jnz loop_again goto loop_end loop_again: ... some code here which does not use LOOP_VAR ... dec LOOP_VAR jnz loop_again loop_end:
And, of course, we need to translate this unconditional transition into a conditional one. Fortunately, we have many variables that are known to be equal to zero, so we can check whether one of them is equal to zero:
# Unconditional jump to "loop_end". Note that Q is always zero. inc Q dec Q jnz loop_end
So, all together:
# Next 3 lines do "if A != 0: goto outer_loop_again" inc A dec A # To set flags jnz outer_loop_again # Unconditional jump to "outer_loop_end". Note that Q is always zero. inc Q dec Q jnz outer_loop_end outer_loop_again: # Next 3 lines do "if B != 0: goto addition_loop_again" inc B dec B # To set flags jnz addition_loop_again # Unconditional jump to "addition_loop_end". Note that Q is always zero. inc Q dec Q jnz addition_loop_end addition_loop_again: inc Z inc C dec B jnz addition_loop_again addition_loop_end: # Next 3 lines do "if Z != 0: goto move_loop_again" inc Z dec Z # To set flags jnz move_loop_again # Unconditional jump to "move_loop_end". Note that Q is always zero. inc Q dec Q jnz move_loop_end move_loop_again: inc B dec Z jnz move_loop_again move_loop_end: dec A jnz outer_loop_again outer_loop_end: # Finished! helt
Edited to add: Actually, there is a slightly easier way. We can check if A or B are zeros at the beginning, which simplifies it:
# Check if A is zero, and halt if so
source share