CASLとCASL2の違いについて

このQ&Aのポイント
  • CASLとCASL2の違いについて説明します。
  • CASL2ではスタックポインタがGR4から独立しているため、コンパイラを作る際に工夫が必要になります。
  • 具体的になぜ工夫が必要なのか、そしてどのような工夫が必要なのかを教えてください。
回答を見る
  • ベストアンサー

CASLとCASL2の違いについて

はじめまして。情報科学を勉強している大学生です。 お時間ございましたら、回答のほどよろしくお願いします。 現在、Pascal→CASL2のコンパイラの作成という課題に取り組んでいます。 意味解析まで終わって、アセンブラ言語に変換するとこまで来たのですが、先生の言っていた言葉の意味がよくわからず困っています。 「CASL2はCASLと違って、スタックポインタがGR4から独立したから、(コンパイラを作る際に)ちょっとした工夫が必要になる」 といった感じのことを言っていたのですが、具体的になぜ工夫が必要なのかわかりません。 理解している友達にも聞いたんですが、いまいちわかりませんでした。 webでもいろいろ調べたんですが、説明しているサイトが見つからず八方塞の状況です。 そこで、 「具体的になぜ、どのような工夫がいるのか」 を教えていただきたく思います。参考になるページを紹介していただけるだけでも結構です。 それでは、よろしくお願いします。

  • felon
  • お礼率52% (12/23)

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

> CASLでは、スタックトップ以外も参照・書換えできたのに、CASL2ではスタックトップだけしか > 参照・書換えできない(SPを書き換えられない)。 > という認識で間違ってないでしょうか? まー、そういう感じですが厳密に言うとCASL2でもスタックトップにも直接アクセスできません。 > 「スタックポインター及びスタックポインタの中身の参照・書き換えを間接的に行う方法」について > もう少し詳しく教えていただきたいです。 根本的に必要なのはスタックの状態を変えないでスタックの中身にアクセスする方法です。 これをやるにはダミーでPOPをやってアクセスしPUSHで元に戻すしかないでしょうね。

felon
質問者

お礼

何度も回答していただきありがとうございます。 おかげで、先生の言おうとしていたことがつかめたような気がします。 本当にありがとうございました。

その他の回答 (1)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

CASL→CASL2の変化というよりはその元になるCOMETという仮想計算機(ハード)の仕様が変わったのです。 本当の所は世の中の計算機の仕様動向に少し近付けたのですが。 一番大きく変わったと思われるのがSP(スタックポインター)です。 従来は汎用レジスターGRの中のGR4をSPとして使っていました。 従って、命令語でスタックポインターを参照・書き換えできました。 またGR4で修飾してスタックの中身の参照・書き換えも出来たのです。 これらはプログラミングテクニック上便利だったのですが 1.仕様として未完成 2.ミスで暴走しやすい などがあり、改善されたと思われます。 結論として、スタックポインター及びスタックポインタの中身の参照・書き換えを間接的に行う方法を編み出す と言うのがちょっとした工夫でしょう。

felon
質問者

お礼

回答ありがとうございます。 >従来は汎用レジスターGRの中のGR4をSPとして使っていました。 >従って、命令語でスタックポインターを参照・書き換えできました。 >またGR4で修飾してスタックの中身の参照・書き換えも出来たのです。 つまり、CASLでは、スタックトップ以外も参照・書換えできたのに、CASL2ではスタックトップだけしか参照・書換えできない(SPを書き換えられない)。 という認識で間違ってないでしょうか? それから、「スタックポインター及びスタックポインタの中身の参照・書き換えを間接的に行う方法」についてもう少し詳しく教えていただきたいです。 お時間ございましたら、よろしくお願いします。

