需要帮助将正确的结果输入 0500 地址

Need help getting the right result into 0500 address

编写一个汇编语言程序来搜索 向后通过内存位置 F454h - F503h 对于包含 ASCII 值的内存位置 对于小写 'a' 并将总数放入 位置 0500h。让程序从 0200h 开始 记忆。 Assemble 程序,加载到 模拟器,运行 它,并验证它是否有效 正确。


org 0200h

ldx #0d
stx 0500h
dex

循环:

lda 0F454h,x
cmp #'a'
bne NotA
inc 0500h

不是A:

dex
cpx #176d
bne Loop

brk

end

当我通过评分器 运行 时,我没有得到正确的结果,因此感谢任何帮助。

有两件事需要考虑。

  1. 您希望起始地址为 F503h,结束地址为 为 F454h。
  2. 理想情况下,您的循环退出条件应该测试索引是否为零或负数(BNE 或 BPL)。这样您就可以避免使用比较 (CPX)。

如果您测试为负数,那基本上意味着最高位已设置。当索引 (X) 从 00h 递减到 FFh 时设置最高位。

最好测试负数,因为索引 (X) 的最后一个值将为零 - 这使得计算要使用的地址(对于 LDA 地址,X)更加明显。

然而,测试是否定的意味着X的最高值可以是80h(128)。这是因为所有高于 7Fh (127) 的值都设置了最高位。如果您从 80h 开始,那么第一次减量 (DEX) 会将索引带到 7Fh,这不是负数,因此循环很好。如果你从 81h 开始,那么 DEX 会将索引带到 80h,这是负数(设置了最高位),所以循环会立即退出,这很糟糕。

那么我们可以测试阴性吗?在这种情况下,这是不可能的。这是因为索引值的范围是 F503h - F454h + 1= 176(不同地址)。并且,这是在 128 以上。

所以我们不得不检查零。这意味着在我们退出循环之前索引 (X) 的最后一个值将是 1。

反过来,因为我们想在循环结束时到达地址 F454h,我们必须从中减去 1 - 因为我们要从索引 (X) 中加 1。所以我们需要:

LDA F453h, X

我们从 X 的什么值开始?即我们需要在F453h上加多少才能得到F503h?这是 F503h - F453h = 176:

LDX #176d

由于 X 一开始不是零,我们需要将位置 0500h 单独设置为零(或 65C02 上的 STZ 0500h):

LDA #0d
STA 0500h

最终算法变成(我更喜欢大写):

ORG 0200h
LDA #0d
STA 0500h
LDX #176d
Loop:
LDA F453h,X
CMP #'a'
BNE NotA
INC 0500h
NotA:
DEX
BNE Loop
BRK

作业奖金:你能让循环执行得更快吗?