• ベストアンサー

PICマイコンのアセンブラについて

PICマイコンのアセンブラルーチンについて PICマイコンのアセンブラについて教えていただきたく投稿しました。 http://orange.zero.jp/electronics/pic/pic.html 上記のサイトについてです。 『●「整数演算」』の 『◇8×8=16ビットの乗算』についてです。 つまり、下記リンクの演算ルーチンについて、大まかな流れだけでいいので解説していただけないでしょうか。 http://orange.zero.jp/electronics/pic/mul816.txt よろしくお願い致します。

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

  • ベストアンサー
回答No.1

1234×4567 の計算(ただし、10進数) まず、筆算で、1234×4567 の計算をしてみてください。 乗数(4567)の下の方の桁から、ひとつずつ掛けて、しかも、その結果を、一桁ずつずらして書きますよね。 それは、実は、以下のような計算をしていることになります。 1)4567 最下位を見る → 7 2) 1234 と 7 を掛ける 1234×7 = 8638 3) この答えを保持しておく s ← 8638 4) 被乗数(1234)を、一桁左側にシフトする(つまり、10倍する)12340 5) 乗数(4567)を、一桁右にシフトする(つまり、10で割る) 456 6)新しくできた、乗数と(被乗数の最下位)を掛ける 12340×6 = 74040 7) この結果を s に足し込む s = s + 74040 = 82678 8) 4) にかえって繰り返す 以上は、10進数のお話です。 これを、2進数でやろうと思うと、 ・そもそも、数字は 0 か 1 しかない。つまり、2) とか 6) は、実際にはかけ算をする必要はなく、「何も足さない」か、「そのまま(1をかけたもの)足す」かどちらかしかない。 ・一桁のシフトは、文字通りシフトで実現できる。 ということになります。 2進数でも、筆算でかけ算をすることができますから、やってみると事情が飲み込めると思います。 おおざっぱには、こういう計算をやっています。

kuyasami
質問者

お礼

解答ありがとうございます。とても分かりやすくて助かりました。 別の質問なのですが、もしよろしければ、 http://okwave.jp/qa/q7121380.html こちらにも解答をいただけるとありがたいです。 16ビットどうしの除算なのですが、乗算の場合と同じように、筆算で考えればいいのでしょうか。

