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