• ベストアンサー

GNUSim8085のアセンブラについて

現在、GNUSim8085というフリーソフトを使って、アセンブラを勉強したいと考えています。 例えば、8000h番地からSRAM領域があったとして、アセンブラで8000hから+1h番地ごとに01h,02h,03h・・・というようにデータを書くようにして行くには、どのようにすれば良いかアセンブラプログラムをおしえていただけないでしょうか? どうぞ、よろしくお願い致します。

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

  • ベストアンサー
  • umamimi
  • ベストアンサー率39% (144/362)
回答No.1

そのアセンブラのニーモニックを知らないので オリジナルのですがこんな具合 LXI H,8000H MVI C,0 LOOP: MOV M,C INX H INR C JMP LOOP 尚、「どこまで」などの判断は一切してません。

diy_sunny
質問者

お礼

回答頂きありがとうございます!! GNUSim8085でやってみたら、その通り動きました!助かります。

関連するQ&A

  • 8085のアセンブラの解説

    現在、OKI電気のCPUで8085のアセンブラのニーモニックに関して勉強しているのですが、これを解説しているようなサイトをご存じの方いらっしゃいませんでしょうか? どうぞ、ご教授の程よろしくお願い致します。

  • あるメモリ番地からあるメモリ番地へそっくりコピーする方法

    現在、動作確認を行っている基板があるのですが、経験が少なく、いろいろとわかる方に聞く日々が続いています。いろいろと教わった結果、メモリ領域の操作方法や、どのようにメモリ領域を使っているのかを把握することがとても重要と考えて来るようになりました。そこで、テストボードで、CPUにつながったメモリの番地を聞いてみたところ、開発で使用している”memmap.h”というファイルがあると教わりました。それを閲覧してみると次のようにかかれていました。 #include "comm.h" #include "event.h" #include "ethernet/dhcp.h" /* FALSE Memory Map */ #define FLASH_BASE 0x200000 #define FLASH_FONT_ADDR FLASH_BASE #define FLASH_AUDIO_ADDR FLASH_BASE + 0x0B0000 #define FLASH_NUMBER_ADDR FLASH_BASE + 0x1F0000 #define FLASH_ENV_ADDR FLASH_BASE + 0x1F8000 /* SRAM Memory Map */ #define SRAM_BASE 0x400000 #define SARM_TCP_PVC_BUF (BYTE *)(SRAM_BASE + 0x008000) //8 #define SRAM_NUMBER_BUF (BYTE *)(SRAM_BASE + 0x010000) //8 #define SRAM_ENV_BUF (BYTE *)(SRAM_BASE + 0x018000) //8 #define SRAM_FLASH_BUF (BYTE *)(SRAM_BASE + 0x020000) //8 #define SRAM_NET_BUF (BYTE *)(SRAM_BASE + 0x030000) //1 #define SRAM_AUDIO_BUF (BYTE *)(SRAM_BASE + 0x040000) //2 #define SRAM_MISC_USE (BYTE *)(SRAM_BASE + 0x060000) //8 #define SRAM_STACK_BUF (BYTE *)(SRAM_BASE + 0x069000) //8 #define SRAM_JURNEL_BUF (BYTE *)(SRAM_BASE + 0x070000) #define SRAM_JURNEL_BUF2 (BYTE *)(SRAM_BASE + 0x078000) それで、0x400000番地からのSRAMは常に基板の電源を切っても電池で守られているためデータは消えないのですが、ここにパスワード関連の410000番地からのSRAM_NUMBER_BUFでいったんデータを登録したら、FLASH領域のSRAM_NUMBER_BUF(3F0000番地から)に丸ごとコピーしているそうなのですが、そのように丸ごとコピーできるC言語の関数は内でしょうか?また、丸ごとコピーできるような簡単な書き方はないでしょうか?

  • printfで0x600000番地の次の0x600001番地の値を出力したい。

    H8マイコンの0x600000番地につながるSRAMメモリの内容を見たくて、 #define SRAM_BASE_ADDR 0x600000 #define SRAM_TEST_ADDR *((volatile u8 *)SRAM_BASE_ADDR) printf("data:%X addr:%p\n\r", SRAM_TEST_ADDR,(void*)&SRAM_TEST_ADDR); このような形でアドレス0x600000番地のデータをprintf関数で出力してUARTで確認していたのですが、次の0x600001番地のデータをみたい場合はprintf関数をどのように書いたらよいのでしょうか?

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。

  • アセンブラでの記述について教えてください。

    アセンブラでの記述について教えてください。 CMDでのアセンブリで、 mov dx , [0200] (0200へは'ab'を代入しておく) mov [0400] , dx とすれば0400番地へabが複写されるのですが、これをmasmで mov dx , data1 mov data2 , dx data1 db 'ab' data2 db '00' とすれば「invalid instruction operands」というエラーが生じます。 dataのアドレス値を他に格納してから複写すると上手くいくのですが、お聞きしたいのは上記の違いです。 [0200]はmasmだと data1 また、 [0400]はmasmだと data2  実際のアドレス値は当然違いますが、これは理屈的に同じとならないのでしょうか? なぜmasmの場合だと、 mov si , offset data1 mov di , offset data2 mov al , [si] mov [di] , al などのように、わざわざアドレス値を用いて遠まわしにしなければならないのでしょうか? どなたかご教授のほどをお願いします。

  • 65816アセンブラでの質問

    現在65816アセンブラを独学で勉強しています。 そこで皆様にお聞きしたいのですが… 例えば AD E0 11 LDA で11E0の値を読み込んで その値が260以上だった場合「Xにジャンプ」、 260以下だった場合「Yにジャンプ」 という命令はどのようにしたら宜しいですか?

  • ワンボードマイコンMP-Z80を用いたプログラミング

    今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。

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

  • 秋月電子H8/3069Fのアセンブラでのプログラミング

    H8マイコンの3069Fでパケット送信するプログラムをアセンブラでプログラムしたいと考えてます。 プロトコルはまずはUDPを考えてます。 常に一定のデータ(1500バイト)を送信し続ける単純なプログラムを作ろうと思ってますが、 よく分かりませんでした。 C言語での作成は問題ありませんでした。 H8/OSを入れてudp_sockを使用するだけで済みました。 私なりのイメージとしては イーサヘッダ・IPヘッダ作成して データを送信バッファに書き込み、 後は無限ループで送信 という流れかと思うのですが、アセンブラに関する知識が、レジスタやアドレス等を含めて乏しいためいまいち書き方がわかりません。 ソース等を解説して頂ければ幸いです。 はてなでも質問させて頂いてますがなるべく多くの人に見て頂きたいのでこちらにも質問致しました。

  • HEW統合開発環境のリンカー設定で”BHEAPMEM”という設定の意味は?

    今、H8S2368用のHEWで動かしていたサンプルプログラムをもらって、動かそうと思っていたときに、このマイコンには、FlashメモリとSRAMメモリが外部についていたので、どのようにアクセスしているのかなと思い調べていたのですが、 リンカーの設定でこの部分をどうやって使用しているのかというのがわかるということを教えてもらいました。 ちなみにFLASHメモリはサイプレス社の”CY62148EV30LL-45ZSX1TSOPII(32P3Y-H)” SRAMはSPANSION社製の”S29GL032N(03,04)”というのがつながっていて、 0x200000~0x40000 これがFLAHSHメモリの領域 0x600000~0x800000 これがSRAMメモリの領域となっています。 このリンカーの設定で0x600000のセクションに”BHEAPMEM”という設定をしているのですが、これはどういう意味の設定になるのでしょうか。 この”BHEAPMEM”という設定をすれば、ローカル変数や、グローバル変数や、バリアブルの変数などはFlashメモリ領域ではなく、0x600000のSRAM領域に自動的にコンパイラはデータを置くようになってくれるのでしょうか?

専門家に質問してみよう