assembly 我可以用变量的值作为变量名吗?

kwvwclae  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(183)

我在想(在我的知识范围内),要加载不同长度的值(但总是以0结尾),如果我可以使用变量的值作为变量名,这将是很方便的。例如,在:
lea sc1, a2
如果我可以使用后缀sc与d0的值组合而不是sc1,我就可以轻松地滚动数据部分。有没有办法做到这一点呢?
例如:

move.w #4,d0    ; loop 5 times

loop
     lea    sc1,a2
     ; .... some code
     dbf    d0,loop

     clr    -(a7)        ; end
     trap   #1

   section data

sc1  dc.b 15,15,"Space",0
sc2  dc.b 10,4,"F1",0
sc3  dc.b 10,9,"F2",0
sc4  dc.b 10,44,"F9",0
sc5  dc.b 10,49,"F10",0
rur96b6h

rur96b6h1#

不幸的是,实际上没有办法做到这一点。那些“sc1”、“sc2”等只是程序员编写代码时的一种方便。一旦代码被汇编,汇编程序就将它们转换为内存地址。以68000的向量表为例:

.org 0
initial_stack_pointer:
dc.l $FFFFFFFE
reset:
dc.l $00000400   ;your code begins at this address

一旦程序被汇编,标签就被销毁了,代码中对reset的任何引用都变成了常数4(因为我们从0开始,每个dc.l占用4个字节的空间)。
然而,这并不是全部都丢失了。你可以使用一个小技巧来实现这一点。如果你为每个字符串创建一个单独的指针表,你就可以更容易地遍历它们,而不必处理一堆填充。

move.w #4,d0    ; loop 5 times
     lea    sc_table,a2
loop
     move.l (a2),a1      ;get the address of the string into a1
     move.b (a1)+,D2     ;load the first 15 in 15,15,"Space",0 into D2
     ;then you'd probably want to have an inner loop that repeats this 
     ;until the terminator is reached.
     
     ; .... some code
     adda.l #4,a2        ;next sc
     dbf    d0,loop

     clr    -(a7)        ; end
     trap   #1

   section data

sc_table:
dc.l sc1
dc.l sc2
dc.l sc3
dc.l sc4
dc.l sc5

sc1  dc.b 15,15,"Space",0
sc2  dc.b 10,4,"F1",0
sc3  dc.b 10,9,"F2",0
sc4  dc.b 10,44,"F9",0
sc5  dc.b 10,49,"F10",0
.align 2

这种技术可能会有点混乱,因为你必须解引用两次,但是一旦你掌握了它,字符串列表将更容易管理。在视频游戏中使用类似的技术加载动画是很常见的。你会有一个指向动画每一帧的指针表,并使用一个计时器变量(每帧递增)作为该表的索引。

相关问题