09.ビット操作と論理演算

By kamii - Last updated: 火曜日, 11月 11, 2008

CPU命令の解説の最後はビット操作と論理演算(AND,OR,XOR)です。ビット操作はとてもアセンブラーっぽいプログラミング技法です。1バイトあれば8つの情報を持てますし、使いこなせるとプログラムはとってもスマートになります。


ビット操作の命令


論理演算命令(And,Or,Exclusive Or)

Filed in S/370アセンブラー講座

08.比較と分岐・ループ、サブルーチンの呼び出し

By kamii - Last updated: 月曜日, 11月 10, 2008

分岐とループは実用的なプログラムを作る上での基本でもあります。関連する機能でもある比較と併せてS/370アーキテクチャーにおける、分岐・ループ、サブルーチンの呼び出しなどについて解説します。基本の分岐命令(BC命令)については「四則演算の基本と条件分岐」を見て下さい。


整数比較命令(Compare)


文字(文字列)比較命令(Compare Character)

これらの他にMVCL命令の比較版であるCLCL命令もあります。使用する機会は少ないと考えるので講座では解説しません。必要ならば命令リファレンスマニュアルを参照して下さい。


ループ制御に使う分岐命令


サブルーチンの呼び出し

サブルーチンの呼び出しも分岐命令です。S/370(XA)命令セットではアドレスモードによって複数の命令を使い分けられるようになっています。

Filed in S/370アセンブラー講座

06.REXX データの分解

By takao - Last updated: 月曜日, 11月 10, 2008
いきなり「データの分解」が現れたのはREXXにおいて、他のプログラムを呼び出したりする際の引数、戻り値、入力を処理する、などにおけるキー”PARSE”がわからないと、やる気がなくなってしまうからです。PARSEはデータの分解を行う命令です。

シンタックス


形式は次のとおり

PARSE  [UPPER]  ソース  テンプレート

ソースから供給されたデータを、テンプレートに分解します。[UPPER]が入っていたら全部、大文字に変換します。
ソースに許されているキーワードは次のとおり
です。
次は、テンプレートに使われる表現です。
これだけじゃ、なんのことやらほとんどわからんと思います。例をあげますので、ゆっくり読んでください。

パターン


例1.
/* REXX */
DATA = “Hello, the world!”
PARSE VAR DATA w1 w2 w3
SAY w1 “/” w2 “/” w3
結果:
Hello, / the / world!

ブランクで文字を区切っていくというのが基本動作です。

例2.
/* REXX */
DATA = “Hello, the world!”
PARSE VAR DATA w1 . w3
SAY w1 “/” w2 “/” w3
結果:
Hello, / W2 / world!

.(ピリオド)プレースホールダはこのように、その場所の文字を無視させます。その結果、W2にはなにも割り当てられませんでした。 これで欲しい文字列だけを変数に割り当てられます。

例3.
/* REXX */
DATA = “Hello, the world!”
PARSE VAR DATA w1 “,” w2 w3
SAY w1 “/” w2 “/” w3
結果:
Hello / the world!

注意してみてください。Helloから ,(カンマ)がなくなりました。場所あわせのため,を使ったため、W1にはHelloだけが割り当てられたのです。
データを変えてみましょう。
例4.
DATA = “YAMADA,TAROU,34,TOKYO”
PARSE VAR DATA SEI “,” MEI “,” . “,” BASHO
SAY SEI “/” MEI “/” BASHO
結果:
YAMADA / TAROU / TOKYO

カンマ区切りのcsvから必要なデータだけを抜き出すといったことが簡単にできます。

データがカンマなどで区切られていない代わりに、場所が決まっているという場合の取り出し方は次のとおりです。コンピュータの出力を処理する場合などは、むしろこのほうが多いかも知れません。

/*——123456789012345678901234567890123456789 */
DATA = “00000001 3F563F56 CCF53422 33652100 …..”

このデータで、頭から8文字目まではアドレス、欲しいデータは23文字目から4文字だとします。(上の3422のところ)
書き方はいろいろ考えられます。
素直に1文字目から長さ8をアドレス、23文字目から長さ4が値とすると、
PARSE VAR DATA 1 ADDRESS +8 . 23 VAL +4 .
となります。

さて、今まで”"や数字で指定したところをプログラムの変数で処理できないでしょうか?そのためには、次のようにします。

DATA = “00000001 3F563F56 CCF53422 33652100 …..”
OFFSET = 23
PARSE VAR DATA 1 ADDRESS +8 . =(OFFSET) VAL +4 .

