如何在寄存器中写入特定位? (汇编语言)

时间:2012-10-29 05:17:54

标签: assembly mips cpu-registers

说我有一个寄存器t0 0x0000 0000 0000 0000 0000 0001 0010 0001 我想将所有1变为0。 我如何逐一做到这一点? (不使用move $ t0,$ 0)

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

3 个答案:

答案 0 :(得分:1)

表达式(a&(-a))等于单词中的最低有效位。 e.g。

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&lt; (字位大小)用于将位位置转换为位掩码

  • LSB_MASK=(1<<n)-1是一个位掩码,其中所有 n 最右边(设置最低有效位)
  • MSB_MASK=-1<<n设置(W-n)最左侧(最高有效)位,当W =字中的位数
  • (a + (a & LSB_MASK))为LSB_MASK左侧的一位创造“空间”

答案 1 :(得分:0)

Dunno 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位等。但如果您正在处理寄存器,这将没有问题。 (一旦你清理了一下,它就不是你可以让它更多零。:))

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