0

假设我有一个寄存器 t0 0x0000 0000 0000 0000 0000 0001 0010 0001,我想把所有的 1 变成 0。我该如何一一做到这一点?(不使用移动 $t0,$0)

我正在考虑使用 sb(存储字节)。

4

3 回答 3

1

表达式 (a & (-a)) 等于字中的最低有效位。例如

0xbcd0 = 1011 1100 1101 0000 =  48336  
         0100 0011 0011 0000 = -48336  
-------------------------------------
 AND =   0000 0000 0001 0000 <-- lsb set

在伪代码中:

while (-a & a) { a ^= (-a & a); }  // cache the common sub expression...

有多种方法可以清除/设置某些位:

  • xor:稍微切换一下
  • 和:清除除某位以外的所有内容
  • 或:设置一点
  • sub:如果已设置,则清除一点
  • add:如果清楚则设置一点(否则会产生向左传播的“进位”)
  • andn:清除一点

  • (1<<n),其中 0<=n< (以位为单位的字长)用于将位位置转换为位掩码

  • LSB_MASK=(1<<n)-1是一个位掩码,其中所有n最右边(设置了最低有效位)
  • MSB_MASK=-1<<n当 W=# of bits in word 时,设置了 (Wn) 个最左边(最高有效)位
  • (a + (a & LSB_MASK))在 LSB_MASK 左侧留出“空间”一位
于 2012-10-29T09:22:36.473 回答
0

不知道 MIPS,但这是一种在伪代码中逐位清除的方法。我认为寄存器工作正常,从左侧移出就被扔掉了。

mask = -2
Til param = 0:
    (clearing bits one at a time is stupid unless you care which ones are set)
    If (param AND mask) != param, do something

    param <== param AND mask
    Shift mask one bit left

从技术上讲,这将清除低位,然后是低 2 位,然后是低 3 位……等等。但是,如果您正在处理寄存器,这会很好。(一旦你清除了一点,你就不能让它变得零了。:))

于 2012-10-29T05:41:20.233 回答
-1
[PUSH ax]
 MOV ax, $to
 AND ax, 0
 MOV $to, ax
[PULL ax]

有:p & 0 = 0,然后:

 0000 0000 0000 0000 0000 0001 0010 0001 
 0000 0000 0000 0000 0000 0000 0000 0000
 --------------------------------------- AND
 0000 0000 0000 0000 0000 0000 0000 0000
于 2012-10-29T09:36:41.543 回答