如何在汇编器中检查数字是偶数还是奇数

时间:2019-12-18 18:44:16

标签: assembly compare division

我编写了一个代码来检查数字是偶数还是奇数,但是我的程序包含一个无限循环,所以我找不到它。

这是ISA中的所有命令:

Advances in HTTP Live Streaming
Commands Part 1

这是我的代码:

#Read in Number
addi zero t0 1
sysmove exc t0
syscall

#Copy Number to a0
sysmove a0 I[0]

#check if number is even or odd
ldd t1 zero 0
ldd t2 zero 0
ldd t3 zero 1 #Register contains 1
ldd t4 zero 0 #Register contains 0

#divide:
subi a0 t2 2 # subtract with 2
ldd t2 a0 0 #move to a0
beq a0 t3 odd #compare a0 with 1
beq a0 t4 even #compare a0 with 0
jmp 6

#odd:
cout odd
syscall

#even: 
cout even
syscall

1 个答案:

答案 0 :(得分:3)

偶数与奇数由最低位Least Significant Bit确定。如果为0,则数字为偶数,否则为1,并且为奇数。

通常,可以使用具有恒定掩码1的简单AND立即操作来隔离此单个位,该操作会将除LSB之外的所有其他位清零。如果没有AND立即数,但是具有AND,则可以将立即数1值加载到寄存器中并执行(非立即数)AND。

 1111110000000000
 5432109876543210    bit position
 ----------------
 abcdefghijklmnop    word of interest (to test for even odd)
                       note that bit "p" tells us even vs. odd
 0000000000000001
        &
 ----------------
 000000000000000p

但是,没有AND操作,还有许多其他方法可以隔离单个位(或位范围)。这是一个:

向左移动,直到它是唯一剩余的位。左移将删除较高有效位,同时移零。因此,如果您的计算机使用的是16位寄存器,则向左移15将产生以下值:

 abcdefghijklmnop    word of interest (to test for even odd)
                       note that bit "p" tells us even vs. odd
      << 15
 ----------------
 p000000000000000

该值可以与零比较。当寄存器为零时,则p为零,表示数字为偶数;当寄存器为非零时,p为非零,因此数字为奇数。


如果只向左移一点,我们会得到

 abcdefghijklmnop    word of interest (to test for even odd)
                       note that bit "p" tells us even vs. odd
      << 1
 ----------------
 bcdefghijklmnop0

因此,如果我们将同样的位移进行15倍,我们将得到p000...

您应该可以使用shli r1, r2, 15


如果愿意,可以采用该左移的值并将其右移。算术右移,结果将是:

p000000000000000
       >> 15 arithmetic shift
----------------
pppppppppppppppp

算术移位适用于提取有符号字段。 (当然,我们很少看到有符号的字段,因为1的符号字段只能表示-1和0!)

通过逻辑右移,结果将是:

p000000000000000
       >> 15 logical shift
----------------
000000000000000p

此结果将低位恢复到原来的位置(并给出与AND相同的答案,立即数为1)。 (但是,我们不需要将p位返回到原始位置只是为了将其与0进行比较。)


如果您希望进行无损平移,则旋转指令非常方便。在某些情况下,由于无损移位不需要额外的寄存器来保留原始位,因此它们在CPU寄存器不足的机器上特别有用。但是对于提取位或字段,我们需要进行有损操作,以释放或剥离位,因此移位可以完成工作。