【问题标题】:Re-attempting BASIC 6502 N-byte integer addition?重新尝试 BASIC 6502 N 字节整数加法?
【发布时间】:2014-02-20 21:39:40
【问题描述】:

我最初(寻求帮助)并在 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

【问题讨论】:

  • 注释在汇编程序中是必不可少的。这段代码的参数是什么——在哪些寄存器/位置中提供了哪些数据,以及返回的结果在哪里?猜测:看起来 A 应该是字节数(两个值的长度相同); B1 和 B2 是两个值的起始地址(表示为 LSB 在前),z 是具有相同长度的输出块。真的?如果是这样,我不确定我是否理解投诉。
  • 我没有包含我的所有文档;愚蠢的错误。已编辑。请再次结帐。
  • 仍然试图理解抱怨——自从我的 C64 以来已经太久了——你确定进位位从 add 到 add 正确传播了吗? (在你开始这个过程之前就很清楚了吗?)
  • 我相信是因为我认为 ADC 被正确放置在循环中

标签: byte simulator addition basic 6502


【解决方案1】:

在我看来,您的代码符合您的要求——以 little-endian 字节顺序添加两个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2019-01-31
    • 2011-12-08
    • 2012-06-17
    相关资源
    最近更新 更多