突然、下記のようなプログラム(アセンブラらしい)を多々渡されて、「これを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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCASL アセンブラ命令 アプリ機能

例えば、CASLのアセンブラ命令にDCがある。
LABER DC 100 とすると。
これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。

CASLには機械語命令・マクロ命令・アセンブラ命令がある。

機械語命令は人に分かりやすいようにニーモニックが付けられているだけだが、
アセンブラ命令はプログラムが変更されればそのアドレスは移動するという、ハンドアセンブリでは、できない機能が含まれている。

アセンブリ言語は色々ありますが、アセンブラ言語は人に見やすいようにニーモニックが付けられているだけでなく、CASLのDC命令のように、ハンドアセンブリではできないアドレスの自動変更のようなアプリケーションとしての機能(OS的機能)も一般にふくまれているとかんがえてよいのでしょうか?

よろしく願います。

Aベストアンサー

No1です。

>プログラムの変更==>DCでアドレスの自動変更

DC命令に限らず、命令につけられたアドレスが何番地であるかを計算(カウントアップ)するのは、アセンブラの基本機能です。これがないと、生成した機械語命令を何番地に格納したらいいのかわからない。

>という、アセンブラ言語が単にニーモニックの記述だけでない、アプリとしての機能(OS的機能)が含まれているかという質問です。

アセンブラはアプリなので、ニーモニックを解釈したり、上記のアドレスの計算をしたりするのは、アセンブラというアプリの機能です。OSは関係ありません。OSの上でアセンブラというアプリが動いているだけ。

>LABER DC 100 とすると。
>これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。

もしかして勘違いがあるかもしれませんが、
LABER DC 100
というのは、
「LABERという名前のラベルを現在の命令格納アドレスポインタの値で定義して、そのアドレスの1ワードに100を入れて、命令格納アドレスポインタを+1する」
で、
LABEL NOP
という機械語命令は、
「LABELという名前のラベルを現在の命令格納アドレスポインタの値で定義して、そのアドレスの2ワードにNOPの命令コードを入れて、命令格納アドレスポインタを+2する」

と、いうことで、DC命令と機械語命令はアセンブラの動作(ソースファイルをアセンブルして命令コードファイルを作る際の動作)としては格納するデータがちょっと違うだけです。DS命令も、データの長さが1とか2でなく可変であることと、データに何が入るか分からないというくらいの違いだけです。

No1です。

>プログラムの変更==>DCでアドレスの自動変更

DC命令に限らず、命令につけられたアドレスが何番地であるかを計算(カウントアップ)するのは、アセンブラの基本機能です。これがないと、生成した機械語命令を何番地に格納したらいいのかわからない。

>という、アセンブラ言語が単にニーモニックの記述だけでない、アプリとしての機能(OS的機能)が含まれているかという質問です。

アセンブラはアプリなので、ニーモニックを解釈したり、上記のアドレスの計算をしたりするのは、アセンブラとい...続きを読む

QUnityのエラー「Rigidbody.AddForce(0,0,speed);」

UnityでJavaを書いています。
実行すると

Rigidbody.AddForce(0,0,speed);

上記の箇所にエラーがあると言われたのですが、
どこが問題なのかわかりません。

お分かりの方がいたら、ご教授ください。
その前後のコードも記載します。


//上矢印キーが押された場合
if(Input.GetKeyDown(KeyCode.UpArrow)){
//玉のZ軸に対して正の力を加える
Rigidbody.AddForce(0,0,speed);
}

//下矢印キーが押された場合
if(Input.GetKeyDown(KeyCode.DownArrow)){
//玉のZ軸に対して負の力を加える
Rigidbody.AddForce(0,0,-speed);
}

Aベストアンサー