変数で位置を指定する場合は、絶対位置なら=、相対位置ならば+を明示してください。

ソース


変数を入力とする場合は、上のパターンの学習でさんざんやりましたから、いいでしょう。他の入力をご紹介します。

端末
PARSE PULL INPUT
SAY INPUT
PULLは、スタックのところで学んだように、スタックになにもなければ端末の入力待ちとなります。
その結果、エンターキーを押すまでの入力を得ることができます。

ARG
サブルーチンの引数を得る場合に使います。

CALL add 1,2
SAY RESULT
EXIT

add: PROCEDURE
PARSE ARG a,b
RETURN a + b


あとのソースはあまり使わないので、必要に応じてマニュアルを見てください。
Filed in REXX入門

07.文字(文字列)の操作

By kamii - Last updated: 日曜日, 11月 9, 2008

S/370アーキテクチャーではバイト(8ビット)が情報の基本単位です。EBCDICコードもそうですが、1文字は1バイトで示されます。事務処理や制御系のプログラムでは四則演算よりも文字(文字列)の取り扱いの方が多いでしょう。S/370はバイト操作に関する命令も豊富に持っています。


バイト転送命令


変換・探索・編集命令

以降の命令は、アセンブラービギナーには扱いが面倒なものです。こんなものもあるのか、と言う程度で名前だけ覚えるぐらいでもいいです。必要に迫られたら、リファレンスマニュアルなどを参考にしてトライして見て下さい。

Filed in S/370アセンブラー講座

米国人気質と日本人気質なのか?

By kamii - Last updated: 日曜日, 11月 9, 2008

週刊誌を見ていたらこんな本の広告があった。

中身を見ていないので内容については語らないが、広告にこんなくだりがあった。

長年ISVで海外のソフトウェア製品を扱ってまざまざ感じたことがある。大した顧客数じゃなかったから全部を知ってるわけではないし、実際はみんながみんなそうではないだろうが、企業の情報システム部門に携わる人達って昔に比べてだんだんネガティブになってきたように思える。パッケージソフトに関して言えば、開発元の人達の感覚って例えバグが多くても、それはそれ(もちろん直しますよ)、でもこのソフトの良さをもっと見てくれよ!とプラス思考が前に出てます。でも日本のお客さんは、これが出来なきゃだめ、あれも出来なきゃだめ、うちの会社の場合はこうでないとだめ、絶対問題が起きないって保証できます?…と結構マイナス思考で突いてくる人が多くなったように思う。はっきり言ってすんごーくストレスでしたよ。自分で作ったもんならわかったよ、好きにしてやるよ!って開き直ることもできるのですが、何せ人様が作ってるソフトで版権もありませんから結構板挟みってことも多かったです。もちろん人種で単純に分かれることではないけど、そんな風に感じてました。

これも某国産メーカーのソフト製品を作った時のことなんですけど、存在しないパラメーターやパラメーターに間違った値を設定した時など、いちいちエラーにしないで、無視したり、デフォルト値などに自動修正して、ワーニングのMSGは出すけど起動の処理は続けるって仕様で出したら、却下されたことがあった。必ずエラーにして落としちゃってくれって。そうしないとパラメーターに設定した値で動いているものだと勘違いしてしまい、別の意味で混乱を招くからだそうです。誤りなら誤りだとはっきりしてくれた方がいいって。小さな親切大きなお世話ってことでしょうか。MVSや当時やってたソフトも近年は多少のパラメーター・エラーぐらいじゃ起動は続けるっていうようになってたから、そういう風にデザインしたんですけど。やっぱり米国人と日本人の違いかなぁってその時も思いましたよ。もちろん作る上では止めちゃう方がはるかに楽ちんだけど。

希望と危機って言うほどではないが、ポジティブかネガティブって思うと何か妙にあてはまるかなぁ…

Filed in つぶやき・雑感

06.四則演算の基本と条件分岐

By kamii - Last updated: 金曜日, 11月 7, 2008

四則演算はS/370命令セットの中でも最も基本的な命令群の1つです。ハーフワード(半語:2バイト)とフルワード(語:4バイト)の2種類の整数値を取り扱うことができます。ただし乗除算だけは少し複雑です。また演算命令の結果として条件コードと言うものがセットされます。条件コードを具体的に知ってもらうために、分岐命令も追加で解説します。


加算・減算命令(Add,Subtract)


乗算・除算命令(Multiply,Divide)


2進数と10進数の変換

