我编写了一个代码来检查数字是偶数还是奇数,但是我的程序包含一个无限循环,所以我找不到它。
这是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
答案 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寄存器不足的机器上特别有用。但是对于提取位或字段,我们需要进行有损操作,以释放或剥离位,因此移位可以完成工作。