我需要在ARC汇编语言中实现以下代码段

时间:2015-07-01 14:21:21

标签: if-statement assembly architecture arc-architecture

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

1 个答案:

答案 0 :(得分: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

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