编写汇编代码让6502处理器数到65536

问题描述

我是汇编程序的新手,想要让 6502 从 0 计数到 65536,并希望对代码有所帮助。我必须使用 2 个字节(字),但问题是 INC 命令只增加一个字节。

解决方法

我是汇编编程新手

对未来的暗示

大多数现代计算机(只有少数例外)使用字节。这意味着:这些计算机在 base-256 系统中工作。

适用于十进制系统的相同数学规则也适用于所有其他系统 - 包括 base-256。

每当你想在汇编中执行一些操作时,你首先应该考虑十进制对应的问题是什么样的,你将如何解决它。

计数到 65536 ...我必须使用 2 个字节(字),但问题是 INC 命令只增加一个字节。

十进制对应的问题是:

我必须从 0 数到 100。然而,在学校我只知道哪个十进制数字跟在另一个数字之后(例如 6 跟在 7 之后),但他们没有教我哪个 2 位数字跟另一个 2 位数字(例如 86 后跟 87)。

现在我们来看看小数问题:

从0到99,可以用两位数;数到 100 已经需要三位数了。

您可能会通过以下方式解决问题:

  • 您以 000 开头
  • 您可以按以下方式加一:
    • 您可以将最后一位替换为以下一位。
      示例:如果当前值为 086,您可以将 6 替换为 7,因此您最终会变成 087
    • 如果最后一位数字是 9,您可以将 9 替换为 0 并替换中间数字。
      示例:如果数字是 079,您将首先替换最后一位数字:070,因为您将最后一位数字替换为 0,因此您还替换了中间数字:{{1 }}
    • 如果您用 080 替换中间数字,您也替换了第一个数字: 执行上述步骤,0首先变成099,然后是090,然后是000
  • 只要您执行了最后一步,您的任务就完成了,因为您达到了 100。

汇编语言:

让我们再看看十进制系统中完成的步骤,并将其与我们必须在汇编语言中完成的步骤进行比较:

  • 十进制:从0到99,可以用两位数;数到 100 已经需要三位数了。
    Assembly:可以使用两个字节完成从 0 到 65535 的计数; 65536 已经需要三个字节。
  • 十进制:以100
    开头 汇编:您必须使用一些指令(例如 000LDA)来确保三个(或两个)字节的初始值为 0。
  • 您可以按以下方式加一:
    • 十进制:您可以将最后一位数字替换为以下一位。
      汇编:您使用 STA 指令来递增(这意味着:向上计数)最后一个字节。
    • 十进制:如果最后一位数字是 INC,您可以将 9 替换为 9 和 ...
      汇编0 指令将从 255 计数到 0;这就像在十进制系统中从 9 到 0 计数。 INC 指令会在从 255 计数到 0 时设置 INC 标志;如果不这样做,它将清除 Z 标志。
      如果未设置 Z 标志,您可以使用 BNE 指令跳转到某个指令。这意味着您可以跳过一些仅在 Z 从 255 计数到 0 时才执行的指令。(或者,如果您没有从 255 计数到 0,则可以“向后”跳转到某个循环的开始...... )
    • 十进制:...并替换中间数字。
      汇编:您将 INC 指令应用于中间字节。
    • 十进制:如果将中间数字替换为 INC ...
      汇编:这意味着:您应用于中间字节的 0 指令已将 255 替换为 0,因此设置了 INC 标志!
  • 十进制:只要您执行了最后一步,您的任务就完成了,因为您达到了值 100。
    汇编:在 base-256 系统中计数到 65536 也是如此。

一些注意事项:

6502 具有三个寄存器:ZAX。因此,只要最大数小于 2^24,您也可以在寄存器 (Y,INX ...) 中计数,而不是在内存中计数。

,

我们从小学和基数 10 得知

 19
+ 1
====

您使用进位,将值进位到 10 的下一个幂

 1
 19
+ 1
====
  0

9+1 = 0 进位 1。

这适用于所有基地。现在也明白零了,开始之前有个隐含的零

  0
 19
+ 1
====

作为第一个数字的进位。

 10  
 19
+ 1
====
 20

就是它看起来完成的样子。但是,如果我的论文太薄,或者我写的数字太大以至于每页只能容纳一列。

个列

10  
 9
+1
====
 0

十位列需要从个位列引入进位

01  
 1
+0
====
 2

对于第二个操作数隐含零,并且也认识到这个操作也有进位,它是零所以我们不在乎,然后我们可以将两个操作产生 0 和 2 并将它们组合在我们的头脑中理解结果为 20。19+1 = 20

base 2 或 base 16 没有区别

  1FFF
+ 0001
=======

最低有效字节,无进位

 110
  FF
+ 01
=======
  00

然后剩余的字节为您想要的字节数,需要添加之前操作中的进位

  11
  1F
+ 00
=======
  20 

使用一次一个字节的数学运算得出结果 0x2000。

因此,根据您想要为每个循环添加多少,您可以查看执行此操作的指令,请注意是否将进位标志修改为该操作的输出。然后查找添加该进位标志以进行级联的添加操作。请注意,它以某种形式需要四个字节,两个用于顶部操作数,两个用于底部操作数,尽管您可能会找到快捷方式。

同样,如果您想在 65535 处停止(我们假设您在那里打错了字),那么您需要考虑如何一次与 0xFFFF 进行一个字节的比较,如果两个字节都不是最终值,则继续循环.

或者你真的应该从 0x0000 到 0x0000 计算 65536 次?相同的区别,除了你在哪里做循环测试?例如,在 C 中,它是 while() 还是 do...while()。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...