2017-07-26 10 views
0

私は「XXXXXXX」と第一二つの部分のためにこれを考え出すのトラブルの少しを持っていますのビットを操作しない私ははどのように私はアセンブリ言語のMIPS32

add $t0, $v0, $0  # $t0 gets copy of input x 
sub $t1, $0, $t0  # $t1 gets mask1 that is "-x" 

を持っていますが、残りの部分は、私は混乱しています。私は正確な答えを望んでいないが、説明は非常に助けになる!

UPDATE:

私はそれを動作させることができました。ここに解決策があります。ありがとうございました!

**move $t0, $v0**   # $t0 gets copy of input x 
**sub $t1, $zero, $t0**  # $t1 gets mask1 that is "-x" 

li $v0, 1 
move $a0, $t0 
syscall 

li $v0, 4 
la $a0, outLab1   
syscall    # print output label 1 
li $v0, 1 
**and $a0, $t0, $t1**  # $a0 gets "all bits of x cleared except the 
         rightmost 1" 
syscall 

not $t2, $a0   # $t2 gets mask2 that is "$a0 with all its bits 
         toggled" 

li $v0, 4 
la $a0, outLab2   
syscall    # print output label 2 
li $v0, 1 
**and $a0, $t0, $t2**  # $a0 gets "all bits of x with the rightmost 1 
          cleared" 
syscall 

li $v0, 10    # exit 
syscall 

答えて

0
xxxxxxxxxxxxx #$a0 gets "all bits of x cleared except the rightmost 1" 

チェックする方法の2の補数作品、そしてどのようt0t1の両方の値xルックス(ビット単位)(-x)。 x-xに適用されると、ちょうどちょうど1ビットが出力されます(特別な場合は、無効化された値が32ビット符号付き整数の範囲外の0x80000000(-2147483648)入力、+2147483648 32ビットの符号付き整数の-2147483648表現と衝突します。つまり、32b intの範囲は-2147483648 to +2147483647のみです)。

xxxxxxxxxxxxx # $t2 gets mask2 that is "$a0 with all its bits toggled" 

ちょうど各ビットを切り替えますか? (私がMIPSプログラミングをしないので、NOTのMIPSでどの命令を使うことができるかわからない)。おそらくMIPS命令セット、ビットごとの演算をチェックしてください。何らかの組込みNOTを持たないCPUでは、xor(時にはeorと呼ばれる)とすべてのビットがセットされた定数(アセンブラでは通常、-15でも、Cでは、-1または)を使用してこれを行うことができます。私はいくつかのRISC CPUでゼロレジスタを反転させることができ+ -1のソースとして単一命令で使用できると思います。私はこのsh * tをちょうどあなたに紹介するために追加しています。アセンブリーで少し創造的であること、レジスターのすべての命令と値を認識して、特定の算術結果のショートカットを取る必要があるということです。

xxxxxxxxxxxx # $a0 gets "all bits of x with the rightmost 1 cleared" 

今、彼らは元の値xの、右端の1をクリアし、そのまま他のすべてのビットを保持するように依頼します。この時点であなたのt0t1およびt2が含まれていることを考えると、解決策を即座に明らかにすることなく、この問題を解決する方法はわかりません。

これらの値がバイナリ形式で表示されるのは問題でしょうか?バイナリ形式も表示できるいくつかの電卓を試してみて、特定のビットを見るために計算/値を確認してください(特に10進数、16進数、バイナリの間で切り替えること、特に16進数< - >ビンは理解しやすいです。 "値の16進フォーマットを読むだけで、頭の中の特定のビット)を読み込み、次に基本ビット操作(and, or, xor)の説明を再読み込みして、このタスクに戻ります。