• ベストアンサー

アセンブラの配列処理

C言語の配列処理は下記のように簡単に出来ますが、 アセンブラ(Z80)で同じような事が出来るのでしょうか? int Data(2) Data(0)=10 Data(1)=20 Data(2)=30

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

  • ベストアンサー
  • acombun
  • ベストアンサー率16% (16/99)
回答No.3

(2)です。 (1)さんのお礼のところの記述ですが、Z80では ADD DATA,4 のような記述はできないでしょう。 下記のような記述になると思います。 LD DATA,10 LD DATA+4,20 LD DATA+8,30 又は LD (DATA),10 LD (DATA+4),20 LD (DATA+8),30

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

簡単でなくてもよければできます. どこまでのことをしたいのかによりますが, Z80 ではメモリに対するアクセスがかなり厳しくって ・16ビットデータだと LD (nnnn), rr ・8ビットデータだと LD (BC), A LD (DE), A LD (nnnn), A LD (HL), r LD (HL), n LD (IX+d), r LD (IX+d), n (とその逆. nnnn は 16ビット即値アドレス, rr は 16ビットレジスタペアで BC/DE/HL/SP/IX/IY のいずれか, r は 8ビットレジスタ, n と d は 8ビット即値) しか使えません. なので, 例えば Data[1] = 20; は (int = 16ビットと仮定すると) LD HL, Data LD DE, 2 ADD HL, DE LD (HL), 20 INC HL LD (HL), 0 となります.IX を使えばもうちょっと簡単に LD IX, Data LD (IX+2), 20 LD (IX+3), 0 と書けます. とにかく「レジスタ間接アドレッシングのときに, オフセットとしてレジスタを指定できない」のが痛過ぎ.

poohpiglet2
質問者

お礼

お礼が遅くなって申し訳ありませんでした。 詳しく説明していただきありがとうございました。

回答No.4

データー8bitと仮定します。 データーセグメントで DATA: DS  3  ;3バイト確保します データをAに、インデックスをHLにセットして下記をコールします。 DIRSET:     LD   DE,DATA     ADD   HL,DE     LD   (HL),A     RET DEも引数にすれば汎用的になります。

poohpiglet2
質問者

お礼

お礼が遅くなって申し訳ありませんでした。 理解することが出来ました。 ありがとうございました。

  • acombun
  • ベストアンサー率16% (16/99)
回答No.2

できますよ。 直接アドレスを参照する方法やインデックスレジスタの利用もできます。 ただ、データの型による長さの調整は自分で行う必要があります。 int型を2バイトとした場合、CではData[0],Data[1]で良いですが、アセンブラではData,Data+2になります。

poohpiglet2
質問者

お礼

ご回答ありがとうございます。 No1の回答者様にも同様の質問をさせていただいたのですが、サンプルもしくは参考URL等教えていただけると幸いです。よろしくお願いします。

回答No.1

アセンブラには配列という概念がないので、 DATA番地に10、 DATA+4番地に20、 DATA+8番地に30 をそれぞれ格納するという考え方になると思います。

poohpiglet2
質問者

お礼

ご回答ありがとうございます。 下記のような方法でよろしいのでしょうか? サンプルもしくは参考URL等教えていただけると幸いです。よろしくお願いします。 LD DATA,10 ADD DATA,4 LD DATA,20 ADD DATA,4 LD DATA,30

