【问题标题】:How do I do a "greater than" jump in Z80 Assembly, rather than "greater than or equal to"?如何在 Z80 装配中进行“大于”跳转,而不是“大于或等于”?
【发布时间】:2020-11-05 21:46:58
【问题描述】:

我正在尝试学习 Z80 组装 - 如果这非常明显,请原谅我 - 但我对整个组装相当陌生。

在与cp 进行比较后,我已经熟悉了跳跃的工作原理,以及它们与我所知道的事物的等同性,NZ 是“!=”的等价物,C 与“”并不容易。

NCCNC 相反——据我所知——在我的场景中与“>=”相关。我的假设是我可以在相同的跳转条件下组合NCNZ 以删除“=”可以这么说,但它似乎不起作用。

我可以做些什么来使我的跳跃条件是a 比比较的数量更多不允许它们等于零?

【问题讨论】:

  • 大于 不小于等于 是吗?标志组合也因无符号和有符号而异,因此如果您遍历数学,z80 是否反转进位以借用减法等,但通常归结为您正在查看的内容 C 与否 C, N != V或 N == V 等。我将不得不复习 z80,但显然那里有一个选项,看看。
  • @Jester,不确定您是否在谈论特别有关 Z80 的内容,但通常不会交换操作数将 > 更改为 <(和 >= 更改为 <=) - 即相等条件不会仅通过操作数交换反转?要让> 进入<= 测试相反的条件(逻辑否定,即条件为假,而不是操作数交换)。
  • 糟糕。是的,我的坏。最好删除它。
  • 如果您使用C 来检查小于,那么我们可以认为您要测试大于操作数的A,而不是大于A 的操作数吗?

标签: assembly z80


【解决方案1】:

CP 执行减法并适当地设置标志。它不存储减法的结果。

因此,要比较 A 是否大于操作数,您需要查找严格为正数的减法结果,即 1 或更大。

没有直接的途径,你必须将其作为一个化合物来做——NC 消除所有小于 0 的结果,让你大于或等于,然后 NZ 消除可能性平等。但是您可能想要翻转它们以获得更直接的代码。例如

      CP <whatever>
      JR C, testFailed   ; A was less than the operand.
      JR Z, testFailed   ; A was exactly equal to the operand.

testSucceeded:
      ; A was not less than the operand, and was not
      ; equal to the operand. Therefore it must have
      ; been greater than the operand.
      ...

testFailed:
      ...

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2012-10-14
    • 1970-01-01
    • 2011-01-25
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2013-09-02
    相关资源
    最近更新 更多