整数は2進整数なので、そのままでは人間が見てわかるアウトプットには使えません。まず10進数に変えて、さらに数字(文字)に変える必要があります。


分岐命令(Branch on Condition)

ちょっと横道へ逸れて、分岐命令を1つ解説します。加減算命令で出てきましたが、命令には実行した結果が条件コードとしてセットされるものがあります。条件コードがどうなるかを具体的に覚えるにはPSWを見るより、後続で実行する命令を分岐させる方がわかりやすいです。

Filed in S/370アセンブラー講座

FTPによるJES2スプールアクセス

By kamii - Last updated: 金曜日, 11月 7, 2008

FTPクライアントからz/OSのFTPサーバーにログインした後、QUOTE SITE FILETYPE=JESコマンドを入力すれば、以降のアクセスをデータセットではなくスプール内のジョブに切り替えることができます。JESスプールのアクセスモードではディレクトリは意味を持ちません。データセットのアクセスに戻す場合はQUOTE SITE FILETYPE=SEQと入力します。


LS

LSコマンドでスプール内のジョブをリストアップできます。表示できるジョブ範囲はFTPサーバー定義のJESINTERFACELEVELによって異なります。

JESINTERFACELEVELがどちらのモードで利用できるかは、FTPデーモン空間の起動プロシージャ(FTPD)のSYSFTPD DD文に定義されたパラメーターで指定されます。ジョブの実行結果をPCに転送し、使い慣れたエディター等を使って参照するには非常に便利な機能です。活用するにはJESINTERFACELEVELは2になっているといいでしょう。


GET JOBnnnnn PC側ファイル名

ジョブ内の転送可能なすべてのSYSOUTをPC側へ転送します。ジョブIDに.番号でSYSOUT番号を指定すればそのSYSOUTデータセットのみを転送します。「GET JOB30.5 D:\SYSOUT.txt」とすればジョブID JOB00030の先頭から5番目のSYSOUTデータセットをDドライブのSYSOUT.txtファイルとして転送します。なおGETでSYSOUTを転送してもスプール上から削除されることはありません。


DELETE JOBnnnnn

指定したジョブをスプールから削除します。実行中であればキャンセルされ削除されます。


PUT PC側ファイル名

指定したPCファイルをJCLとしてサブミットします。ホスト側ファイル名の指定は不要です。

Filed in 知っておくと便利なテクニックなど

SYSOUTデータセットの取り出し(XWTR)

By kamii - Last updated: 金曜日, 11月 7, 2008

JES2スプールに書き出されたSYSOUTデータセットは順次編成データセットに移すことができます。これはエクスターナル・ライター(外部書き出しプログラム)と呼ばれるプログラムの機能です。SYSOUTはSDSFやPFDなどのTSOの対話型機能によって画面表示されることが多いですが、XWTRを使いPSデータセットに移せば、FTPやファイル転送機能でPCなど他のコンピュータへ送ることもできます。取り出すSYSOUTの数が多ければXWTRの方が手間が掛かりません。


XWTR起動プロシージャ・サンプル


XWTRの起動操作

Filed in ありがたいサンプルJCL, 知っておくと便利なテクニックなど

ダンプの採取とフォーマット

By kamii - Last updated: 木曜日, 11月 6, 2008

ダンプとはプログラムおよびプログラムが使用しているメモリー上のデータを、診断のためにデータセットに書き出したものです。プログラムが動いているジョブのアドレス空間のメモリー内容が出力されます。
MVSではプログラムが異常終了した時や、固まって動かなくなってしまった時(WAITやLOOP)はメモリーダンプを採って、そのダンプリストを基に異常の原因を調査することがよく行われます。アプリケーションの場合は使用する言語プログラム(COBOLやPL/Iなど)のデバッグ機能や、トランザクション処理システム(CICSやIMS)が提供する診断機能などを使いますが、アセンブラー言語で作成されたプログラムやミドルウェア製品自体に異常が起きた場合、ダンプは原因究明の重要な調査資料になります。


SYSUDUMPとSYSABEND

MVSではダンプは基本的な診断資料なので、特別な操作をしなくても必要なときに自動的に書かれます。
JCLにSYSUDUMP DD文またはSYSABEND DD文を定義すれば、プログラムが異常終了した時やCANCELコマンドでダンプの出力が指定された時に、MVSによってDD文に指定されたデータセットに出力されます。通常は出力先としてSYSOUTが指定されることが多いでしょう。

