• 締切済み

アセンブラーのプログラムに関して

アセンブラー/370の古いプログラムを明日までに解析しなければならなくなってしまいました。 プログラムは下記のようなものなのですが処理内容がわからず困っております。 つきましては… (1)もしお分かりになられる方がいらっしゃいましたら どのような処理を行っているか教えていただけないでしょうか? よろしくお願いします。   AH   2,=H'18'   STH  2,*+8   DC   X'F070'   DC   S(エリア名称)   DC   H'0'   BNH  RTN

みんなの回答

回答No.5

もうとっくにご本人には関係なくなっているでしょうが、ちょっと気になるコーディングですのでコメントしておきます。 (各インストラクションの解説は#4の回答を参照して下さい。) シフト対象のエリア長が8バイトになっているので、多分(エリア名称)で指定されている内容は15桁のパック10進数と考えられます。 そこで、レジスター2の内容がとても気になります。 仮にレジスター2の値が0だとすれば、左に18桁シフトすることになり、0以外の値であれば確実にオーバーフローしてしまいます。 最後のBNHではシフトの結果としてオーバフローしないで正の数字が残るケース以外はすべてRTNにブランチすることになっているので、ですからレジスター2が0だとすると、当該エリアの値が何であれエリアは結果的に0となりかつRTNにブランチします。 したがって、レジスター2にはなにか可変な値が入っていると見るのが妥当でしょうね。 この時注意しなければならないのは、STHで設定されるシフト桁数は6ビットの2の補数であることです。 すなわち32以上の数字が入っている場合はマイナスと見做し、右シフトになります。 しかし、実際のプログラムにこのようなコーディングがされることがあるのか、若干疑問に感じています。命令をDCで定義すること自体望ましくなく、その上命令の一部を実行時に書き換えているのも好ましくありません。レジスターの中身を判定して処理を分割すれば、多分意図する目的は確実に実現できるはずで、もっとシンプルなコーディングになるはずと考えられます。

  • backy0175
  • ベストアンサー率87% (102/116)
回答No.4

こんにちは。 もう返事は不要かもしれませんが、かつてSystem370でバリバリとアセンブラを書いていたので懐かしくてリプライします。   AH   2,=H'18' ← レジスタ2番にハーフワードの18を加える   STH  2,*+8 ← レジスタ2番をこの命令から数えて8バイト先に格納する(次の命令のパラメータ DC H'0' を変更している)   DC   X'F070' ← F0がSRP(Shift and Round Decimal)という命令 7が長さ-1なので、10進数で8、0は丸めの桁数   DC   S(エリア名称) ← パラメタ1のアドレス(ベースレジスタ+オフセット)   DC   H'0' ← パラメタ2(STHで設定される)   BNH  RTN ← パラメタ1がパラメタ2よりも大きく無い場合にRTNにブランチ 以上、古い記憶を遡って書きましたので、間違えている部分もあるかもしれませんが、よかったら参考になさってください。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

System/370のニーモニック表のようです http://www.simotime.com/asmins01.htm Branch命令 http://www.simotime.com/asmbch01.htm

参考URL:
http://www.simotime.com/indexasm.htm
soulbird12
質問者

お礼

ニーモニック表へのリンクありがとうございます。 私はニーモニックを理解するのにも四苦八苦するwレベルですが がんばって勉強していきたいと思います。 ありがとうございました。

  • mizmiz
  • ベストアンサー率45% (46/101)
回答No.2

これはIBMの汎用機のアセンブラでしょうか? 20年くらい前に汎用機のアセンブラの仕事をしたことがある程度でほとんど記憶にないのですが、当時すでにほとんど使われておらず特殊な用途で必要に迫られてやりました。 アセンブラ世代の人に教わりながらやったのですが、開発のベースとなったプログラムの解析で困ったのはプログラムでプログラム自身を書き換えることでステップ数を節約するといった手法が当たり前に使われていました。 提示のソースを見てもニーモニックを理解できるだけの記憶がないのでお役に立てそうにないのですが、上記のような手法を使っているのではないかと思います。 主にテーブルで複数分岐をする場合などですが、そういう可能性もあるという目で見れば理解の助けになるのではないでしょうか。 お役に立てないかもしれませんが参考までに。

soulbird12
質問者

お礼

そうですね。IBMの汎用機のアセンブラで370を使った プログラムになっていると思います。 お役に立てないなんてとんでもありません。 回答参考にさせていただきます。ありがとうございました。

回答No.1

これって連続した命令群ではなくて、分からない命令を部分的に抜き出したものですか? 処理内容というのは、それぞれの命令の意味を個々に知りたいということでしょうか?

参考URL:
http://homepage1.nifty.com/ttakao/370asm/index.html
soulbird12
質問者

補足

これって連続した命令群ではなくて、分からない命令を部分的に抜き出したものですか? →はい。一応連続した命令群となっています。 処理内容というのは、それぞれの命令の意味を個々に知りたいということでしょうか? →そうですね。今のままですと取っ掛かりもつかめない状態なので個々の意味だけでも分かると 大変ありがたいです。

関連するQ&A