• 締切済み

PDP-11のアセンブラ課題

学校の課題で出されたものです。 まだ勉強をはじめたばかりでどこから手をつけていいのかわかりません>< ○PDP-11のアセンブラは、MOV#1,R2を次のような2語の機械語に翻訳する。PDP-11は、これをど  のように解釈し、どのように実行するのか説明せよ 0001010111000010 0000000000000001 ○PDP-11のMOV命令を使用し、以下の命令のアセンブリ言語表現、機械語表現を示せ。 ・R5が示すアドレスにジャンプする命令 ・サブルーチンから戻る命令 ・R0をスタック上にプッシュする命令 ○次のプログラムをPDP-11のアセンブリ言語で作成せよ。 ・R0が示す番号以降のR2が示すバイト数をR1が示す番号以降に転送 ・R1(上位16ビット)R0(下位16ビット)が示す符号付32ビット値を符号反転 宜しくお願い致します。

みんなの回答

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

「simh」という各種レトロコンピュータのWindows用シミュレータがあるので試してみてはどうでしょうか。 英文ですがPDP-11のシミュレーションに関する詳細なドキュメント(アセンブラの解説書ではないのですが・・・)もあるので、動作確認などできると思います。 英語はわたくしも苦手ですが、専門用語なら慣れれば簡単な感じがするし(カン違い?)、エンジニアになるなら拒絶せず誤読を恐れずに挑戦してみてください。

参考URL:
http://simh.trailing-edge.com/
skureasu
質問者

お礼

こんな便利なものがあるんですね。 早速使ってみたいと思います。 ありがとうございました!

回答No.1

なかなか、回答がつかないので、ムリを承知で… 詳細なマニュアルがないので、手持ちの物とネットで調べた範囲で答えてみます。 実は手持ちの資料は、DECアセンブラではなく、UNIXアセンブラなので、それに起因する相違は、ご容赦。 最初の問題。 http://www.dgp.toronto.edu/~ajr/258/pdp11.pdf このインストラクションセットの解説により、 b15からb12までの「0001」によって、MOV命令(最上位ビットが立っていないので、ワード版)であることが判ります。 次のソースオペランド部のb11からb10により、オートインクリメントモードで、さらにb9により、(インダイレクトではない)ただの参照、次の3bitはr7を示しているので、プログラムカウンタであるr7の示す番地の内容、つまり、この命令ワードの次に書いてある、「1」をソースとしています。 残りビットは、同様にディスとネーションのレジスタモードで、2ですから、r2を表していて、結果、1という数値をr2に格納。という動作になります。 というような、事を答えれば良いのかな? 次の問題群はあんまり良く知らないので、パス。 最後の問題は、こんな感じかな? ひとつめ。 loop:   tst r2   beq exit   mov (r0)+,(r1)+   dec r2   jmp loop exit: ふたつめはパス。

参考URL:
http://www.dgp.toronto.edu/~ajr/258/pdp11.pdf
skureasu
質問者

お礼

とてもわかりやすい説明をありがとうございます。 これを参考にして、自分で理解できるように勉強していきたいと思います。 回答して頂きありがとうございました!