Javaは凄くうっすらやった事がある程度なのですが、
こちらのサイトを参考にすると「Rigidbody.AddForce(」の後は
数字ではなく英語にて指示を記述しているので、そこを変えてみたら直るかも…?

http://openbook4.me/projects/161/sections/1045

Qアセンブラの擬似命令について

kigin と申します。
アセンブラの擬似命令に「align」というものがありますがこれは一体どういう意味なのでしょうか?
また、アセンブラの擬似命令やアセンブラプログラミングに関して詳しいガイダンス的な紹介がなされているホームページ等がありましたら、教えていただきたいのですが。
よろしくお願いいたします。

Aベストアンサー

CPUによっては2バイト分を読み書きしたりする(ワードアクセス)のときは
アドレスは偶数アドレスでなければならないとかあるCPUがあってそのときに
align 2としてもしそのデータがそのまま奇数アドレスにおくこと
になりそうなときにちゃんとダミーデータをおいて偶数アドレスから
はじめてくれるものです。

良く使うのはIntel系CPUは2バイト境界がいいとか4バイト境界が早いとかで
やります

QC# String str = @”test”;の@の意味

C#でStringに文字列を代入する際に
String str = @”TEST”;
などと「@」をつけているコードがWeb上にありますが
@の意味はなんですか?また@以外で似たような
記号があれば教えてください。

Aベストアンサー

@"~" で「逐語的リテラル文字列」というらしい.

参考URL:http://msdn.microsoft.com/ja-jp/library/aa691090(VS.71).aspx

Q[GNUインラインアセンブラ] SIMD命令

下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。

これは、なぜなのでしょうか。

---- Begin source code -----
1 #include <stdio.h>

2

3 int

4 main()

5 {

6 short int a[4] = {1111,1112,1113,1114};

7 short int b[4] = {1111,2112,3113,4114};

8 short int c[4];

9

10 asm volatile (

11 "movq (%1),%%mm0\n\t"

12 "movq (%2),%%mm1\n\t"

13 "psubsw %%mm1,%%mm0\n\t"

14 "movq %%mm0,%0\n\t"

15 "emms"

16 : "=g"(c): "r"(&a),"r"(&b));

17

18 printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);

19

20 return 0;

21 }
---- End source code -----

Intel developper's manual (http://www.intel.co.jp/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf)

PSUBSW mm, mm/m64
Subtract signed packed words in mm/m64 from signed packed words in mm and saturate results.

下記のようなGNUインラインアセンブラを含むプログラムをMac Book Airにてgccでコンパイルして実行するとPSUBSW命令は、mm0 - mm1の結果がmm0に入りますが、IntelのDevelopper's manualのPSUBSW命令の説明においては、mm1-mm0の結果がmm1に入るとなっています。

これは、なぜなのでしょうか。

---- Begin source code -----
1 #include <stdio.h>

2

3 int

4 main()

