1

我最初(寻求帮助)并在 6502 宠物模拟器中编写了一个 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
4

1 回答 1

3

在我看来,您的代码就像您声称的那样 - 以 little-endian 字节顺序添加两个 N 字节操作数。依稀记得小时候6502的各种寻址方式,代码看起来还不错。X 用于从两个数字中索引当前字节,Y 是操作数长度的计数器,以字节为单位,您循环这些字节,存储在地址 0x0700 和 0x0800 并将结果写入地址 0x0900。

我没有将 Commodore 64 从阁楼中拿出来试一试,而是使用了在线虚拟 6502 模拟器。在这个站点上,我们可以设置内存地址并加载字节值。它们甚至链接到一个页面来组装操作码。因此,将内存位置 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
于 2014-02-21T09:54:34.027 回答