STR 指令失败,它没有存储它要存储的值

STR Instruction fails, it doesn't store the value it's meant to store

我正在尝试实现一个代码来比较 2 个数字并将最大的数字存储在寄存器 R1 中。 以下代码正在完成这项工作:

    .ORIG 0x300

    V1: .FILL 0x007
    V2: .FILL 0x020

    LD R2, V1 ;R2=V1
    LD R3, V2 ;R3=V2
    AND R4, R4, #0
    ADD R4, R4, R2 ;R4=R2
    AND R5, R5, #0
    ADD R5, R5, R3 ;R5=R3
    NOT R5, R5
    ADD R5, R5, #1 ;R5=-R4
    ADD R4, R4, R5
    BRN SECOND_BIGGER
    LD R1, V1
    JSR END
    SECOND_BIGGER:
     LD R1, V2

    END:
     .END

但是当我尝试替换复制寄存器 R4 和 R5 上的 2 个值的部分时,它停止工作了:

.ORIG 0x300

V1: .FILL 0x007
V2: .FILL 0x020

LD R2, V1 ;R2=V1
LD R3, V2 ;R3=V2
STR R4, R2, #0
STR R5, R3, #0
NOT R5, R5
ADD R5, R5, #1 ;R5=-R4
ADD R4, R4, R5
BRN SECOND_BIGGER
LD R1, V1
JSR END
SECOND_BIGGER:
 LD R1, V2

END:
 .END

代码执行但显示错误结果,知道原因吗?

使用直接形式的加法,例如:ADD R4, R2, #0R2 中的值将与 0 相加并放入 R4 中。这是您要注册的基本注册 copy/move.

相加 0 比将一个寄存器复制到另一个寄存器需要做更多的工作(例如,加法操作是无用的),但是重复使用现有指令会使硬件更简单,即使理论上不涉及加法的指令也可以运行 更快(通过放弃添加)可能不会改变整体循环时间,并且需要更多硬件并可能占用编码。

加载和存储仅用于在 CPU 个寄存器和内存位置之间复制数据。