仮想的なスタックマシンが次の命令をもつとする。
push a データaをスタックに積む。
dup スタックの最上部のデータを複製してスタックに積む。
swap スタックの最上部の2つのデータの位置を交換する。
add スタックの最上部の2つのデータをスタックから取り除き,その2つのデータの和をスタックに積む。
sub スタックの最上部のデータaとその直下のデータbをスタックから取り除き,b−aをスタックに積む。
cmp x スタックの最上部の2つのデータを取り除き,その2つのデータが等しくなければ,ラベルxへプログラムの制御を移す。
このスタックマシン上で,次のプログラムが終了したときに,スタックの最上部にある値はどれか。
push 5
L1: dup
push 1
sub
dup
push 1
cmp L1
L2: add
swар
dup
push 5
cmp L2
add
① 8 ② 10 ③ 12 ④ 15 ⑤ 20
答え
④
解説
順に命令を実行すると,次のようになります。
push 5 → 5
dup → 5 5
push 1 → 1 5 5
sub → 4 5
dup → 4 4 5
push 1 → 1 4 4 5
cmp L1 → 4 5(取り除いた1と4が異なるのでL1へ戻る)
dup → 4 4 5
push 1 → 1 4 4 5
sub → 3 4 5
dup → 3 3 4 5
push 1 → 1 3 3 4 5
cmp L1 → 3 4 5(取り除いた1と3が異なるのでL1へ戻る)
dup → 3 3 4 5
push 1 → 1 3 3 4 5
sub → 2 3 4 5
dup → 2 2 3 4 5
push 1 → 1 2 2 3 4 5
cmp L1 → 2 3 4 5(取り除いた1と2が異なるのでL1へ戻る)
dup → 2 2 3 4 5
push 1 → 1 2 2 3 4 5
sub → 1 2 3 4 5
dup → 1 1 2 3 4 5
push 1 → 1 1 1 2 3 4 5
cmp L1 → 1 2 3 4 5(取り除いた1と1が等しいので次へ進む)
add → 3 3 4 5
swар → 3 3 4 5
dup → 3 3 3 4 5
push 5 → 5 3 3 3 4 5
cmp L2 → 3 3 4 5(取り除いた5と3が異なるのでL2へ戻る)
add → 6 4 5
swap → 4 6 5
dup → 4 4 6 5
push 5 → 5 4 4 6 5
cmp L2 → 4 6 5(取り除いた5と4が異なるのでL2へ戻る)
add → 10 5
swap → 5 10
dup → 5 5 10
push 5 → 5 5 5 10
cmp L2 → 5 10(取り除いた5と5が等しいので次へ進む)
add → 15
よって,スタックには15が残る(最上部にある)ことがわかります。