“beq [label]”如何产生超出范围的错误?

如何解决“beq [label]”如何产生超出范围的错误?

我正在尝试编译此代码片段,但终生无法理解汇编器错误

[...]
.macro collflag flags
    RW_forced a8i16
    lda EXRAM,x
    and flags
    RW_forced a16i16
.endmac

[...]

col_r:
    RW_forced a16i16
    lda lamus_vx
    bmi col_l
    beq col_d
    lda lamus_tile
    inc a
    tax
    collflag #PROPS_WALL_LEFT
    beq :+
    jmp r_detected  ; Collision detected - right
:   lda lamus_y
    and #$0300
    beq col_d
    txa
    add #32
    tax
    collflag #PROPS_WALL_LEFT
    beq col_d
    ; Collision detected - right

在这代码摘录中,我收到了这个汇编错误

metroix.s(264): Error: Range error (130 not in [-128..127])

第 264 行指的是:

    beq col_d

RW_forced 是在一个库中实现的,他们真正应该做的就是输出应该可以工作的 sep/rep 指令和 .a8/.a16 宏。但这是他们的实现,对我来说看起来不错:

/**
  Macro: RW_assume
  Assume kNown accumulator/index register widths without emitting any instructions

  Parameter:
  >:in:    widths    Register widths         a8/a16/i8/i16/a8i8/a16i16/a8i16/a16i8
*/
.macro RW_assume widths
.if .blank({widths})
  SFX_error "RW_assume: Missing required parameter"
.else
  RW_init
  .if .xmatch({widths},{a8})
    SFX_RW_a_size .set 1
    .a8
  .elseif .xmatch({widths},{a16})
    SFX_RW_a_size .set 0
    .a16
  .elseif .xmatch({widths},{i8})
    SFX_RW_i_size .set 1
    .i8
  .elseif .xmatch({widths},{i16})
    SFX_RW_i_size .set 0
    .i16
  .elseif .xmatch({widths},{a8i8})
    RW_assume a8
    RW_assume i8
  .elseif .xmatch({widths},{a16i16})
    RW_assume a16
    RW_assume i16
  .elseif .xmatch({widths},{a8i16})
    RW_assume a8
    RW_assume i16
  .elseif .xmatch({widths},{a16i8})
    RW_assume a16
    RW_assume i8
  .else
    SFX_error "RW_assume: Illegal parameter"
  .endif
.endif
.endmac

/**
  Macro: RW_forced
  Force set accumulator/index register widths (ie. always emit rep/sep instructions)

  Parameter:
  >:in:    widths    Register widths         a8/a16/i8/i16/a8i8/a16i16/a8i16/a16i8
*/
.macro RW_forced widths
.if .blank({widths})
  SFX_error "RW_forced: Missing required parameter"
.else
  .if .xmatch({widths},{a8i8})
    sep #$30
  .elseif .xmatch({widths},{a16i16})
    rep #$30
  .elseif .xmatch({widths},{a8i16})
    sep #$20
    rep #$10
  .elseif .xmatch({widths},{a16i8})
    rep #$20
    sep #$10
  .else
    SFX_error "RW_forced: Illegal parameter"
  .endif
  RW_assume widths
.endif
.endmac

我的问题是,beq col_d 或它周围的任何东西到底是怎么超出范围的? 130在哪里?这是汇编程序中的错误吗?

作为参考,如果我使用另一个没有 RW_forced 调用的版本更改 EITHER callflag 调用代码会汇编(但错误)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?