5 {

6 short int a[4] = {1111,1112,1113,1114};

7 short int b[4] = {1111,2112,3113,4114};

8 short int c[4];

...続きを読む

Aベストアンサー

詳しくないのですが、アセンブラの書式にはAT&T式とIntel式があり、オペランドのソースとデスティネーションが逆のようです。

Qオートマトン L = {ww^R: w ∈ {a, b}+}の中心の見つけ方

下記のようなオートマトンがあります。

L = {ww^R: w ∈ {a, b}+}
M = (Q, Σ, Γ, δ, q0, z, F)
Q = (q0, q1, q2),
Σ = {a, b},
Γ = {a, b, z},
F = {q2}.

(1)wをスタックに載せるために:
δ(q0, a, a) = {(q0, aa)}
δ(q0, b, a) = {(q0, ba)}
δ(q0, a, b) = {(q0, ab)}
δ(q0, b, b) = {(q0, bb)}
δ(q0, a, z) = {(q0, az)}
δ(q0, b, z) = {(q0, bz)}

(2)どこが文の中心か見つけるために(状態がq0からq1に変わる):
δ(q0, λ, a) = {(q1, a)}
δ(q0, λ, b) = {(q1, b)}

(3)w^Rと一致させるために:
δ(q1, a, a) = {(q1, λ)}
δ(q1, b, b) = {(q1, λ)}

(4)最後に:
δ(q1, λ, z) = {(q2, z)}

とあります。
問題の中にこれを元にしてL = {wcw^R: w ∈ {a, b}*}のnpdaをつくりなさい、
というのがありますが、それは(2)を
δ(q0, c, a) = {(q1, a)} ←cが入力されたらそこが中心
δ(q0, c, b) = {(q1, b)}
に変えて
δ(q0, λ, z) = {(q2, λ)} ←何も入力されなかったら文字を受け付ける(* → +なので)
を付け加えればよいですか? (多分、そうですよね?)

それと、上の(2)がどうやって中心を見つけているのか分かりません。
入力中は何文字入力されるかなんて分かりませんよね。
例えばbaabbaabという文があったとすると最初の四文字でbaabで
「さては中心はbaとabの間だな!」とか勘違いとかしないんですか?
入力がλということは毎回毎回入力がある度にチェックしているということでしょうか?
混乱している私に分かりやすい説明ができる方、どうかお願いします。

下記のようなオートマトンがあります。

L = {ww^R: w ∈ {a, b}+}
M = (Q, Σ, Γ, δ, q0, z, F)
Q = (q0, q1, q2),
Σ = {a, b},
Γ = {a, b, z},
F = {q2}.

(1)wをスタックに載せるために:
δ(q0, a, a) = {(q0, aa)}
δ(q0, b, a) = {(q0, ba)}
δ(q0, a, b) = {(q0, ab)}
δ(q0, b, b) = {(q0, bb)}
δ(q0, a, z) = {(q0, az)}
δ(q0, b, z) = {(q0, bz)}

(2)どこが文の中心か見つけるために(状態がq0からq1に変わる):
δ(q0, λ, a) = {(q1, a)}
δ(q0, λ, b) = {(q1, b)}

(3)w^Rと一致させるため...続きを読む

Aベストアンサー

先の2つの御質問からすると、non-deterministic(非決定的)なPDAを考えているわけですよね。

非決定的なオートマトンでは、「1つの入力系列に対して複数の遷移経路が考えられるが、そのうち1つでも受理状態で遷移が終了する経路が存在すれば、オートマトンはその入力を受理する」と考えます。

baabbaabの例であれば、"b"しか入力されていない状態、"ba"まで入力された状態、...、"baabbaab"まで入力されてしまった状態、のどこで(2)の遷移をやってもいいんです。
そのうち"baab"の状態で(2)の遷移をすれば受理状態で遷移が終了するので、このオートマトンは"baabbaab"を受理するといえるわけです。

> それは(2)を
> ....
> を付け加えればよいですか? (多分、そうですよね?)
そこはそれで合っていると思いますよ。

Q8086アセンブラで、メモリ間のデータをストリング命令でブロック転送したい

ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。
【目的】PC-9801本体のCバス(汎用拡張スロット)に挿したサウンドボード上の
ROM BIOSを読み出し、バイナリファイルに落としたい。既にエミュレータ用に実機からの
吸出しツールは存在するが、ソースが無いので、自作することにした。
その前段階としてアセンブラの修行も兼ねて、ROM BIOSの先頭3ワード(6バイト)を
メモリ上のバッファにコピーし、比較して値の合致を確認したい。
将来的にはSCSI ROM BIOSの解析等を試みたい。

【方針】8086のストリング命令でダイレクトにメモリtoメモリでブロック転送を
する。具体的にはrep movsbを用い、6バイトを転送する。

【備考】PC-9801-26K互換音源のROM BIOS(少なくとも先頭8バイト)は一意であり、
その並びは、0001h, 0000h, 00d2h である。例外はありません。
86音源でも同様で、下位互換性があることは、拙作ツール(OPNCHK.COM)にて確認済み。
なお、上記バイト列は、セグメントCC000h:オフセット2E00hから読み出し
可能である。
なお実行にあたり、所謂メモリマネージャの類(MELEMM.386等)は一切
組み込まない状態で行なう(EMSメモリマネージャ等との同居対応は将来の課題とします)。

【開発環境】PC-9801DA2(Cyrix Cx486DLC-25MHzに載せ換え; 13.6MB RAM; HA-55BS4 SCSIボード
+ 240MB SCSI HDD + SONY CPD-17SF9 CRT
+ NASM 2.06rc10 on NEC DOS 5.0A-H + Turbo Debugger v3.2 と、
秋葉で買ったジャンクFDに入ってたMASM ver 3.00;
予備機 VX41/RS21/EPSON 286VF/EPSON 486HX2/Xv13R16[K6-2 400MHz]/
AT互換機上のNekoIIエミュ/Cygwin上のnasmw.exe)

【参考書】PC-98、8086アセンブラ、テクニカルデータ、古雑誌等 定番本100冊ほど

【拙作コードの失敗点をご指南いただきたい。NASMコードですが、MASM/TASMでも構いません】
; PC-9801-26K compatible Sound ROM BIOS Copy Program (i/o address 0188h)
; Programmed by OrzHacker666
; Date 2009-07-13 for NASM 2.06rc10

[Bits 16]
org 100h ; COM program
section .text
start:
push es ; これを保存しないと、
push ds ; 画面がめちゃくちゃになる

mov ax, 0cc00h ; Sound ROM セグメントアドレス
mov es, ax
mov ds, ax ; DS:SI -> ES:DI 無意味か?
mov bx, 2e00h ; Sound ROM オフセットアドレス

lea si, [es:bx] ; ES:BX がSound ROMの開始点
lea di, [ds:sbuff] ; sbuffは仮に確保したバッファ。
; どこにあるかは、当たり前ですが、不明。そこら辺はCの変数宣言と同じですが。

mov cx, 8 ; とりあえず、アタマ8バイトをコピー
cld
rep movsb

CompareWithOriginal:
cmp word [es:bx+4], 00d2h ; これは通る。当たり前。
jne FailedCpyRom
cmp word [ds:sbuff+4], 00d2h ; ここで失敗判定。なぜ?
jne FailedCpyRom
; sbuffにes:bx~が正しく
; 転送されていないのか?
SuccessCpyRom: ; これを拝めれば…。
pop ds
pop es
mov ah, 9
lea dx, [SUCCESSMsg]
int 21h
mov ax, 4c00h
int 21h

FailedCpyRom: ; 見飽きましたOrz
pop ds
pop es
mov ah, 9
lea dx, [FAILEDMsg]
int 21h
mov ax, 4c00h
int 21h

section .data
SUCCESSMsg:
db 'Succeeded !!', 0dh, 0ah, '$'
FAILEDMsg:
db 'Failed(--;)', 0dh, 0ah, '$'

section .bss
sbuff:
resb 8 ; Cで書くと、差し詰め unsigned char sbuff[8]; であろうか…。

識者の方、よろしくお願いいたします。気になって夜も眠れません。

ソースが長めなので、簡潔に書きます。ご無礼の段、ご容赦ください。
【目的】PC-9801本体のCバス(汎用拡張スロット)に挿したサウンドボード上の
ROM BIOSを読み出し、バイナリファイルに落としたい。既にエミュレータ用に実機からの
吸出しツールは存在するが、ソースが無いので、自作することにした。
その前段階としてアセンブラの修行も兼ねて、ROM BIOSの先頭3ワード(6バイト)を
メモリ上のバッファにコピーし、比較して値の合致を確認したい。
将来的にはSCSI ROM BIOSの解析等を試みたい。

【方針...続きを読む

Aベストアンサー

>回答中の、"cmp word es:[di-4], 00D2h"は
MOVSD×2でDIはsbuff+8を指しています。DI-4はsbuff+4のことです。
これくらいはアセンブラをやる以上、直ぐに分かってください。

>sbuff自体については、セグメント値は不定で、調べる意義は無い
ちょっと乱暴な話ですね。sbuffはbss(初期値なし静的領域)のよう
なので、実行時のDSです。

確実なのはtextセグメント(コードと同じ)に次のようにデータを
定義して使います。
LES  DI,CS:adr 'ES:DIにsbuffのセグメント:オフセットが入る
== 中略 ==
adr  DD sbuff 'sbuffのセグメント:オフセットが記録される

>DS=ESではダメです
だって、そうなっていますよ。AXをDSにもESにもMOVしてます。
前にも書いたんですが、セグメントの使い方が分かっていない?

前のサンプルは上記仮定(sbuffは実行時DSにある)で作っています。
PUSH DS、POP ES ES←DSにしています。(受け取り側が実行時DS)
この後で、DSに0CC00hを代入しています。

>[es:]のオーバーライドは必須です
CMP   WORD ES:[DI-4],00D2h
ちゃんと、ESでオーバライドしてるはずですけどね。

>ジレンマに陥ります
どこがでしょう?アセンブラで、セグメントレジスタを使う以上は
自分の自由に使えば良い訳で、適当に値を設定したり、戻したりすれば
済む話なのでは?
例:
REP  MOVSB
PUSH  DS
PUSH  ES
POP   DS
POP   ES
後の4命令で、DSは実行時DSに戻り、ESはROMセグメントを指します。
サンプルではこれをやっていないので、実行時DSはESにある状態です。
故にセグメントオーバーライドしています。

>回答中の、"cmp word es:[di-4], 00D2h"は
MOVSD×2でDIはsbuff+8を指しています。DI-4はsbuff+4のことです。
これくらいはアセンブラをやる以上、直ぐに分かってください。

>sbuff自体については、セグメント値は不定で、調べる意義は無い
ちょっと乱暴な話ですね。sbuffはbss(初期値なし静的領域)のよう
なので、実行時のDSです。

確実なのはtextセグメント(コードと同じ)に次のようにデータを
定義して使います。
LES  DI,CS:adr 'ES:DIにsbuffのセグメント:オフセットが入る
== 中略 ==
...続きを読む

QGASの.align 4,0x90の0x90の意味

Cソースをアセンブリしたとき、.align 4,0x90とでるのですが、.align 4,0x90の0x90はどういう意味ですか。align 4+NOPという意味ですか。それとも4Bを0x90で埋めろと意味ですか。どちらでしょう。

Aベストアンサー

困ったときはまずマニュアルを読む.

参考URL:https://sourceware.org/binutils/docs-2.24/as/Align.html#Align

Q自分でアセンブラ言語を作れる?

自分でアセンブラ言語を作れる?
あるCPUにmov命令というのがありますが命令名をソフトウェアレベルで変えることは
出来るのでしょうか?
(mov ax,1をmove ax,1にしたり)
アセンブラはCPUが同じならどれも同じだと思っていたのですが
プログラムを終了する時、windowsはint 21hなのにlinuxはint 0x80なので
疑問に思いました。

Aベストアンサー

> windowsはint 21hなのにlinuxはint 0x80なので
これはアセンブリ言語の問題ではなくAPIの問題です。
intはソフトウエア割り込み命令でBIOSやAPIを呼び出すのに使います。
同じような機能でもWindowsやLinuxなどのOSが違えば呼び出しアドレスが違うのは当然です。

> アセンブラはCPUが同じならどれも同じだと思っていたのですが
アセンブリ言語のニーモニクはCPUメーカーが同じなら同じです。
が、CPU毎に同じなのはマシン語であってアセンブリ言語のニーモニクではありません。
例えばインテル8080とザイログZ80はマシン語レベルで高い互換性がありますがアセンブリ言語のニーモニクは大きく異なります。
最終的にマシン語コードが出来上がればニーモニクはmov ax,1でもmove ax,1でもax=1でも関係ありません。

Qアセンブラの .= について

下記のようなコードで、. = start + 3/. = _start + 4 の処理について教えて頂ければ幸いです。
.globl _start;
_start:

jmp skip
nop
. = _start + 3
. = _start + 4
.byte 0
skip:

Aベストアンサー

先ずアセンブラマニュアルの中に説明がある筈ですので調べて下さい。

"gas アセンブラ マニュアル" としてサーチ ==>
"gnu アセンブラ マニュアル"
==>
GASリンク集 - プログラミング言語リンク集
http://asm.sourceforge.net/
.....
http://sourceware.org/binutils/docs-2.23.1/as/Dot.html#Dot
5.4 The Special Dot Symbol

The special symbol `.' refers to the current address that as is assembling into. Thus, the expression `melvin: .long .' defines melvin to contain its own address. Assigning a value to . is treated the same as a .org directive. Thus, the expression `.=.+4' is the same as saying `.space 4'.

http://translate.google.com/ にコピペして翻訳
5.4特殊なドット記号

特殊記号`。などへのアセンブルされている現在のアドレスを参照します。したがって、表現`メルビン:長い'。自身のアドレスを含むようにメルビンを定義しています。に値を割り当てる。 。ORGディレクティブと同じように扱われます。したがって、。=。+4'は`発言として同じ表現`です。スペース4 '。


次の命令、或いはデータ等のアドレスを設定するのに使われます。
. = _start + 3
. = _start + 4
と続けて使う場合、前の ". = _start + 3" は無駄なだけです。

以上の他にも日本語のマニュアルがある筈なのでサーチしてみてください。

先ずアセンブラマニュアルの中に説明がある筈ですので調べて下さい。

"gas アセンブラ マニュアル" としてサーチ ==>
"gnu アセンブラ マニュアル"
==>
GASリンク集 - プログラミング言語リンク集
http://asm.sourceforge.net/
.....
http://sourceware.org/binutils/docs-2.23.1/as/Dot.html#Dot
5.4 The Special Dot Symbol

The special symbol `.' refers to the current address that as is assembling into. Thus, the expression `melvin: .long .' defines melvin to contain its own address. Assig...続きを読む


人気Q&Aランキング

おすすめ情報