第 9 章 サブルーチン 59
12.2 文字列検索
ACROSUB LAD GR2,0 LAD GR3,0
LOOP LD GR1,INAREA,GR2 CALL ISUPPER
CPL GR4,=0 JZE SKIP
ST GR1,OUTAREA,GR3 LAD GR3,1,GR3 SKIP LAD GR2,1,GR2
CPA GR2,INLENGTH JMI LOOP
ST GR3,OUTLENGT RET
;
ISUPPER LAD GR4,0 CPL GR1,=’A’
JMI EXIT CPL GR1,=’Z’
JPL EXIT LAD GR4,1 EXIT RET
;
INAREA DS 256 INLENGTH DS 1 OUTAREA DS 256 OUTLENGT DS 1
END
このプログラムは、文字列を読み込んで、その文字列から英字の大文字だけを取り出して、そ れらの大文字から構成される文字列を出力します。
実行例
IN ? Arithmetic Logic Unit ALU
12.2. 文字列検索 77 RET
;
INAREA1 DS 256 INLEN1 DS 1 INAREA2 DS 256 INLEN2 DS 1 RESULT DS 1
DUMPE DC -1
MSG DC ’MESSAGE1’
END
このプログラムは、2個の文字列を読み込んで、1個目の文字列の先頭に2個目の文字列が含ま れているならば0を、そうでないならば−1をRESULT番地にストアして、DMEM命令でRESULT 番地を表示します。
1個目の文字列の先頭に2個目の文字列が含まれているかどうかを実際に調べるという処理を するのは、HEADSUBから始まるサブルーチンです。
このサブルーチンは、まず、1個目の文字列の長さと2個目の文字列の長さとを比べます。2個目 のほうが長いならば、1個目の中に2個目が含まれている可能性はありませんので、−1をRESULT 番地にストアします。
1個目と2個目とが同じ長さか、または1個目のほうが2個目よりも長いならば、先頭から 順番に文字を比較するループに入ります。そして、もしも一致しない文字が見つかったならば、
ループから抜けて−1をRESULT番地にストアします。文字が一致したまま2個目の最後まで文 字の比較が終わった場合は、ループから抜けて0をRESULT番地にストアします。
実行例
IN ? assembler IN ? assem
* MESSAGE1 * Start:022E End:022F
0228: ---- ---- ---- ---- ---- ---- 0000 FFFF ..
IN ? assembler IN ? assym
* MESSAGE1 * Start:022E End:022F
0228: ---- ---- ---- ---- ---- ---- FFFF FFFF ..
IN ? assembler IN ? assemblers
* MESSAGE1 * Start:022E End:022F
0228: ---- ---- ---- ---- ---- ---- FFFF FFFF ..
12.2.3 文字の検索
文字列検索のプログラムを書くためのウォーミングアップとして、もう一つ、プログラムを書 いてみましょう。今度は、文字列の中で1個の文字を検索するプログラムです。
プログラムの例 charsch.cas CHARSCH START
IN INAREA1,INLEN1 IN INAREA2,INLEN2 CALL CHARSCHS
DMEM MSG,RESULT,DUMPE RET
;
CHARSCHS LD GR1,INLEN2 CPA GR1,=1 JMI NOTFOUND LAD GR1,0
LOOP LD GR2,INAREA1,GR1 CPL GR2,INAREA2 JZE FOUND LAD GR1,1,GR1 CPA GR1,INLEN1 JMI LOOP NOTFOUND LAD GR1,-1 FOUND ST GR1,RESULT
RET
;
INAREA1 DS 256 INLEN1 DS 1
INAREA2 DS 256 INLEN2 DS 1 RESULT DS 1
DUMPE DC -1
MSG DC ’MESSAGE1’
END
このプログラムは、2個の文字列を読み込んで、1個目の文字列の中に2個目の文字列の先頭 の文字が含まれているならばその位置(先頭の文字を0番目と数えます)を、そうでないならば
−1をRESULT番地にストアして、DMEM命令でRESULT番地を表示します。
1個目の文字列の中に2個目の文字列の先頭の文字が含まれているかどうかを実際に調べると いう処理をするのは、CHARSCHSから始まるサブルーチンです。
このサブルーチンは、まず、2個目の文字列の長さを調べて、それが0ならば、−1をRESULT 番地にストアします。
2個目の長さが1以上ならば、先頭から順番に文字を比較するループに入ります。そして、も しも一致する文字が見つかったならば、ループから抜けて、見つかった文字の位置をRESULT番 地にストアします。文字が一致しないまま1個目の最後まで文字の比較が終わった場合は、ルー プから抜けて−1をRESULT番地にストアします。
実行例
IN ? assembler IN ? mouse
* MESSAGE1 * Start:0228 End:0229
0228: 0004 FFFF ---- ---- ---- ---- ---- ---- ..
IN ? assembler IN ? cat
* MESSAGE1 * Start:0228 End:0229
0228: FFFF FFFF ---- ---- ---- ---- ---- ---- ..
12.2.4 文字列検索のプログラム
それでは、文字列検索のプログラムを書いてみましょう。
文字列検索のプログラムは、ウォーミングアップとして書いた二つのプログラムを組み合わせ ることによって書くことができます。
プログラムの例 search.cas SEARCH START
IN INAREA1,INLEN1 IN INAREA2,INLEN2 CALL SEARCHS
DMEM MSG,RESULT,DUMPE RET
;
SEARCHS LD GR1,INLEN2 CPA GR1,=1 JMI NOTFD1 LD GR1,INLEN1 SUBL GR1,INLEN2 JMI NOTFD1 LAD GR1,1,GR1 ST GR1,INLEN3 LAD GR1,0
LOOP1 LD GR2,INAREA1,GR1 CPL GR2,INAREA2 JPL SKIP
JMI SKIP CALL HEADSUB CPL GR3,=0 JZE FOUND1 SKIP LAD GR1,1,GR1
CPA GR1,INLEN3 JMI LOOP1 NOTFD1 LAD GR1,-1 FOUND1 ST GR1,RESULT
RET
;
HEADSUB LD GR4,INLEN2 CPL GR4,=2
12.3. 整数から文字列への変換 79