0

CodeWarrior でアセンブリ コード プロジェクトをセットアップするときに、「絶対アセンブリ」と「再配置可能なアセンブラ」の選択肢があると言われました。コードをアセンブルして正しくステップスルーしようとしているだけなので、現時点ではHCS12マイクロコントローラを使用していません。「再配置可能」を選択したのは、コードが読みやすくなり、セクションに分割されると信じているためです。ただし、変数と配列を適切に設定する方法を理解するのに苦労しています。

変数には RAM 内のアドレスがあることを知っています。したがって、このアドレスを定義する必要があると思います。また、変数の大きさ、つまり 1 バイトか 2 バイトかなどを定義する必要があるとも言われました。

同じことが配列にも当てはまると思います。そのため、場所とサイズを定義する必要があります。また、配列に値を入力する必要があります。

以下のコードをアセンブルすると、R1 と R2 に設定した場所にメモリがないことがわかります。EQU ディレクティブを使用してプログラミングを開始したため、フォローしません。

いつ DC を使用するのかわかりません。またはDS。そして、それがEQUを使用することとどのように異なるか。それはすべて同じように見えますが、変数と配列の設定方法について一般的に混乱しています。

    ;************************PROGRAM HEADER******************
;   PROJECT NAME:
;   FILE NAME:
;   DEVELOPER:      
;   DATE CREATED:
;   PROGRAM PURPOSE:
;   REVISIONS:
;********************************************************


;************************GLOBAL SYMBOLS******************
;   External Symbol Definitions
;   Internal Symbol Definitions
              XDEF      Entry, main
;********************************************************


;************************EQUATES (EQU)*******************
R1            EQU           $1000
R2            EQU           $1100
;********************************************************


;************************CODE SECTION********************
;   Section Start
MyCode:     SECTION
Entry:
main:
;   Initialize Stack Pointer
                LDS         #$2000
;   Initialize all I/O Devices
;   Initialize Variable Data
                    CLRA
                    CLRB
                LDAA        #4
                STAA        R1
                STAB        R2
                LDX         #List1
;   Start of Main Code
back                LDAA        R2        ;This is suppose to add up each
                ADDB        0, X      ;element in my array "List1". If
                INX                           ;there is a carry it branches out
                BCS         CARRY     ;to the carry loop, performs the 
                LDAA                R1        ;carry operation and returns to
                DECA                          ;original start of first loop. My
                STAA                R1        ;variable R1 is the counter which
                BNE         back      ;is the size of my array "List1".

CARRY                   INCA
                STAA        R2
                LDAA        R1
                DECA
                STAA        R1
                BNE         back

                LDAA        R2
;************************END OF CODE*********************


;************************SUBROUTINES & FUNCTIONS*********
;********************************************************


;************************CONSTANT DATA SECTION (ROM)*****
;   Section Start
;   Data Definitions
;********************************************************


;************************VARIABLE DATA SECTION (RAM)*****
;   Section Start
MyData:     SECTION
;   Variable Data Storage Allocation
List1:      DC.B     $FF, $01, $FE, $02
;********************************************************
4

1 に答える 1

0

私はあなたが使用しているアセンブラに詳しくありませんが、EQU は単純にシンボルに値を代入します。アセンブラでは、DCまたはDSラベルがストレージ領域の開始として定義されているストレージを定義するように見えます。

DC.Bバイトを割り当てているように見えるので、R1 を値 $1000 を含むメモリ ロケーションとして定義する場合は、

R1:  DC.W $1000
R2:  DC.W $1100

の後に入力List1:すると、指定された値を含む WORD またはストレージを論理的に予約する必要があります。当然、EQU定義を削除する必要があります。削除しないと、アセンブラが二重定義に反対します。

于 2013-11-21T22:23:31.683 に答える