如何解决编写汇编代码让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
开头 汇编:您必须使用一些指令(例如000
和LDA
)来确保三个(或两个)字节的初始值为 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 具有三个寄存器:Z
、A
和 X
。因此,只要最大数小于 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()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。