assembly 在VASM中的inline/einline块内使用本地标签时出现“标签重新定义”错误

ua4mk5z4  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(115)

首先,这是我关于组装的第一个问题,我仍然处于我的学习之旅的最开始(希望是漫长的),所以如果一些术语完全错误,请原谅我(我希望我的问题至少有一些意义)。
我正在使用VASM汇编程序来构建一个Z 80程序。
我有一个子例程,它使用VASM的inline/einline指令来定义本地标签as explained in the docs
在编译时给我错误的代码部分如下:

PlayerSprY:
; player Y SPRITES' VERTICAL IN SAT
; Parameters: hl = SATY address
; Affects: a, hl, b
    rept 4                     ; repeat 4 times as player is 4 tiles tall
    inline                     ; use local name space (VASM does not have local name space like WLA-DX)
    ld b,3                     ; counter 3 as player is tile wide
    PlayerSprYLoop:
        out (VDPData),a
        inc hl
        djnz PlayerSprYLoop    ; decrease B and jump back if NonZero
    add a,8                    ; add 8 (since next row is 8 pixels below.)
    einline                    ; end of local name space (http://eab.abime.net/showthread.php?t=88827)
    endr                       ; end of rept

    ret

我得到的错误是:

error 75 in line 3 of "REPEAT:Hello World.asm:line 192": label <PlayerSprYLoop> redefined
    included from line 192 of "Hello World.asm"
>    PlayerSprYLoop:

我知道由于rept 4PlayerSprYLoop标签被重新定义了4次,但我认为将我的定义放在inline/einline块中可以防止此错误。

uurv41yg

uurv41yg1#

我已经找到了答案。
the same docs I pointed out中,它显示为
本地标签以'.'开头或以'$'结尾。对于其余标签,允许使用包括'_'在内的任何字母数字字符。本地标签在两个全局标签定义之间有效。
因此,此代码可正确编译(请注意,PlayerSprYLoop已变为.PlayerSprYLoop):

PlayerSprY:
; player Y SPRITES' VERTICAL IN SAT
; Parameters: hl = SATY address
; Affects: a, hl, b
    rept 4                     ; repeat 4 times as player is 4 tiles tall
    inline                     ; use local name space (VASM does not have local name space like WLA-DX)
    ld b,3                     ; counter 3 as player is tile wide
    .PlayerSprYLoop:
        out (VDPData),a
        inc hl
        djnz .PlayerSprYLoop    ; decrease B and jump back if NonZero
    add a,8                    ; add 8 (since next row is 8 pixels below.)
    einline                    ; end of local name space (http://eab.abime.net/showthread.php?t=88827)
    endr                       ; end of rept

    ret

相关问题