CASL II のプログラム例 ( その 6)
山本昌志∗
2005
年1
月28
日1 復習と本日の内容
1.1
復習先週と先々週の講義では、繰り返し処理とサブルーチンについて学習した。そこでは、データの中から、
最大値を探索プログラムの例を示した。
1.2
本日の内容今回は、以下の
2
点について、学習する。•
通常、複数の同じ性質のデータは、ラベルとDC
命令を用いて、1行で書かれる。その場合、ラベル名 はデータの先頭アドレスを示す。最終アドレスを探す場合、結構面倒である。本日は、最終アドレス にラベル名を付ける方法を学習する。•
数値データを文字データに変換する方法を学習する。2 [ 例題 9] ラベルを 2 重につける方法
教科書の
List5-9
のプログラムを例にして、ラベルを2
重につける方法について説明する。2.1
教科書の例教科書の例題
6(p.97)〜8(p.101)
は 、いずれも与えられたデータの最大値を求めるプログラムであった。これらの場合、最大値を求めたいデータの数列とその数が与えられていた。データ数を元に、数列を読みし
•
ラベルDATA
が示すアドレスからデータが格納されている。•
アセンブラ命令DS
を上手に使うことにより、データの終わりのアドレスは、ラベルLAST-1
で示して いる。•
アドレスDATA〜LAST-1
に格納されている数列を合計して、ラベルSUM
に格納する。である。このプログラム例で学習することは、最終データがあるアドレスにラベル名をつけることである。
それは、プログラム中で示しているように
DATA DC 1,5,6,8,9
LAST DS 0 ;
数列の最終アドレス+1とするのである。こうすると数列の先頭のアドレ スは
DATA
で 、最終アドレ スはLAST-1
で示すことがで きる。2.2
プログラムの構造とフローチャートこのプログラムのフローチャートを図
1
に示す。このプログラムを理解するために、ここで使われている レジスターやラベルの内容を表3
に示しておく。プログラムの内容を理解するときには、変数が示す内容を 考えるのが第一歩である。諸君も、プログラムの内容を調べるときには、変数の意味を調べることから始め よ。全て分からなくても良い。分かるものから、その意味をプログラム中に書け。このプログラムは、そんなに難しくなく、最終アドレス間で次々に加算しているのが理解できるであろう。
表
1:
汎用レジスターとメモリの内容GR0
加算途中および結果の合計値GR1
データの最終アドレス+1(LAST)GR2
読み込むデータのアドレス(LAST〜LAST-1) DATA
加算する数列の先頭アドレスLAST
加算する数列の最終アドレスSUM
数列を加算した結果を格納するメモリーのアドレス
! "#
$
%
&
+-,.0/1.
' ()*(
2436547
89;:=<0>;?
8@;A BC-D;EGF;H
I J
KLM
KLM NOPQ=R=S-P
+,TU/WVXYZ[\]^_ `
+-,a;/1VbY[Y\
]^_ ` c;d
<;efg-h9;:;i=j
k
RUlm=n=o
@;A BC-e
pq rs;t=u
k
RUlm;vUw
@;A BC-e
pqxs;t=u
y426243
8z0{
8@;A BC m;OP|-}
NPU~
8 m k RUlG o
U=
8
c;d
< m t;u
+-,.0/ +,.
+-,a/4+-,a T
fI f
+,.01Z
6
+-,T- U+,a
pq rhk R=l
@=ABC-j
pqxh n;o
@;A BC-j=
=;0¡ ¢¢£
s
¤h n;o
@=ABC¦¥;§=j
pq
fe c;d
<Gg z0{=¨=©
k
RUlm
@=AB
C¦e
OP|-} NPU~
pqx
¥;ªU¨=@=ABC mG«
¬ e
pq r
g-z;{
図
1:
教科書のList5-9
のプログラムの構造とフローチャート3 [ 例題 10] 数値データを文字データに変換
教科書の
List5-10
のプログラムを例にして、数値データを文字データに変換する方法を説明する。3.1
教科書の例教科書の例のプログラムは 、メモリーに格納されている整数データを文字に変換して表示するものであ る。表示の約束は、以下の通りである。
•
ラベルA
に入っている数値(最大 5
桁)を文字列に変換して、OUT命令で表示する。•
表示には6
桁(カラム)
用意して、第1
桁は符号で負の場合のみ表示する。2〜6桁は絶対値を表す。ただし 、上位の桁が
0
の場合、スペースを入れる。ラベル
A
の数値が最大5
桁なのは 、それを符号付き整数として取り扱うからである。その場合、1ワー ドで表現できるのは、-32768〜32767の範囲である。これが5
桁で、符号を合わせると表示に6
桁必要になる。実際には図のように、6カラムで負号のみ左端に表示し 、数値は右詰で表示する。
プログラムの作成方法と動作について、教科書に沿って説明する。
図
2:
教科書のList5-10
の数値を文字に変換表
2:
メインルーチンの汎用レジスターとメモリの内容GR0
処理すべき数値(処理する毎に桁が減少)
GR1
カウンター(処理する桁を示す)
GR2
除数GR3
その桁の値(整数) C4
わり算が必要な桁数BUFF
文字を格納するメモリーの先頭アドレスMOJI #0030。これを整数に足せば 、その文字コード になる。
WORK
以前の桁のフラグ(0:全てゼロ それ以外:ゼロ以外が現れた) WORK+1〜4
桁表
3:
サブルーチンDIVの汎用レジスターとメモリの内容。このサブルーチンでは GR0÷GR2 →
商GR3
余りGR0
を計算している。レジスター 実行前 実行後
GR0
被除数 余りGR2
除数 除数(変化無し )
GR3
不定 商!
#"%$&('
)*,+-.-- /(021324
567.89:2";<>=?@A>?
5B-++CDEFHGI
).-.*JLK. M 0($(NO>PQ(%R
+-.--S 56UTVWT /(02"X2=YZ[>?
5B-++CDEFHGI
\(]$(N>O
.-B^ \(]$(N>O
K.M_ ZF(`Facb(ed
8fgK#C h0c8%i(jkj
l
mn oeprq>N>O
J-.s^5 5t(X>u>v
g 5fgK DEwcA_xy"3(z
5fgK {(|HfgK
JgJ}5 5c~(
)J l g"%{>|F(";<(
g 5*g) 75 2q
).-.*JLsgg.M DEwcA_xy"cGI(N>O(
J l
S 567.89g(";%<%?@(A(?
sgg.M 5B-++CDEwcA_xy"cGI
l J l 2A(R>%0F"%(
)*}K. M %AR%!
g *g) "!cD(E!wcA_xy
ZF(`Facb(ed
B-++CDEwcA_xy"cGI
g- B-++.M {(|2"(
l
V8
B-++ DEwcA_xy"cGI
.M
l DEwcA_xy"
fgKm
l
*g) l 75
l l
.M
n
5 F%%
.ggJ
l J 8 h02>2 1%3>z
)*,+ M 2%'F+ M
.-B^ 8 2h%0Vh%0
5 5 FcZF(`ab d
).-.*J.ggJ ¡epr¢¤£HN>O(
+ M
.M
¥¦§.¨¦
©«ª¬®
©«ª.®¯
¯«°>±²(³µ´¶
¬·¸¹º2» ¼(½>¾¿%À«Á
¬·¤¸¹eÂ
©«ª¬°ÃµÄÅHÆ#Ç«Ä%È
ÉÊ
³H©«ªË
¿Ì(Í(Î(Ï
É>Ð>Ñ(Ò
©#ªÓ³cÔÕ(Öy×(Ø
¿%À«ÁÙ>Ú
©«ª¬ÂÛ
©#ª.®³cÔÕ(Öy×(Ø
¿%À«ÁÙ>Ú
ÜÝÞ ßà
áâà
¥¦§.¨¦
©#ª®Â ©«ªË
©«ªÓ®
©#ª®Â ©«ªË
ÜÝ.Þ
ã
àäyå æ(çè
×>écİ
Ñ(Ò
©#ª®.ê%©#ªËrëì©«ªÓí2î#©«ª.®