関連するQ&A

  • 現在、アセンブラは使われていますか?

    タイトル通りなのですが、現在、アセンブラは使われていますか? 組み込み屋さんなどでは使われているような気がしますが・・・ 使われているとしたら、どんな風に使われているのでしょう? 学校で習うZ80みたいな感じなのですか? それともC言語みたいな高級言語でやっているのでしょうか?

  • 配列のポインタについて

    C言語で処理が下記のような処理を作成したいと思っております。 関数の引数によって、データを代入する配列を切り替えたいと考えております。 下記のような処理を考えた場合、if文の中・for文のbuffをどのように処理すれば よいでしょうか? アドバイスよろしくお願い致します。 int a[100][150]; int b[100][150]; void sample(int flg) { int i,j; unsigned short *buff; if(flg == 0){ buff = &a; }else{ buff = &b; } for( j=0 ; j<100 ; j++ ){ for( i=0 ; i<150 ; i++ ){ buff[y][x] = data; x++; } x = 0; y++; } }

  • アセンブラについて

    アセンブラでプログラミングを書くとき c言語だと説明文などを/* */ や // で書けると思うのですが アセンブラはどうすれば良いですか?

  • 配列のポインタ配列のポインタから元の配列を参照する方法について

    C初心者です。下記の様に配列のポインタ配列を作って、そのポインタ配列のポインタを返すコードを書いて、main関数で元の配列の値を参照したいのですが、上手く参照できずに困っています。下記のコードの問題点も含めて、配列のポインタ配列のポインタから、元の配列の値を参照する方法を教えてください。お願い致します。 short int *motion_data(void) { short int data1[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2784,2648,2648,2648,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int data2[5][7] = { {2377,2174,0,0,0,0,0}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2919,2784,2784,2784,2377}, {2377,2377,2377,2377,2377,0,0}, {2377,2377,2377,2377,2377,0,0}, }; short int *po_data[2]; po_data[0] = data1[0]; po_data[1] = data2[0]; return *po_data; }

  • アセンブラ言語がわかりません。

    初心者です。まとを得ていない質問でしたらすみません。 C言語は理解できる程度なのですが、アセンブラのコードを書く事ができません。 今アセンブラ言語を学び始めた所ですが、「jr」「jarl」「jmp」などの分岐命令の指定の方法がわかりません。 C言語でいうとどういうコードを書いた時に、このような命令を出力できますでしょうか。 本を読んでも、この上記の命令の意味は書いてあるのですが、実際出力が出来なかったもので。 またアセンブラ言語を学ぶためにいい方法などありましたらお教えく頂けないでしょうか。 よろしくお願いします。

  • 組み込みアセンブラとは何ですか?

    私はx86でアセンブラを勉強中ですが、ネットでアセンブラ関係のことを検索していて組み込みアセンブラという記述をを見ました。 C言語から利用する場合インラインアセンブラより良いとかなんとか。 組み込みアセンブラという名前も怪しく合っているかわかりません。 掲示板のようなところで組み込みアセンブラの方が良い、早いと書いてありました。いろいろ検索して見かけたのでどこの掲示板かもわかりません。後から探したのですが見つけることができませんでした。 そこで質問なのですがそのその組み込みアセンブラとは何なんでしょうか? C言語からアセンブラを利用する場合、今読んでいる本「やさしいアセンブラ入門」にはインラインアセンブラとアセブラ言語モジュール(オブジェクトファイル)をCプログラムでリンクする方法の2種類が書いてありますが。組み込みアセンブラはモジュールで使うということでしょうか? 違うとすればどのような方法でアセンブラを利用することでしょうか? わかる方教えてください。ヨロシクお願いします。

  • 関数から配列を返すには?

    return で配列を返すにはどうしたらよいのでしょうか。 例えば以下のような場合です。 int main (){ char Value[] = "999"; int a;  a = test(Value);  printf ("%d", a);   } int test(char *Value) { int nVal[255]; ここで nVal に適当な処理をして・・・  return Value; }  int a を配列とかにしてみましたけど、コンパイラが 通りません。 要は配列数値を main で受け取って表示したいのですが、 本日C言語はじめたところなので、教えていただければありががたいです。

  • アセンブラ言語についてです。

    こんにちは。 現在大学3回生で就職活動をしております。 ESに得意科目の欄があり、大学の講義で習ったアセンブラ言語と書こうと思います。 アセンブラ言語は、将来どのような役に立つのでしょうか?? アセンブラ言語を学んでCやJAVAのプログラミングに生かせるのでしょうか?? 知識としては、基本情報技術者のCASLIIの問題が解ける程度です。 よろしく願いします。

  • 3次元配列から2次元配列に

    3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

  • C#で配列の値をチェックするメソッドを書きたい

    C#の配列についてお教え頂けませんでしょうか? CSVファイルから1行読取り、配列に格納しています。 string[] rowdata; string x; int y; double z; TextFieldParser Parser = new TextFieldParser(FILEPATH, Encoding.GetEncoding("shift_jis")); while (!Parser.EndOfData) { //1行読取り rowdata = csvParser.ReadFields(); //読み取った値を変数に x = rowdata[0]; //string y = rowdata[1]; //int z = rowdata[2]; //double } rowdata[0~3]を変数に格納する前に、データのチェックをおこないたいです。 例えば、rowdata[1]はint型変数に格納されます。しかしrowdata[1]に格納された値が「A1」とあった場合、int型変数yには格納できずエラーが起こります。 よって、rowdata[1]に数値以外の文字列があったら「0」に置き換えるなどの処理をいれたいです。 なので、配列を受け取ってデータチェックをするメソッドを作りたいと思いますが、どのように作っていいかがわかりません。 1つのメソッドでint、double、stringかどうかの、チェックを行いたいですが、そのようなことは可能なのでしょうか? 下記のように3つメソッドを作って、データをメソッドに渡しチェックを行なうのがいいのでしょうか? string CheckData(string[] arr){}; int CheckData(int[] arr){}; double CheckData(double[] arr){}; やりたい事は、 メソッド(配列を受取る) rowdata[0]が渡された場合、中身はstringかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[1]が渡された場合、中身はintかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 rowdata[2]が渡された場合、中身はdoubleかのチェック。問題なければ格納されている値を返す。問題があれば、何らかの処理。 以上のような事です。宜しくお願い致します。

専門家に質問してみよう