说我有一个寄存器t0 0x0000 0000 0000 0000 0000 0001 0010 0001 我想把所有的1变成0. 我该如何做一个接一个呢? (没有使用移动$ t0,$ 0)如何在寄存器中写入特定的位? (汇编语言)
我在考虑使用sb(存储字节)。
说我有一个寄存器t0 0x0000 0000 0000 0000 0000 0001 0010 0001 我想把所有的1变成0. 我该如何做一个接一个呢? (没有使用移动$ t0,$ 0)如何在寄存器中写入特定的位? (汇编语言)
我在考虑使用sb(存储字节)。
不知道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 ...等。但如果你正在处理寄存器,这将会很好。 (一旦你清理了一下,这不是真的很喜欢你可以把它更为零。:))
(一&(-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...
有多种方法说清楚/设置某些位:
ANDN:清除位
(1<<n)
,与0 < = N <(以比特字大小)用于比特位置转换为位掩码
LSB_MASK=(1<<n)-1
是一个位掩码,其具有所有ñ最右侧(设置至少显著位)MSB_MASK=-1<<n
已经(WN)最左边的(最显著)位设置,当W =在字(a + (a & LSB_MASK))
品牌 “房间” 比特的一个比特到LSB_MASK[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
OP正在使用MIPS而不是8086;并且还想将1s逐个变为0 ... – gusbro