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 回答