How does `Skipcond` work in the MARIE assembly language?

57.4k Views Asked by At

I am trying to understand the MARIE assembly language. I don't quite understand skipcond for doing things like <, or >, or multiply or divide.

I am taking this simple program:

x = 1
while x < 10 do
x  = x +1
endwhile;

What I don't understand is how to use certain skip conditions:

Skipcond 800 if AC > 0,
Skipcond 400 if AC = 0,
Skipcond 000 if AC < 0

Now, I know I would subtract x from 10 and test using skipcond.

I am not sure which one and why. I guess if I knew how they really work maybe it would be easier to understand. Why is it used to compare to zero?

This is what I have:

100     load one
101     store x
102     subt ten
103     skipcond400  if x-10 = 0?   // or skpcond000 x -10 < 0?? 
2

There are 2 best solutions below

0
On BEST ANSWER
while x < 10 do
    x  = x + 1

will jump out of the loop as soon as x equals 10. If you subtract 10 from x, you'll get a negative value until x equals 10 (and the value is 0). So using skpcond000 would be wrong as it would jump out too soon. So skpcond400 is correct.

Perhaps it is easier to understand if you change the C code so it will be closer to the assembly code:

Original:            while (x < 10) do
Subtract 10:         while ((x - 10) < 0) do
Use != instead of <: while ((x - 10) != 0) do

Also note that you have to increase x after the condition to reproduce identical behaviour to the while loop.

0
On

This may help. There are many ways to write this but I think this is the easiest way to understand what is happening in the loop. Note: usually variables are placed at the bottom of the program.

    while x<10
          x = x+1
Org 100  
       Load             One  / loads accumulator = 1 from a decimal constant
       Store             X   / initialize the var x = 1

loop,  Load           X      / loads x into the accumulator
       Subt             Ten  / compares x to 10 
       Skipcond         000  / if ac < 0 i.e. if x < 10 run rest of loop body
       JUMP             Endloop / if ac => 10  terminate loop
       Load              X    / begin the Loop
       ADD               One  / add 1 to x
       Store             X    / store new value in X
       JUMP              loop / continue loop

       Endloop           Halt / ends loop

One  = DEC 1   Constant
Ten  = DEC 10  Constant
X   = 0 Variable