2015-07-01 27 views
1
if x <= y: 
    y = y + 1 
else if x != z 
    y = y-1 
else 
    z = z + 1 

这就是我的Arc汇编代码。即时通讯相当新,所以我不太清楚如何将if/else语句转换为汇编代码。我需要在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 


X: 0 
Y: 0 
Z: 0 
    .end 

回答

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 

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