Нужно руководство по правильной настройке переменных и массивов в моем файле исходного кода сборки

Мне сказали, что при настройке моего проекта кода сборки в CodeWarrior есть варианты "Абсолютная сборка" и "Перемещаемый ассемблер". В данный момент я не использую микроконтроллер HCS12, так как я просто пытаюсь заставить мой код собраться и правильно пройти. Я выбрал "Relocatable", потому что я считаю, что он делает мой код более читабельным и разбивает его на разделы. Тем не менее, мне трудно понять, как мне нужно правильно настроить переменные и массивы.

Я знаю, что переменная имеет адрес в оперативной памяти. Поэтому я думаю, что мне нужно будет определить этот адрес. Мне также сказали, что мне нужно определить, насколько велика переменная, другими словами, если она 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
;********************************************************

1 ответ

Я не знаком с используемым вами ассемблером, но EQU просто присваивает значение символу. В вашем ассемблере DC или же DS появится для определения хранилища, где метка определяется как начало области хранения.

DC.B будет присваивать байты, поэтому, если вы хотите, чтобы R1 определялась как ячейка памяти, содержащая значение $1000, я ожидаю, что

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

вошел после List1: должен логически зарезервировать СЛОВО или хранилище, содержащее назначенные значения. Естественно, вам нужно удалить ваш EQU определение, иначе ассемблер будет возражать против двойного определения.

Другие вопросы по тегам