Как работает `Skipcond` на ассемблере MARIE?

Я пытаюсь понять язык ассемблера MARIE. Я не совсем понимаю skipcond для таких вещей, как <, или же >или умножить или разделить.

Я беру эту простую программу:

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

Я не понимаю, как использовать определенные условия пропуска:

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

Теперь я знаю, что вычту x из 10 и протестирую, используя скипсекунду.

Я не уверен, какой и почему. Думаю, если бы я знал, как они на самом деле работают, возможно, это было бы легче понять. Почему он используется для сравнения с нулем?

Вот что у меня есть:

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

2 ответа

Решение
while x < 10 do
    x  = x + 1

выпрыгнет из цикла, как только x станет равным 10. Если вы вычтете 10 из x, вы получите отрицательное значение, пока x не станет равным 10 (и значение будет равно 0). Итак, используя skpcond000 было бы неправильно, поскольку это выскочило бы слишком рано. Так skpcond400 верно.

Возможно, это будет легче понять, если вы измените код C так, чтобы он был ближе к коду сборки:

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

Также обратите внимание, что вы должны увеличить x после условия воспроизведения идентичного поведения while петля.

Это может помочь. Есть много способов написать это, но я думаю, что это самый простой способ понять, что происходит в цикле. Примечание: обычно переменные размещаются внизу программы.

          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
Другие вопросы по тегам