0
1       ORG $0020   start of RAM (data)
2   AT1 RMB 2    
3   Space   RMB 1       
4   Length  RMB 1   
5   Count   RMB 1    
6   Ptr RMB 2   
7       ORG $E000   start of ROM (program)
8   START   LDX AT1
9       STX Ptr
10      LDAA    Length
11      STAA    Count
12      LDAB    Space
13  LOOP    TST Count
14      BEQ STOP
15      LDX Ptr
16      LDAA    0,X
17      ABX 
18      STAA    0,X
19      DEC Count
20      LDX Ptr
21      INX
22      STX Ptr
23  BRA LOOP
24  STOP

1)展示一个6元素表从地址007f复制到009d的场景(可以任意输入6元素的值)。

2) 修改程序,使第 13 行的 TST 计数不再需要。(即第 14 行的 BEQ 分支指令将检查程序执行的正确状态以确定分支条件。)

3) 修改程序,使第 6 行的“Ptr RMB 2”不再使用。相反,寄存器 X 指向表 1 中的元素,而寄存器 Y 指向表 2 中的元素。

大家好,我被这个问题难住了……对于第三个问题,我的具体问题与表格有关……X 指向空间,Y 指向长度吗?我不知道指的是什么表...

对于第二个,这是否意味着我在第 23 行完全删除了 TST 行以及循环的其余部分?检查程序的“正确状态”是什么意思?

任何帮助都会非常好......谢谢。

4

1 回答 1

1

关于(2):某些指令(包括所有 LOAD 和 STORE 指令)根据操作结果修改条件代码寄存器(CCR)。因此,如果您在此类指令之后放置条件分支,则显式 TST 指令将变得多余。

关于(3):这是一个复制程序。您正在从源位置(从 $7F 开始)复制到目标位置(从 $9D 开始)。您可以将它们视为数组或表格。因此,您有一个源表和一个目标表。

这是所有修改后的可能实现:

                    org       $0020               ;start of RAM (data)

;AT1                rmb       2
;Space              rmb       1
;Length             rmb       1
;Count              rmb       1

                    org       $E000               ;start of ROM (program)

Start               ldab      #6                  ;ldaa Length (affects CCR[Z] bit)
                                                  ;staa Count (affects CCR[Z] bit)
                    beq       Done                ;(only needed if length is unknown, redundant when fixed at 6)

                    ldx       #$7F                ;ldx AT1 (X is source pointer)
                    ldy       #$9D                ;ldy AT1 (Y is destination pointer)
                                                  ;ldab Space
                                                  ;aby
Loop                ldaa      ,x                  ;load source byte
                    staa      ,y                  ;save to destination
                    inx                           ;increment source pointer
                    iny                           ;increment destination pointer
                    decb                          ;dec Count (affects CCR[Z] bit)
                    bne       Loop                ;repeat until Count reaches zero

Done                bra       *                   ;spin here forever (halt)

                    org       $FFFE
                    dw        Start

[我敢打赌,接下来你的导师会要求你把它转换成一个通用的子程序,你可以在其中传递源指针 (X)、目标指针 (Y) 和长度 (B) 作为参数。]

于 2015-02-26T19:35:50.100 回答