我最初(寻求帮助)并在6502 pet模拟器中编写了一个BASIC程序,它添加了两个n字节整数。但是,我的反馈是它只是添加了两个16位整数(不添加n字节整数)。
任何人都可以通过查看我的代码帮助我理解这些反馈,并指出我正确的方向来制作一个增加两个n字节整数的程序吗?
感谢您的合作!
文档: 使用绝对索引寻址添加两个n字节整数。加数从内存位置开始,价格为0600美元,0700美元,答案为0800美元。整数的字节长度为$ 0600(¢ - > 256)
Machine Code:
18 a2 00 ac 00 06 bd 00
07 7d 00 08 9d 00 09 e8
00 88 00 d0
操作码,文档,变量:
A1 = $0600
B1 = $0700
B2 = $0800
Z1 = $0900
[START] = $0500
CLC 18 // loads x with 0
LDX A2 00 // loads length on Y
LDY A1 AC 00 06 // load first operand
loop: LDA B1, x BD 00 07 // adds second operand
ADC B2, x 7D 00 08 // store result
STA Z1, x 9D 00 09 // go to next byte
INX E8 00 // count how many are left
DEY 88 00 // do more if needed
BNE loop D0
答案 0 :(得分:3)
在我看来,您的代码就像您声称的那样 - 以小端字节顺序添加两个N字节操作数。我依稀记得我错过的青年时期6502的各种寻址方式,而且代码似乎很好。 X用于从两个数字索引当前字节,Y是以字节为单位的操作数长度的计数器,并循环遍历这些字节,存储在地址0x0700和0x0800,并将结果写入地址0x0900。
而不是将Commodore 64从阁楼中取出并试用,我使用了online virtual 6502 simulator。在这个站点上,我们可以设置内存地址并加载字节值。它们甚至链接到一个页面来组装操作码。因此,将内存位置0x0600设置为“04”,将0x0700和0x0800设置为“04 03 02 01”,我们应该看到此代码添加这两个32位值(0x01020304 + 0x01020304 == 0x02040608)。
单击PC寄存器并将其设置为0x0500逐步执行代码,然后单步执行,我们发现您的机器代码中存在错误。在编译为E8的INX之后,我们达到了一个假的0x00值(BRK)终止。下面更正的代码运行完成,通过读取内存0x0900可以看到预期的值。
0000 CLC 18
0001 LDX #$00 A2 00
0003 LDY $0600 AC 00 06
0006 LOOP: LDA $0700,X BD 00 07
0009 ADC $0800,X 7D 00 08
000C STA $0900,X 9D 00 09
000F INX E8
0010 DEY 88
0011 BNE LOOP: D0 F3
内存转储:
:0900 08 06 04 02 00 00 00 00
:0908 00 00 00 00 00 00 00 00