說我有一個寄存器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