[更新日]1998.05.15
問10 次のアセンブラプログラムの説明及びプログラムを読んで, 設問に答えよ。
〔プログラムの説明〕
キューへデータを格納する副プログラム QIN と,キューからデータを 取り出す副プログラム QOUT である。キューのデータは,格納した順に 取り出される。
(1) キューを,図に示すように,N 個(1 < N < 32768)の 要素からなる領域と管理テーブルで実現する。
図 キューの構造と管理テーブル
(2) キューを表現する領域の末尾( QADDR+ (N−1) )は先頭( QADDR ) につながっているものとみなす。すなわち,領域の末尾を越えてデータを 格納しようとした場合,領域の先頭に戻って格納を試みる。
(3) キューへデータを格納したいプログラムは,GR1 に管理テーブルの 先頭番地を,GR0 に格納するデータを設定して,QIN を呼ぶ。QIN は,END の位置にデータを格納し,END の値を更新した後,GR0 に 0 を設定して 処理を終える。ただし,既に N−1 個のデータが格納済みならば,GR0 に−1 を設定して処理を終える。
なお,−1 はキューに格納される値としては,出現しないものとする。
(4) キューからデータを取り出したいプログラムは,GR1 に管理テーブル の先頭番地を設定して,QOUT を呼ぶ。QOUT は,TOP の位置のデータを GR0 に設定し,TOPの値を更新した後,処理を終える。ただし,キューが空ならば, GR0 に−1 を設定して処理を終える。
(5) TOP と END は 0 に初期化されているものとする。
(6) QIN と QOUT は,主プログラムに戻るとき,汎用レジスタ GR2,GR3 の内容を元に戻す。
〔プログラム〕 QIN START PUSH 0,GR2 PUSH 0,GR3 ;END → GR2 LEA GR2,1,GR2 CALL ADJ CPL GR2,0,GR1 ;GR2=TOP? JZE QFULL ;キューが一杯 LD GR3,2,GR1 ST GR0,0,GR3 ;データの格納 ST GR2,1,GR1 ;ENDの更新 LEA GR0,0 JMP FIN QFULL LEA GR0,-1 FIN POP GR3 POP GR2 RET END QOUT START PUSH 0,GR2 PUSH 0,GR3 LD GR2,0,GR1 ;TOP → GR2 CPL GR2,1,GR1 ;TOP=END? JZE QEMPTY ;キューが空 LD GR3,2,GR1 ADD GR3,0,GR1 LD GR0,0,GR3 ;データの設定 LEA GR2,1,GR2 ;TOP+1 → GR2 CALL ADJ JMP FIN QEMPTY LEA GR0,-1 FIN POP GR3 POP GR2 RET END ADJ START ;領域の末尾処理 CPL GR2,3,GR1 JMI FIN FIN RET END
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a に関する解答群
ア LD GR2,0,GR1 イ LD GR2,1,GR1 ウ LD GR2,2,GR1
エ LD GR2,3,GR1
b に関する解答群
ア ADD GR2,1,GR1 イ ADD GR3,1,GR1 ウ LEA GR2,1,GR3
エ LEA GR3,1,GR3 オ SUB GR2,1,GR3 カ SUB GR3,1,GR1
c に関する解答群
ア ST GR2,0,GR1 イ ST GR2,0,GR3 ウ ST GR2,1,GR1
エ ST GR2,1,GR3
d に関する解答群
ア ADD GR2,2,GR1 イ LD GR2,3,GR1 ウ LEA GR2,0
エ SUB GR2,2,GR1