関連するQ&A

  • PICマイコンのアセンブラルーチンについて

    PICマイコンのアセンブラについて教えていただきたく投稿しました。 http://orange.zero.jp/electronics/pic/pic.html 上記のサイトについてです。 『●「整数演算」』の 『◇16÷16=16ビットの割り算(余りも得られる)』の下にある 『◇上と同じ。基本命令のみに変更したもの。』についてです。 つまり下記リンクの演算ルーチンについて、大まかな流れだけでいいので解説していただけないでしょうか。 http://orange.zero.jp/electronics/pic/div16_2.txt よろしくお願い致します。

  • PICマイコン MPLABアセンブラで小数点の累…

    PICマイコン MPLABアセンブラで小数点の累乗(べき乗) n^-0.9067の計算をMPLABのアセンブラでやりたいのですが 記述、計算方法がわかりません。 わからない点 ・四則計算だけでできるのか ・小数点を整数の変換して計算可能か ・負の値を気にせず(正の数)計算できるか 一番知りたいのは四則計算だけで計算できるかです。 これができるとある程度正確な結果が得られるので ご教授よろしくお願い致します。

  • PICマイコンの開発環境一式をできるだけ手軽に

    10年近く前ですが、秋月のAKI-PICプログラマーのキットを組み立てて、Windows98でシリアル接続して、5,6個のマイコン工作をした後、飽きてしまいました。 その後、引っ越して開発環境一式を紛失してしまいました。 しばらくPICからは離れていたのですが、最近またやりたくなってきました。机の中にPIC16F84Aの使ってない在庫が10個ぐらい転がっています。 最近、ネットの情報を見ると、PICKIT2 or 3という出来合いのライターがあるらしいのですが、これを使うための最小限で便利な環境をそろえたいのですが、アドバイスお願いします。 パソコンのOSはWindows7 64bit (無理ならWindowsXPの古いノートPCもあり)です。 知りたいのは以下の点です。不足な部分やご提案があれば教えてください。 このPICKIT2or 3を買うだけで、後はアセンブラやライターソフトは付属品またはネットからのダウンロードでそろうものなのでしょうか。(ICEなどの機能はあればいいですが必須ではありません。アセンブルして、生成した機械語をマイコンに書き込めさえすればいいです)

  • 【C言語】シフト演算による乗算

    正の整数を二つ読み込み、乗算をシフト演算によって行いたいです。 プログラムを作ったのですが、動きません・・・。強制終了されます。 (例)53×25=53×(2^4+2^3+2^0)  =(53を左に4ビットシフト)+(53を左に3ビットシフト)+(53を左に0ビットシフト) http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4803.txt どこが悪いのでしょうか・・・。

  • マイコンで選局できるラジオを自作したい

    マイコンで選局できるラジオを自作したいと思っています。 http://www4.zero.ad.jp/electronics/pllfmr/pllfmr.html これですとFMラジオは作れそうですがAMもほしいです。 最終的にはPC(Linux)とつないで音をサウンドカードに入力させ、シリアルかUSBで周波数を切り替えられるようにしたいと考えています。 このようなラジオをつくるためにはどのような回路になるでしょうか?こういった作例はありませんでしょうか? 漠然とした質問ですが、よろしくお願いいたします。

  • PICのプログラムカウンタについて

    プログラムカウンタでポートAに4bitの2進数を入力して、変換された2進数のデータをポートBに出力させることはできたのですが、 ポートCにも違うデータを同時に出力させたいのですが、どういった命令文を作ったらいいでしょうか? 例えば、ポートAが「HLHL」の入力の時にポートBでは「HLLH」、ポートCでは「LLHL」を出力させる方法です。 言語はアセンブラ、マイコンはPIC16F886です。 よろしくお願いします。

  • マイコンのインターフェイスについて

    今現在、下記のような回路の為の部品選定をしているのですが、、、 アナログ電圧入力(DC) → ADC(分解能24bit) → マイコン(H8)にて演算処理 → DAC(電流出力) ADC →(1)→ マイコン 上記(1)のインターフェイスのことについて質問させていただきます。 24ビットの高分解能ADCが実装されているマイコンが見つからなかったため 現在外付けのADCを選定しております。 それで、いくつかのADCのデーターシートを参照すると、 I2C準拠のシリアルインターフェイスが付いているものや、SPIのものやら あるのですが、それらシリアルインターフェイスがついていないADC 例えば↓ http://www.analog.com/jp/analog-to-digital-converters/ad-converters/AD9283/products/product.html などはデーターシートの出力にはTTL、CMOSコンパチと謳われておりますが こういったADCとマイコンを接続する時はマイコン側のインターフェイスは I/Oポートを使用するのでしょうか? とんちんかんなことを言っていたら申し訳無いのですが、 宜しくお願いいたします。

  • データ型 double の桁数について

    picマイコンをPICC liteと言うCコンパイラで作成しているのですが、そのPICC liteでは、データ型のdoubleは24ビットで、-3.4×10の38乗 ~ 3.4×10の38乗となっているのですが・・・この意味がさっぱりわからず何桁まで扱えるのかわかりません。 小数点以下は何桁? 整数部分は何桁? ・・・整数 小数含めて何桁まで大丈夫なのでしょうか?

  • MPLAB Ver8.10の使い方を教えてください。

    PIC初心者です。 技術者向けカテですが、どこに書いてよいのか分からないのでここに質問させてください。 今までPA.EXEというアセンブラを使ってPICマイコンのプログラムをアセンブルしていたんですが、一度MPLABを使ってみようと思いDLしました。 しかし、DLしたものを起動させてみたものの何をどうしたらよいのかさっぱり分かりません(全て英語ですし・・・)。 何をどうしたらプログラムしたASMファイルをHEXファイルにアセンブルできるのでしょうか? MPLABを起動してからアセンブル完了までの流れを出来る限り詳しくわかりやすく教えてください(出来れば専門用語も分かりやすい言葉でお願いします)。

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