2017-07-26 102 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" 

檢查如何補工作,以及如何價值x外觀(位)都在t0t1(-x)。有一個非常基本的按位操作,當應用於x-x時,將會產生剛剛設置的1位(特殊情況是0x80000000(-2147483648)輸入,其中取反的值超出了32位有符號整數範圍,+2147483648再次是0x80000000(在32位無符號整數中),即與32b有符號整數的-2147483648表示衝突。這就是爲什麼32b int只有範圍-2147483648 to +2147483647)。

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

那麼,只需切換每一位? (因爲我不做MIPS編程,我不確定在MIPS上可以使用哪種指令,在x86上NOT可以使用)。因此,請檢查MIPS指令集,可能是按位操作。在沒有某種內置NOT的CPU上,您可以通過使用xor(有時稱爲eor)和常數設置所有位(C中爲-1~0,彙編程序中通常爲-1)來實現此操作。我認爲在一些RISC CPU上,零寄存器可以被翻轉+在單指令中使用,也可以作爲-1的來源。我添加這個sh * t僅僅是爲了向你展示,你需要在彙編時有點創意,注意到寄存器中的所有指令和值,爲某些特定的算術結果採取一些捷徑。

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

現在他們要求你清除最右邊的1和保持所有其他位完好,原始值x的。我不明白如何在沒有透露解決方案的情況下如何幫助您解決這個問題,因爲如果您考慮一下您的t0t1t2目前包含哪些解決方案,那絕對是微不足道的。

也許你有問題看到這些值的二進制形式,所以它不會「跳到你」這些事情是如何工作的?嘗試一些計算器,它也可以顯示二進制形式,並檢查計算/值以查看特定位(在十進制,十六進制和二進制之間來回切換,特別是十六進制< - > bin很好理解,那麼您可以「看到「通過讀取值的十六進制格式化來設置頭中的特定位),然後重新讀取基本按位操作的描述(and, or, xor),然後返回到此任務。