関連するQ&A

  • スタックポインタをC言語で記述する方法は?

     スタック・ポインタの設定はアセンブラで記述してリンクしていますが、C言語で記述する一般的な方法は有りますか。  ルネサスのHEWだと出来るようですが、コンパイラ依存性が有るようです。  コンパイラに依存しないか、たいていのコンパイラなら出来る方法は有りますか。  宜しくお願いします。  

  • アセンブルの問題について

    情報に関しては、素人であり人が書いたプログラムをいまだにまともに読むこともできないレベルなのでご教授ください。 基本情報技術者試験の午後のアセンブラの問題に関して質問があります。 平成20年の秋の問13です。 http://情報処理試験.jp/FE20b-pm/t13.html このページにあるので、問題はこちらを参照されてください。 質問としましては、3点あります。 (1)出力バッファとはそもそも何のことなのか。 問題の中では、GR3の空白記号を使うことにより3つの空白を作り初期化?というものをしています。このプログラムの中ではどのような役割をしているのでしょうか。"はい"と答えた人のカウントをするならばカウンタ領域が役割を担っているような気がします。 (2) "ポインタ""ポインタの更新"の意味が知りたい 出力バッファのポインタや出力バッファのポインタの更新などという言葉が途中で出てくるのですが、いまいち意味がわかりません。概念をご教授ください。 (3)37行目から39行目までの命令の意味がわかりません。 37 LD GR5,GR5 38 JZE FIN 39 LD GR0,='*' 36行目から51行目まで全く意味がわからないのですがこの3行がわかれば全てわかると思い質問させていただきました。 よろしくお願いいたします。

  • 汎用レジスタのワーキングビットテスト

    アセンブラ初心者です。 汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。 汎用レジスタR0からR15をワーキングビットテストする場合、レジスタデータを一旦どこかに保存してから行うものなのでしょうか? また、R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタが格納されていますがこれらのレジスタも値を一旦どこかに退避しておけばテストを行ってもよいものなのでしょうか?

  • アセンブラの読み方

    お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。

  • アセンブラのCAP-X COMP-X

    アセンブラのCAP-X COMP-X  いつも回答いただきありがとうございます。 アセンブラのCAP-X COMP-Xと言っても、知っている人は、少ないのでは無いでしょうか?  アセンブラのプログラムを組む機会自体が、減少していると思えるのです。  私が、最初に情報処理試験で触れたのは、このアセンブラと仮想のコンピュータでした。いつか、征服したいテーマでした。  でも、今でも、アセンブラと仮想機械では、もっとも、シンプルで、アセンブラの言語と原理を知るには、もっともふさわしいのでは、無いかと考えているのです。  その後も、アセンブラと仮想の機械は、進展しましたが、知らない者には、いよいよ理解しがたく、近づくことが、できないので、この CAP-X COMP-Xを  まず、理解したいと考えているのです。、  アセンブラを理解できる人には、なじみの無いアセンブラと仮想機械と思いますが、現在知っているアセンブラから、類推して回答していただけるとありがたいです。  今は、Windowsの時代になってCAP-X COMP-Xをシュミレーションできるソフトも無くなりました。頭の中で仮想するばかりです。  一語16ビットの計算機であって、0を含めて256の整数倍の番地から始まる連続した256語を1記録ブロックとして、最少1記憶ブロックから最大256記憶ブロックを実装することができる。N個の記憶ブロックを使用するとき、アクセスできるアドレスは、 0番地から(256*N-1)番地までである。  Nが、256の時、 256*256-1=65536 となって65Kのアドレス空間を持つことになる。 ●Q01. このメモリーの中で、コードとテータの両者を使っていると解釈してもよいのだろうか? ●Q02. もし、メモリーのアドレス空間をコードとデータの両者を混合して使用していると誤ってプログラムしてしまうとコードをデータとして読み込んだり、コードのアドレスに誤って、データを書いてしまい、これが、原因で、コンピューターが、暴走したりする危険性は、あるのでしょうか? ●Q03. この仮想の機械には、OSのような領域は、存在しないのでしょうか? ●Q04. 必要ないのでしょうか?  OSが、必要であるのなら、65Kの全ての領域は、使用できなくなると考えることができるのでしょうか? ●Q05. アセンブラの記号を作って、実行するようにしています。しかし、アセンブラを機械語にアセンブルして、メモリーにロードする必要があるように感じますが、この機械では、 アセンブラを機械語に翻訳するソフトは、どのようにして利用されるのでしょうか? ●Q06. 最初にアセンブラ言語を機械語に変換するアセンブリ言語をメモリーにロードしてから、アセンブラを機械語に変換して、メモリーにロードして、アセンブリ言語をクリアして使用するということになるのでしょうか? ●Q07. これなら、機械語とデータ領域の合計として65Kを使えるということになるのでしょうか?  16ビットの命令語のうちアドレスを指定できるのは、 ADフィールドの アドレスの下位8ビットを指定することになります。  これでは、256通りしか表現できません。  上位8ビットは、 BR(基底レジスターbase register)で定められる。  つまり、BRを変更しないと256通りのアドレスを超えてのアドレスを指定できなくなる。  このBRを変更するのに、 JSR命令(jump to subroutine)が使用される。subroutineに飛ぶのと、記憶ブロックを超えるのとどうして、同じ命令で行われるのか分かりません。 ●Q08. どうしてでしょうか?  昔、ユニバック、マシーンというのがありました。  36ビット、1ワードの機械でした。36ビットの中に命令部分とアドレス部分16ビットの両方を納めなければならないので、アドレス空間には、限度がありました。  16ビットだと限度のアドレス空間は、65Kワードということになります。  これ以上に大きな空間は、アクセスできない。  バイトマシーンのように最初の命令語によって、何バイトでも、アキュームレーターに収納できて大きなアドレス空間にアクセスできるようになっていなかったのです。  大きな容量のプログラムを作るとき、65Kワードでは、収納できない。それで、使用したのは、オーバーレイという手法でした。  プログラムをセグメントに切って、必要に応じて順にプログラムをメモリーに載せ替えるという方法です。しかし、セグメントが大きくなるとこれでは、収まることができないので限度がありました。 ●Q09. オーバレイのやり方は、記憶ブロックのやり方と同様と考えて良いのでしょうか?  初期的な質問で申訳ありません。  また、質問が続くようなことがありましてもよろしく教授方お願いします。 ーーーーーーーーーー CAP-X Computer Application X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 COMP-X の仕様[編集] COMP-X はデータワード長が16ビット、メモリアドレス長も16ビットのコンピュータである。アドレスはバイト単位ではなくワード単位に付与される。ワード中のビットの番号付けは、最上位ビットを 0 番、最下位ビットを 15 番とする。バイト単位の処理という概念がないため、エンディアンも規定されていない。また、COMP-X には入出力の概念が規定されておらず、何らかの手段でメモリ上にプログラムとデータを格納し、実行し、その結果はメモリを読み取ることでわかるようになっている。従って、入出力命令は存在しない。扱う数は整数のみで、2の補数表現を採用している。 レジスタは次の通り。 ーーーーーーーー COMP-X Compuer X https://ja.wikipedia.org/wiki/CAP-X CAP-X とは、かつて情報処理技術者試験でのプログラミング能力試験のために使用されていたアセンブリ言語である。後継のCASLに置き換えられ、現在はCASL IIが使われている。 命令語は全て 1 ワードであり、先頭から順に OP フィールド(4ビット)、GR フィールド(2ビット)、XR フィールド(2ビット)、AD フィールド(8ビット)で構成される。OP フィールドは命令の種類を表すコード(オペコード)であり、COMP-X には 12 種類の命令しかない。GR フィールドでは演算で使用する GR の番号が指定される。また、JC命令では分岐条件の指定に使われる。XR フィールドではアドレス修飾を行う GR の番号が指定され、内容が 0 の場合は GR0 を意味するのではなく、GR によるアドレス修飾をしない。AD フィールドはアドレスの下位8ビットを指定する。 実効アドレスとは命令で使用するメモリアドレスであり、上位8ビットは BR で、下位8ビットは AD フィールドで指定される。XR フィールドが 0 以外の場合、指定された GR の下位8ビットと AD フィールドの値を加算し、結果の下位8ビットを実効アドレスの下位8ビットとする。

  • 統計学に関する質問です。

    統計学に関する質問です。 1.統計書で「正規分布する母集団から独立に得たX1、X2、…Xn」という記載がありますが、ここでの「独立に得た」は具体的にどういう意味でしょうか? 2.『Q&Aで知る統計データ解析』という本に「測定値の独立性」に関する記載があり、「同じ被験者の反応が同一条件下で反復して測定される」場合、「観測値は独立とはいえない」といった解説がありました。この「観測値の独立性」とは具体的にどういう意味でしょうか?単一事例からベースラインをとり、その後介入期を設けて、それぞれから得た観測値を検定にかけることは統計誤用でしょうか? 以上、宜しくお願い致します。

  • コーディングが悪いというのは?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1590132 のNo5の方のおっしゃっている意味が良く分からなくて質問します。 VB任せの変換になるので、コーディング的にはあまり良くありません。 というのは、コンパイラ(VBもコンパイラと言うのでしょうか?)に任せたプログラムはやめたほうがいいぞ と受け取りました。 実際、C言語だろうがVBだろうがコンパイルする場合にはコードがどのようにアセンブラに変換され、機械語に変換されたかしっかり確かめる必要のある人(技術がある人)は最初からアセンブラで書いたほうがいい様に思います。 その手間が嫌なのでVBを使っている人がformatとvalを使い分ける明確な理由がイマイチ良く分かりません。 実行速度の問題なのならCを使えば良いだろうし、何がそこまで違うのかも理解できません。 (宣言せずに使用するよりは)int long stringをしっかり分けて使うのがいいぞ というのと、valを使うのは良くないぞ と言うのはまったく違う意味ですよね? aをintegerで宣言してa=val(b)等と書けば自然とintegerになるのではないのですか? 結局、val()とformat()をきっちり使い分けるためにはそれぞれの関数のプログラムを理解する必要があると思うのですが、それぞれ関数の内容は公開されているのでしょうか?(簡単に調べられるのは使用方法ぐらいのような気もするのですが。)

  • MS-DOSのイニシャルプログラムローダについて

    MS-DOS(Ver7.1)のイニシャルプログラムローダを解析すると、 BIOSから制御が移された直後に 割り込み1EHの設定を変更しているくだりがあるのですが、 これは一体何をやっているのでしょうか? 以下に詳細を書きます。 ・0000:0078からの4バイト(すなわちINT 1Eに対する割り込みベクタテーブル)を スタックに保存し、新たに0000:0522というポインタを設定する。 ・旧ジャンプ先の先頭から11バイトを新ジャンプ先にコピーする。 5バイト目(0000:0526)にディスクのトラックあたりのセクタ数を上書きし、 10バイト目(0000:052B)に即値0FHを格納する。 最終的には下のようなバイト列になる。 DF 02 25 02 12 1B FF 54 F6 0F 08 (トラックあたり18(=12H)セクタの場合) これをディスアセンブルしても意味のある命令列にならない。 ・この後、IO.SYSの探索に入る。スタックに積まれた旧ポインタは エラーメッセージのあとのキー入力待ちを経て復元される。 御存知の方がいらっしゃいましたら教えてください。

  • ポインタと多次元配列についての質問です

    私の使っている本に、 『ポインタを使って多次元配列にアクセスするには、コンパイラが自動で行っていることを手作業で 行わなければなりません。たとえば、次の配列には各列に5つの要素があります。 float balance[10][5]; したがって、ポインタを使ってbalance[3][1]にアクセスするには、次のようなコードを使用 しなければなりません。 float *p; p = (float *) balance; *(p + (3*5) +1) 目的の要素に到達するには、行番号に行の要素数を掛けてから、その要素の行内での番号を 加えなければなりません。上記の例では、balanceをfloat* にキャストする必要がありました。 配列要素を手作業で指定する都合上、ポインタ演算をfloatポインタに基づいて行わなければなりません。 しかし、balanceによって生成されるポインタの型はfloatの2次元配列です。そこでキャストが 必要になるわけです。』 とあります。 【質問1】なぜ、p = (float *) balance; なのか。p = (float) *balance; ではないのか? 【質問2】本文「上記の例では………必要になるわけです。」の意味がわかりません。 未熟者の私ですがどうか教えてください。

  • Σの計算についてと確率の独立性について

    最近,統計の勉強をしていて,混乱してわけがわからなくなっているので, 確認の意味も含め質問させてください. 1. いま,データx={x1,x2,...,xn}の各xに対する確率変数をXiとする. このとき,    Σ[1/p(Xi)]    from i=1 to n は、    Σ[1/p(Xi)] = n   ・・・ @ となる?みたいなのですが,なぜなのでしょうか? たとえば,n=2で,p(X1)=1/2,p(X2)=1/2としたら,  Σ[1/p(Xi)]={1/p(X1)} + {1/p(X2)}        = 2 + 2        = 4 となりますが,@では,いま,n=2なのでΣ[1/p(Xi)]=2であり,4≠2となり @のようになるとはいえないのではないかと混乱しています。おそらく@は,  Σ[1/p(Xi)]=(Σ1)/(Σp(Xi))= n と変形しているのだと思いますが,自分の例から@のように変形できる訳が分かりません。 もしかしたら,自分の例がおかしいのかもしれませんが・・・。 2. 統計学でよく,「データはi.i.dである」という仮定をおいて解析が行われています。 データが独立で同じ確率分布に従うときをi.i.d と呼ぶと記憶しているのですが, 「独立である」という項目は,なぜ条件として必要なのでしょうか? 独立というと,私は,P(x1,x2)=P(x1)*P(x2) とできるということしか知らないので, データの独立性がないと計算が大変になるだろうという風にしかみれないのですが, データをばらばらに取り出す(独立?)場合と一度にまとめて取り出す(独立でない?)場合が解析に何の影響を及ぼすのでしょうか? 式は覚えていてもそれ自体が何の意味をもつのかがまったく分かっていないので、意味合いを教えていただきたいです。 回答よろしくお願いします。

専門家に質問してみよう