SYSUDUMPとSYSABENDには本質的な違いはなく、ダンプを採る範囲の違いによって使い分けられます。それぞれがどの範囲をダンプするかはMVSのパラメーターに定義されます。多くのユーザーではSYSUDUMPはユーザーアプリケーション用、SYSABENDはシステムプログラム用として使い分けられます。

予めダンプ出力用データセットを作成しておく場合は、PSデータセットとして容量のみを指定します。RECFM、ブロック長、レコード長はMVSがダンプ出力時に設定し直します。



システムダンプ(SVCダンプ)

システムダンプはSVCダンプとも呼ばれ、プログラムの異常終了ではなく、オペレーターがコマンドによって採取するダンプです。アドレス空間内の仮想記憶域の内容を書き出すので、アドレス空間ダンプとも呼ばれます。ダンプデータは予めシステムに定義したダンプ・データセット(SYS1.DUMPnn)に出力されます。SYSUDUMP、SYSABENDと違ってバイナリー形式のままなので解析には専用のユーティリティを使ってフォーマットします。OSのモジュールも異常を検知した場合などに、自らこの形式のダンプを出力します。
一般のプログラムでは通常使われませんが、ミドルウェアやISV製品などでは診断資料としてよく利用されます。特にWAITやLOOPなど、プログラムが正しく動けずに止まってしまっているような状態では、アドレス空間ダンプはエラーの状態のままメモリー内容がダンプされるため、より正確な診断が可能になります。

通常はRGNでリージョン全域を採れば十分ですが、必要に応じてCSAやLPA域を追加します。データベースのように複数の空間からのサービスを受けるようなプログラムではCSAやSQAなども必要となる場合があります。

DUMPコマンドを使用する前に、D DUMPコマンドで空きのダンプデータセットがあるかを確認します。必要ならばDD CLEAR,DSN=nnコマンドで使用済みダンプデータセットをクリアーします。(MSPとVOS3ではユーティリティによるクリアーが必要)




関連マニュアル

Filed in ありがたいサンプルJCL, システムプログラマーのための手引きいろいろ

05.REXX 制御文

By takao - Last updated: 木曜日, 11月 6, 2008

DO, END

Cなどで{}で囲むところをREXXではDO ENDで囲みます。不正確さを承知の上で簡単に説明すると、DO ENDで囲むことで複数の命令が一塊りとして扱われます。
DO
VAR1 = “HELLO”
VAR2 = “WORLD”
say VAR1 VAR2
END

IFと条件式の評価

IF文などはなにかのプログラミング言語を知っている人ならば、例を見たら説明は必要ないと思います。

IF VARIABLE = 0 THEN
SAY “zero”
ELSE
SAY “non zero”

ただ、IF文やループでは必ず「条件式の評価」というのが必要です。
比較演算子は以下のものがあります。
>, <, >=, <=, = これらはおなじみでしょうが、
<> が等しくない(not equol)です。

Do ループ

条件式でのループの例です。

NUMが3より小さい間、繰り返す。
NUM = 0
DO WHILE NUM < 3
SAY "small"
END

条件になるまで、繰り返す。(WHILEとの違いは必ず一度は行われる)
NUM = 4
DO UNTIL NUM >3
SAY “LARG”
END

決まった回数繰り返す
DO 5
SAY “hello”
END

変数をコントロールしながら繰り返す
DO I=1 to 100 BY 2
SAY I
END

ループから途中で抜けたい場合には、LEAVEか、ITERATEを使います。
LEAVEは、もっとも内側のDO ENDを終了してしまいます。ITERATEは、もっとも内側のDO END内をDOに戻って行います。

LEAVEの例:
DO 4
say “—–”
DO 3
SAY “test”
LEAVE
END
END

結果:
—–
test
—–
test
—–
test
—–
test

ITERATEの例
DO 5
SAY “—–”
DO 10
SAY “test”
ITERATE
END
END

結果:
—–
test
test
test
—–
test
test
test
—–
test
test
test
test
—–
test
test
test

SELECT, WHEN, OTHERWISE, END

REXXのSELECT文は、あまり便利とはいえません。以下のように違う条件を書け、わかりにくくなる可能性があります。

VAR1 = “blue”
VAR2 = “yellow”
SELECT
WHEN VAR1 = “blue” THEN SAY “blue”
WHEN VAR2 = “red” THEN SAY “red”
WHEN VAR2 = “yellow” THEN SAY “yellow”
OTHERWISE
SAY “white”
END

NOP

なにもしない命令です。こういう時に使います。
IF A=B THEN
NOP
ELSE
SAY “not qual”

以上で制御系はおわりです。
Filed in REXX入門