Нужно руководство по правильной настройке переменных и массивов в моем файле исходного кода сборки
Мне сказали, что при настройке моего проекта кода сборки в 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
определение, иначе ассемблер будет возражать против двойного определения.