Assembly的数值变量修改前一个

Assembly's numeric variable modifies the previous one

在学习 Z80 程序集时,我有一个奇怪的行为,即在声明 2 个数值变量后,第一个变量的值得到一个完全不同的值。

示例:

    org 32768

    ld bc,(score1)
    call 6683
    ret

score1  defb 15
score2  defb 32

打印值为 8207 - 为什么以及如何解决?没有最后一行,一切都很好。使用其他方法打印该值会得到相同的结果。

是的,完全正确;使用 defw 将增加数据的大小(每个 2 个字节)以匹配代码中使用的指令的数据大小规范。

代码和数据大小必须匹配;每条引用数据的指令都会告诉 CPU 数据的大小,并且数据声明也有大小。在许多汇编语言中,一致性是程序员的责任——汇编程序通常不会抱怨(大小)不匹配。

CPU从不看数据声明,只看指令。因此,每次指令引用数据时,它都必须指定方式(即数据大小)。 CPU 不记得也不关心一个地方的代码与另一个地方的代码之间或代码与数据之间的不匹配;它一次只接受一条指令,并按指令执行。

扩展数据以匹配代码所做的是这里最简单的解决方法,因为您的打印子例程采用 bc 16 位寄存器对中的参数进行打印。


否则,您可以更改指令以使用与 defb 相同大小的负载,即字节大小而不是字大小。这将使用像 LD c,(score1) 这样的指令来完成,它只加载 c 8 位寄存器——这适用于使用 defb.[=24= 声明为 8 位的数据。 ]

然而,要继续并使用打印功能,由于打印需要 16 位 bc 中的值,因此 c 中的 8 位值必须扩展为 16 bc 中的位值,通过清除 b(将 b 设置为 0,或通过符号扩展到 b)。

如果我弄错了字节序,那么在我上面所说的用一个字母 bc 交换对 8 位寄存器的引用。