2016-12-05 13 views
0

私はアセンブリを学んでおり、私は 'data_type'で定義した値を合計するプログラムを書いています。アセンブリ初心者:DCDの値の数と同じ変数を設定しますか?

Atm私は、変数 'num'を 'data_type'の値の数量に等しく設定して、ループがそれらを合計するようにしなければなりません。

私はこれを行うより良い方法があるのだろうかと思っていましたか?

または、変数 'num'を 'data_type'の値の数量を想定して動的に宣言する方法がある場合は、

ありがとうございます!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

あなたのアセンブラについてはわかりませんが、1) 'data_values'が整列されていないとどうなりますか?他のアセンブラと同じように動作する場合、 'data_values'シンボルはアライメントされていないアドレス値を持ち、' ​​DCD'は整列されたデータを定義するため、コードは間違ったバイトのデータに対してアライメントされていないアクセスを行います。私はあなたがそれらの2つを交換して、最初に整列させ、次に象徴的なラベルを定義するべきだと考えます。 2) 'BNE'の後に何が起こるのですか?あるいは、デバッガでこれを実行していますか?定義されたコードの外に出させないでください。 – Ped7g

+0

よろしくお願いします、今すぐ交換してください。 Keilツールを使用する。 私はちょうど学習の練習であるので、デバッガ内のBNEに実行しています。上記の質問をどのように達成するための推奨事項がありますか? – ohkneel

答えて

1

私はこれを行うためのより良い方法があるかどうか不思議でしたか?

意見が多すぎます。データを構造化する方法はさまざまですが、それぞれが異なる状況下であなたに合うかもしれません。私はすべての主要なものを列挙しようとする(私はいくつかを忘れると思う)。

コンパイル時間:

  • あなたはアセンブラが「doesnの場合
  • が(その後、それらの差から、あなたはバイト単位で長さを計算することができ、データの先頭にいないだけでラベルを定義するだけでなく、データの最後に何をしましたか基本的な表現をサポートしていますが、これは実行時の計算を必要とします)。
  • 多くのアセンブラはエンドラベルを定義する代わりに実際にnum equ (($ - start_label)/4)のような何かを行うことができます。$はいくつかのアセンブラでは現在のアドレスです(これはx86 TASM/MASMの例です)。
  • 要素と配列のサイズは完全に固定されています(つまり、 "15文字の文字列、各5文字の長さ" => 75バイト正確にそしてそれをサポートするようにコードが書かれています - 制限されたコーナーケース..または固定された配列が重要でない何かに焦点を当てた学習エクササイズの高速マッシュアップ)。

ランタイム:

    ような方法で
  • 書き込みコード、機能の呼び出し側は、アレイのだけではないアドレスをサポートする必要がありますが、また、それはサイズ(非常に汎用性の高いAPIのスタイルだ、あなたは、通常の任意の他の構造体を曲げることができますそのようなAPIで処理されるデータですが、値終端配列では、まずサイズを計算する必要があるため、最適ではない可能性があります) - 構造体の問題を呼び出し側に委任し、それを単独で解決しません。
  • ASCII Zのように、値が0のような終端文字として一部の値を使用します。
  • C++ std::vectorのようなデータ構造を使用します。内部データ構造には、メモリへのポインタだけでなく、ベクトルの格納サイズも格納されます(加えて、割り当てられたメモリの容量と最後の割り当てのサイズどのようなstd::vector実装をチェックしてください)、あなたの場合は、例えば、最も簡単なDCD 5, 1, 1, 1, 1, 1(最初の単語はサイズ、次にデータが続きます)に行くことができます。
  • あなたが考えることができる他のもの..実際の世界の例のいくつかは、1つのメモリバンクが1ピクセルあたり1ビットを記憶していた古いEGA 16カラーグラフィックモードの分離されたビットプレーン、4つのメモリバンクすべてを切り替えなければならない1ピクセルを描画するような、各特定のビット値に書き込む。あなたは何かを作ることができます。何ができるのでしょうか?数学的に定義してコードを書くことができます。
関連する問題