Как работает `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