┌───────┴───────┐
│GR5←GR5+後部分文字列の文字数│
└───────┬───────┘
┌────┴─────┐
│連結後の文字数←GR5 │
└────┬─────┘
┌──┴───┐
│レジスタ復旧│
└──┬───┘
/ ̄\
( end )
\__/
-------------------------------------------
[プログラム全体]
RS.作業用レジスタの内容の退避
!RPUSH
MP.主要処理
MP-1.前部分文字列の終わりの次の位置を、移動先アドレスとする。
MP-1-1.前部分文字列の先頭アドレスを、移動先アドレスに格納。
!LAD GR3,1,GR1
MP-1-2.前部分文字列の文字数を、移動先アドレスに加算。
!ADDA GR3,0,GR1
MP-2.GR3へ、後部分文字列をコピー。
MP-2-1.後部分文字列の文字数を、(コピー文字数としての)GR5に格納。
!LD GR5,0,GR2
MP-2-2.(移動元アドレスとしての)GR4へ、後部分文字列のアドレスを格納。
!LAD GR4,1,GR2
|
MP-3-2.後部分文字列の文字数を、GR5に加算。
!ADDA GR5,0,GR2
MP-3-3.GR5を、連結後の文字数に格納。
!ST GR5,0,GR1
RR.作業用レジスタの内容の復旧
!RPOP
FN.終了
!RET
-------------------------------------------
[プログラム全体-清書]
ラベル等を適切に設定した例です。
又、適宜コメントを付け加えています。
テスト用ドライバの例も、
小文字で示して、加えています。
Rookで実際に動かして、動作試験を行ってみましょう。
2つの文字列を入力すると、連結した文字列が出力されます。
!!Rookにはリンク機能が無いため、
!!清書したプログラムの先頭2行は書換えている。
sample start
in str1,len1
in str2,len2
lad gr1,len1
lad gr2,len2
call strcat
out str1,len1
ret
len1 ds 1
str1 ds 256
len2 ds 1
str2 ds 256
STRCAT RPUSH
LAD GR3,1,GR1 ;前文字列の先頭
ADDA GR3,0,GR1 ;コピー先のアドレス
|
ADDA GR5,0,GR2 ;後の文字数
ST GR5,0,GR1 ;新文字数
RPOP
RET
END
-------------------------------------------
[テスト・データの例]
上記ドライバを使用する場合は、テスト毎に2つの文字列をキー入力します。
1回のテスト毎に終了するので、Rookでは、RestartとRunを繰返して下さい。
!!典型的なデータは、プログラムの基本動作の確認に使います。
test1
test2
!!エラーや例外となるデータ(或いはデータが無い場合のテスト)は、必要です。
!!2つの文字列の一方、又は両方が空行
test1
test2
!!限界値として、通常は、文字数の上限のテストが必要です。
!!この副プログラムでは、限界は無いことになっています。
!!この他のテスト用データも、自分で考えてみましょう。
-------------------------------------------
[擬似言語]
試験に出題される擬似言語で、表現してみましょう。
(実際の試験では、細部の形式が変更になる場合もあります。)
尚、擬似言語に合せて、一部の処理を変更しています。
!!ポインタ型とは、データが格納されているアドレスを指すデータ形式です。
!!又、「--GR5」は、GR5の内容を−1した後、GR5の値を使用します。
!!「GR5--」とすれば、判断に使用するGR5の値を確保した後、
!!GR5の内容を−1します。
[擬似言語-プログラム]
○STRCAT(ポインタ型:GR1,ポインタ型:GR2)
○ポインタ型:GR3,GR4
○整数型:GR5
・GR3←GR1+1+(GR1)
・GR5←(GR2)
・GR4←GR2+1
■--GR5>=0
│・(GR3)←(GR4)
│・GR4←GR4+1
│・GR3←GR3+1
■
・(GR1)←(GR1)+(GR2)
-------------------------------------------
[穴埋め問題について]
プログラムの一部を空欄にした、穴埋め問題を解いてみましょう。
実際の試験では選択肢から選べば良いのですが、
ここでは自分で命令を考えて下さい。
別解がある場合は、試験の選択肢にどの別解が出るかは解らないので、
別解も予想出来る様にしましょう。
問題を解くには、アルゴリズムを理解しておくと良いです。
穴埋め問題のプログラムの流れを理解するため、
穴埋め作業の前に、プログラムからフローチャートを作って見てください。
次回掲載する解法・解答の解説では、
流れの概要が判っているものとして、フローチャートの作成は省略します。
又「プログラムの説明」を良く読むべきです。
そこで「プログラムの説明」も再掲しておきます。
-------------------------------------------
[穴埋め問題]-1
「プログラムの説明」を読んで、プログラム中の空欄を埋めよ。
プログラムの各行の先頭には、各行を区別するため、行番号を加えてある。
[プログラムの説明]
文字列に別の文字列を連結して、
1つの文字列にする副プログラムSTRCATである。
1.文字列は、主記憶上に格納された次の様なデータ列の、
先頭アドレスで指定される。
データ列
┌───┬────┬────┬────┬…
│文字数│1文字目│2文字目│3文字目│… ;各1語
└───┴────┴────┴────┴…
2.連結される前部分の文字列はGR1で、後部分の文字列はGR2で与えられる。
3.結果の文字列は、
GR1で指定される前部分の文字列と同じ領域に格納された形で得られる。
4.得られる文字列が格納される領域サイズは、
十分に用意されているものとする。
5.全ての汎用レジスタは、内容を保存する。
[プログラム]
1:STRCAT START
2: [ a ]
3: [ b ] ;前文字列の先頭
4: ADDA GR3,0,GR1 ;コピー先のアドレス
5: [ c ] ;コピー文字数
6: LAD GR4,1,GR2 ;コピー元のアドレス
7:LOOP SUBA GR5,=1
8: JMI FIN ;コピー文字数が残っている
9: [ d ] ;コピー元の文字
10: ST GR6,0,GR3 ;コピー先へ格納
11: [ e ]
12: [ f ]
13: JUMP LOOP
14:FIN LD GR5,0,GR1 ;前の文字数
15: [ g ] ;後の文字数
16: ST GR5,0,GR1 ;新文字数
17: [ h ]
18: RET
19: END
|