関連するQ&A

  • 最初のアセンブラ

    人間がハンドアセンブル際にアセンブリ言語と機械語の対応表を見比べて翻訳する作業を、コンピュータの黎明期に機械語で最初に作られたアセンブラはどのように行っていたのかということを教えて下さい。 プログラミング言語の歴史を考えてみると、(フォン・ノイマン型)コンピュータの黎明期では全てのプログラムは最初人間が直接真空管やディップスイッチのオン/オフを切り替えることで、機械語でプログラムを入力していたと思います。その後アセンブラが開発されたことで、人間はパンチカードやカセットテープなどを通してアセンブリ言語でプログラミングを行えるようになったと聞きました。 アセンブリ言語は機械語と1対1で結びついたもので、アセンブラはアセンブリ言語を機械語に翻訳するのだと言うことは分かります。しかし、パンチカードやカセットテープで入力したアセンブリ言語も、コンピュータにとっては根本的には0/1(スイッチのオン/オフ)という点では変わりはなく、最初のアセンブラはその0/1をどのようにして正しい機械語の0/1に変換することが出来たのでしょうか? 少し質問の意味が分かりにくいかもしれませんが、例えば MOV B, A //Bレジスタの内容をAレジスタに送る といったアセンブリ言語は、機械語では 01000000 に相当するかもしれません。しかしコンピュータがパンチカードを読み込んだ時点では 01010100 といった信号として入力されるとしたら、機械語で最初にアセンブラを作成した人はどのようにしてそれを適切な機械語(ここでは01000000)に翻訳出来たのでしょうか? 想像では最初に機械語で非常に超簡単なアセンブラの原型とも言えるプログラムを作って、それを元にした簡単なアセンブリ言語(の原型)でより高度なアセンブラを作る、といったことを繰り返していまのアセンブラが開発されていったと思いますが、では最初のアセンブラの原型とはメモリ上ではどのように実現されていたのか、ということが気になったので質問させていただきました。アセンブリ言語で実際にプログラムのイメージはこんな感じでは?ということを書いて下さっても構いません。 よろしくお願い致します。

  • CASL アセンブラ命令 アプリ機能

    例えば、CASLのアセンブラ命令にDCがある。 LABER DC 100 とすると。 これは、メモリに領域を確保し100をいれる命令だが、プログラムが変更されれば、メモリアドレスは変更される。 CASLには機械語命令・マクロ命令・アセンブラ命令がある。 機械語命令は人に分かりやすいようにニーモニックが付けられているだけだが、 アセンブラ命令はプログラムが変更されればそのアドレスは移動するという、ハンドアセンブリでは、できない機能が含まれている。 アセンブリ言語は色々ありますが、アセンブラ言語は人に見やすいようにニーモニックが付けられているだけでなく、CASLのDC命令のように、ハンドアセンブリではできないアドレスの自動変更のようなアプリケーションとしての機能(OS的機能)も一般にふくまれているとかんがえてよいのでしょうか? よろしく願います。

  • アセンブラの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ビットとする。

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

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

  • コンパイラーとアセンブラの違い

     今晩は。  コンパイラーとアセンブラとは何がどう違うのでしょうか。 またコンパイラー、アセンブラは、その後に更に機械語に変換されるとききましたが、なぜ一気にソースコード から機械語に変換しないのですか。  他にCalsという言語もあると聞きましたが、この言語も機械語とは違うと聞きました、とするとそもそもこの 言語自体の役割は何なんでしょう。

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • アセンブリ言語は原始プログラムですか?

    質問(1) アセンブリ言語というのは、 add $S1, $S2 みたいなやつですよね? wikipediaで「ソースコード(ソースプログラム、原始プログラム)」の注釈1,2を読むと、 注1:【機械語の命令に記述するアセンブリ言語(アセンブラ)が存在するが、このアセンブラ用の文字列で記述されたプログラムはソースコードとは呼ばれないのが普通である。】 注2:【アセンブリ言語で書かれたプログラムはソースコードと呼ばれない】 と書かれてあります。 でも、 他の教材では アセンブリ言語で書かれたプログラム(原始プログラム) と書かれています。 どっちが正しいのでしょうか? 質問(2) 目的プログラム(オブジェクトプログラム)とは、 IT用語辞典によると 【オブジェクトプログラムとは、ソースプログラム(人間が認識できるプログラム言語で高水準言語など?)をコンパイラで機械語に翻訳したプログラムのことである】 とありますが、 ソースプログラムをコンパイラで翻訳するとアセンブリ言語になるんではないのですか? そのアセンブリ言語をアセンブラで翻訳して機械語になるのではないのでしょうか? どなたかご教授ください。 お願いします。

  • アセンブラで割り算

    アセンブラ記述で割り算を実現させたいのですがよくわかりません。 下記条件でどのように実現すればよいでしょうか。 ・8ビット÷4ビット ・命令セットは  LDL, LDH, MOV, ADD, SUB, SRA, SR, SL, AND, OR, JE, JMP, CMP, LD, ST, HLT ・レジスタは16ビット ・レジスタは8個 です。 「被除数の上位4ビットと除数を比較して商を求めて、余りに被除数の次ビットを連接する」 の繰り返しでできると思っているのですが、アセンブラ表記がわかりません。 よろしくお願いします。

  • マイクロプロセッサ毎のニーモニックの違い

    アセンブリ言語レベルでの話です。 データ転送命令は、どのプロセッサでも必須の命令ですが、これにはld系とmov系があります。 この二つの違いを教えてください。 とりあえず、私が考えたのは、 1. メーカーによる違いでもなさそう。  インテルは8ビットCPUでld命令、16ビット以降でmov命令ですね。  最悪なのはATMELのAVR。同じプロセッサでldとmovがある。 2. データ転送の向きによる区別でもなさそう。  インテルは「mov dst,src」だし、日立は「mov src,dst」 の2つですが、両方とも反例がありました。

  • アセンブラwordという単位

    アセンブラでwordという単位がよく使われるそうですが、wordという単位は他でも聞いたことがあるようなきがしますがよく覚えていません。そこでは1バイト1ワードだったような気もします…。 アセンブラでは一般的に、2バイト1ワードらしいのですが、その根拠がよく分かりませんでした。 もしかしたらマシン語が1命令2バイトで表せるからかなーなどと推測したのですが、どうでしょう。 あと、4バイトの場合dwordと表現するようですが、64ビットCPUが出てきた現在、それ以上の表現もあるのかなーなどと思っています。 質問は以下です。 ・dwordより大きい単位はあるか(あればその内容) ・2バイト1ワードの根拠は何か よろしくお願いします。

専門家に質問してみよう