assembly vasm for Motorola 68000无法将两个标签之间的距离分配给符号

jq6vz3qz  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(112)

Vasm应该支持通过减去end - start来计算两个标签之间的距离,但是当我尝试时,我得到了汇编错误。
我有一个简单的示例代码,我创建了一个AMIGA Copper-List,它存储在两个标签之间的代码中:

CLstart:
  dc.w      COLOR00,$0000
  dc.w      $780f,                      $fffe
  dc.w      COLOR00,$0f00
  dc.w      $d70f,$fffe
  dc.w      COLOR00,$0fb0
  dc.w      $ffff,$fffe
CLend:

为了使它更灵活,我喜欢让汇编程序为我计算Copper-List的大小,这样我就不需要在每次修改它时都手工重新计算。
所以我这样做:

;Sonstige Label
Execbase    = 4
Chip        = 2                                  ; Ramtype: Chip-RAM anfordern

CLsize = CLend - CLstart
;*** Vorprogramm

;Speicher für Copper-List anfordern

Start:
  move.l    Execbase,a6                  
  moveq     #CLsize, d0                   ;Parameter für AllocMem setzen

所以我用vasm指令计算CLsize =
我试着用这行代码编译它:

vasmm68k_mot -m68000 -Fhunk -linedebug -o e:\Amiga\Assembler\Testing\mywork\build\copperdemo.o e:\Amiga\Assembler\Testing\mywork\copperdemo.s

我得到以下错误:

error 10 in line 40 of "e:\Amiga\Assembler\Testing\mywork\copperdemo.s": number or identifier expected
>  moveq     #CLsize, d0                   ;Parameter für AllocMem setzen

error 9 in line 40 of "e:\Amiga\Assembler\Testing\mywork\copperdemo.s": instruction not supported on selected architecture
>  moveq     #CLsize, d0                   ;Parameter für AllocMem setzen

所以第一个错误其实是我不明白的。显然,CLsize没有被计算出来,因此汇编程序不知道在这一行中如何处理CLsize作为一个数字。
它旁边的行按预期工作:

moveq    #Chip,d1

我尝试了不同的东西,但不明白为什么计算的两个标签不分配给它的符号,为什么我不能使用的符号,然后在moveq表达式。
我把计算移到了最后,这样所有的标签都被定义了,但是不起作用。我尝试使用equ语句,但这也不起作用:

CLsize equ CLend - CLstart
jhdbpxl9

jhdbpxl91#

好吧,这是答案(在浪费了一天时间之后),让其他人理解:
CLsize = CLend - CLstart不起作用,因为默认情况下vasm将忽略第一个空格(CLend)之后的所有内容。
然后错误消息是有意义的,因为CLend是一个长值,不适合moveq操作(只允许8位值)。
正确的公式应该是
CLsize=CLend-CLstart
或者你可以使用选项-spaces来改变汇编器的行为,忽略空格,只使用;作为注解标记。

相关问题