1
if  x <= y:
    y = y + 1
else if x != z
    y = y-1
else
    z = z + 1

这就是我的 Arc 汇编代码。我对此相当陌生,所以我不太确定如何将 if/else 语句转换为汇编代码。

! 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


X:  0
Y:  0
Z:  0
    .end
4

1 回答 1

0

执行比较的关键是减法指令(更新标志的版本,即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

事实上,我希望这不是一个工作版本,因为它至少会迫使你进入一些思考学习的过程,试图纠正它:)

于 2015-07-01T15:45:55.007 回答