执行比较的关键是减法指令(更新标志的版本,即subcc
)。
您可以指定%r0
为目标操作数,因为不需要这种减法的结果(利用 ARC 三操作数形式)。
假设你这样做
subcc %r1, %r2, %r0
以下情况属实
- 结果被丢弃,因为它被写入
r0
- 如果
C
设置了标志,那么r2 > r1
- 如果
C
未设置标志,则r2 <= r1
- 如果
Z
设置了标志,那么r2 == r1
- 如果
Z
未设置标志,则r2 !=r1
我从来没有写过 ARC 汇编代码。这是翻译给定代码的尝试,我无法调试甚至组装此代码。因此,将其视为解释上述概念的简洁方式。
! This program executes an If/else statement
.begin
.org 2048
prog1: ld [X], %r1 ! this loads memory X into register 1
ld [Y], %r2 ! this loads memory y into register 2
ld [Z], %r3 ! this loads memory z into register 3
subcc %r2, %r1, %r0 !y ? x
bcs .else_if ;x > y
add %r2, 1, %r2 !y = y + 1
ba .end
.else_if:
subcc %r1, %r3, $r0 ;x ? z
beq .else ;x == z
sub %r2, 1, %r2
ba .end
.else:
add %r3, 1, %r3 !z = z + 1
ba .end
X: 0
Y: 0
Z: 0
.end
事实上,我希望这不是一个工作版本,因为它至少会迫使你进入一些思考学习的过程,试图纠正它:)