dポイントプレゼントキャンペーン実施中!

突然、下記のようなプログラム(アセンブラらしい)を多々渡されて、「これをCOBOLに変換して!!」といわれました。
解説書も無く、何アセンブラかも??で途方に暮れています(--;;;何アセンブラか教えて欲しいです。また、参考書or参考HPも。とにかく情報をください。お願い致します。
AAAAAA START
R0 EQU 0
   :
R12 EQU 12
SAVE (14,12)
BALR R3,0
USING *,R3,R4
LA R4,4095(R3)
LA R4,1(R4)
ST 13,OCSV1+4
LA 13,OCSV1
OPEN (TFIN,(INPUT,DISP))
OPEN (TFOUT,(OUTPUT,DISP))
RDIN ST 13,###@SV13
L 13,=A(###@RSV)
GET TFIN,TW
L 13,###@SV13
ST 13,###@SV13
L 13,=A(###@RSV)
PUT TFOUT,TW
L 13,###@SV13
B RDIN
EOFIN CLOSE (TFIN,DISP)
CLOSE (TFOUT,DISP)
L 13,OCSV1+4
RETURN (14,12),RC=0
LTORG
OCSV1 DS 18F
OCSV2 DS 18F
###@RSV DS 18F
###@SV13 DS F
DS 0D
TFIN DCB DDNAME=TFIN,
LRECL=0,
EODAD=EOFIN,
RECFM=FB,
MACRF=(GM),
BLKSIZE=0,
DEVD=DA,
DSORG=PS
TFOUT DCB DDNAME=TFOUT,
LRECL=0,
RECFM=FB,
MACRF=(PM),
BLKSIZE=0,
DEVD=DA,
DSORG=PS
DS 0D
TW DC 1024C' '
END

A 回答 (8件)

ファイルのコピーをしている事は間違いないようです。


ただ、マクロの部分を中心にまだわからないところが多々あります。
特にレジスター13がキーポイントのようです。
R13はいろんな使い方をされているようです。

(1)一つ思い出しましたが、昔、R13はサブルーチンの飛び先か戻り先のアドレス保持に使っていました。このプログラムもRETURNで終わっていますので戻りアドレスの保持をR13でしているようです。先頭の方でR13をセーブしていないのもそれが理由でしょう。
ST 13,OCSV1+4
  ・
  ・
L 13,OCSV1+4
がそのセーブと回復ですね。

(2)OPENマクロの中で18ワード(72BYTE)の領域(ワーク?)を欲しがるようです。そこでOCSV1の先頭アドレスをR13で渡しています。

(3)同様に、GETマクロ,PUTマクロでも同じ大きさの領域を要求すると見えて、R13で###@RSVの先頭アドレスを教えています。

残念ですが、L 13,###@SV13 と ST 13,###@SV13 が2個ずつあるのですが、よくわかりません。無意味のように思えてなりません。制御用プログラムなどでタイミング調整にこんな事をやったような気もするのですが。

私はこの辺が限界です。それではがんばって下さい。
    • good
    • 0
この回答へのお礼

ymmasayanさん。本当にありがとうございました。<(_ _)>

今後、200本近く変換作業を行うらしく 凹んでいます。
・・・・お陰様で、少しはプログラムを見て 考える知識が付きました。(まだまだですが、考えようと努力できる自信が・・・付いたかなぁ(^^;;;;;;)

また、なにか????のコマンドがありましたら 再度投稿しますので これに懲りず 助言お願い致します。

本当に、ありがとうございました。<m(__)m>

-----欲をいえば、ymmasayanさんの知識を購入したいですね(笑)

お礼日時:2002/01/31 23:05

私もとっくに限界超えてま(^^;


あとはマニュアル類で調べないと手が出ません。

汎用機で間違いなさそうですから、入手法はあるでしょう。

そもそも、これをCOBOLに直して実行したいということなら、COBOLを実行できる汎用機の環境があると思えますので,
何かしら資料があるのでは?

もし、汎用機が無いのでしたら,移植そのものがあまり意味がないと思えますし。
    • good
    • 0
この回答へのお礼

イロイロとありがとうございました。

汎用機のシステムをダウンサイジングするので、COBOLに変換するらしい・・・・です。それで、このような質問でした。

ただ、昔の汎用機の資料が無く(マニュアル込) プログラムをみて 変換するようです。(他人事に聞こえるが・・・他人事にしたい(^^;;;;)

??のコマンドがありましたら、再度投稿いたしますので
そのときは宜しくお願い致します。<m(__)m>

助言 本当にありがとうございました。お陰様で、少しずつ理解できるようになってきました。たぶん。

お礼日時:2002/01/31 22:59

私よりymmasayanさんの方が詳しそうですが,


せっかくなのでもう少し書いていきます(^^;
間違いはymmasayanさんが指摘してくれると期待して。

>GET TFIN,TW

ラベルTFINにあるDCB(Data Control Block?,Device?)の設定に従い、ラベルTWの領域に読み込む。
同様に、PUTならTFOUTの設定に従い,ラベルTWの内容を出力する。

>TW DC 1024C' '
TWがラベルで、ここのアドレスを表し、
DCがData Charcterかな? 1byte単位で1024byteの領域.
つまり、ここがI/O用のバッファになります。

>TFIN DCB DDNAME=TFIN,
..
>DSORG=PS
TFINがラベル名で、DCBがマクロ名で、
データアクセス用の設定用マクロです。
Cで例えるなら,DCB型のstaticな構造体があって、
DDNAMEというメンバをTFIN(これはラベルでなく文字)
で初期化, EODADはEOFINで初期化‥のような意味です。
COBOLでは例えられません(^^;
EODADはEnd Of Data jump ADdressみたいな意味でしょう(^^;

というわけで、1024単位でファイルのコピーをしているだけの感じですね。
ただ、データセットの形式が違うようなので,それの変換という意味と思えます.
これは、TFINが MACRF=(GM)なのにTFOUTが MACRF=(PM)で、他はDCBの設定自体が同じことからの推測です。
MACRFの意味が見当つかないので、これ以上わかりませんが。

この回答への補足

本当に何度も質問してすみません。

L 13,###@SV13 ** 13レジスタ←###@SV13の内容
ST 13,###@SV13 ** ###@SV13←13レジスタ

と、何をやっているのか??です。
解説をお願いしたいです。

大変申し訳ありませんが、教えて戴きたいです。

補足日時:2002/01/30 03:02
    • good
    • 0

ymmasayanです。


一つ思い出しました。

BALRはCALL命令と等価というのは本当ですが、先頭部のはちょっと意味が違います。

BALR R3,0      0がダミーコールを示す。
USING *,R3,R4   ここがベースレジスタのスタートポイントという宣言。
LA R4,4095(R3)
LA R4,1(R4)

この4命令でベースレジスターのR3とR4をセットしています。
最初のBALRは ダミーCALLで、どこへも飛ばずに戻りアドレスをR3に取得する仕事だけをします。これが実は次のLA命令のアドレスです。
次に2つのLAでR4=R3+4095+1を計算しています。
R3とR4で8キロバイトのメモリがアクセスできる事になります。

この回答への補足

本当に何度もすみません。
この
GET TFIN,TW
って、下に宣言している 領域(?)を TW に移していますよね。
でも、その下の L , ST 命令に TW が無く GET した情報をどうしているのか??です。
更に PUT も 何を PUT しているのか??です。

大変申し訳ありませんが、教えて下さい。お願いいたします

補足日時:2002/01/30 00:04
    • good
    • 0

No.3のymmasayan です。

補足にお答えします。

> B RDIN っていわゆる GO TO 文ですよね。
比較文等が無ければ、永久ループになると思うのですがそこら辺が??の状態です。

確かに永久ループに見えますね。
実は、GET文でEOF(End Of File)を検出すると自動的に EOFINに飛ぶと思います(多分)。

EODAD=EOFIN がその指定だと思います。
    • good
    • 0

1960年代の汎用機(IBM、富士通、日立・・・)のアセンブラーにそっくりです。

今の汎用機もそれをほとんど継続しているはずです。
思い出す範囲で命令語の意味を書いてみます。

EQU equate  アドレス等置   
(例)R4 EQU 4  R4と言うラベルは4番地・・・・R4と書くとアセンブラーが4と読み替える。ここでは LA R4,4095(R3)が好例。LA 4,4095(3) と同じ。

BALR R3,0 Branch and Link Register スタックがない当時のCALL命令。レジスタを2つ書く。飛び先と戻り先。
 
USING *,R3,R4   ベースRegisterを2個割り当てている。(擬似命令)

L  ロード
LA ロードアドレス
ST  ストアー
B RDIN 無条件分岐命令

RETURN (14,12),RC=0  リターン命令  

LTORG  Literal Origin リテラルプールの先頭の宣言(擬似命令)
OCSV1 DS 18F
OCSV2 DS 18F
###@RSV DS 18F
###@SV13 DS F
DS 0D      バウンダリー調整 ダブルワードに調整 

> L 13,=A(###@RSV)

リテラルプールに###@rsvのアドレスを作り、その中身(アドレス)をR13にロードします。
LA 13,###@rsv と同じですが、リテラルプールにアドレス定数が取られるか取られないかが違います。(使った理由はわかりません)
  

この回答への補足

すみません。更に教えて下さい。

B RDIN

っていわゆる GO TO 文ですよね。
比較文等が無ければ、永久ループになると思うのですが
そこら辺が??の状態です。
もしかして PUT文で自動的に EOFIN に飛ぶのでしょうか??

申し訳ありませんが、教えていただきたいです。

補足日時:2002/01/29 22:30
    • good
    • 0

多分,汎用機、メインフレームのアセンブラと思います。



昔,富士通の汎用機でプログラムしたことや、アセンブラを眺めたことがありますが、
それらしい記述があります。
また、当時使っていた富士通のはIBMの汎用機の互換機です。

特徴的なのは,
>TFIN DCB DDNAME=TFIN,
にある、DDNAMEとか、
ファイルの形式を示している、
>RECFM=FB,
固定長ブロック形式をあらわすFBとかですね。
後は忘れました(^^;

ざっと見た感じでは,TFINから読み込んだ物をTFOUTに
単にコピーしているような感じです。
但し,ファイル形式は違うようですが。

# JCLもすっかり忘れたなぁ.

アセンブラの命令自体は、8080なんかとそんなに違わないので意味は見当つきますね。
ただ、レジスタが数字で表現して、命令中の場所で判断しないといけないので読み辛いです.

>ST 13,OCSV1+4
>LA 13,OCSV1
ストア、ロードで、13はレジスタ番号の13です。

この回答への補足

ごめんなさい。

L 13,=A(###@RSV)

って、13レジスタ ← ###@RSV って解りましたが、=A って何の意味があるか分かりますか??

教えて下さい。お願いいたします。

補足日時:2002/01/29 15:29
    • good
    • 0

詳しくないのでトッケンハッケンなこと書くかもしれませんが…



シャープのポケコン「PC-1360」用のモノではないでしょうか?
PC-1360用クロスアセンブラ「TNKASM」に、「EQU」という擬似命令があります。
TNKASMのオペコードは、SC61860(これもシャープのポケコン)機械語命令に擬似命令とマクロ命令を追加したもの、とあり、その擬似命令の一つが「EQU」でした。
「equ」ならX68000のアセンブラに出てくるのをwebで見たことがありますが。

#これ以外だとPICとかかなぁ

参考URL:http://www.linkclub.or.jp/~watanu/paso/log/TNKAS …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!