需要帮助将正确的结果输入 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
当我通过评分器 运行 时,我没有得到正确的结果,因此感谢任何帮助。
有两件事需要考虑。
- 您希望起始地址为 F503h,结束地址为
为 F454h。
- 理想情况下,您的循环退出条件应该测试索引是否为零或负数(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
作业奖金:你能让循环执行得更快吗?
编写一个汇编语言程序来搜索 向后通过内存位置 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
当我通过评分器 运行 时,我没有得到正确的结果,因此感谢任何帮助。
有两件事需要考虑。
- 您希望起始地址为 F503h,结束地址为 为 F454h。
- 理想情况下,您的循环退出条件应该测试索引是否为零或负数(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
作业奖金:你能让循环执行得更快吗?