2013-03-04 118 views
0

我是新來的彙編語言,我收到一個奇怪的錯誤。該程序應該顯示用戶輸入的整數的4個最低有效位。它適用於大於8的數字,但對於小於或等於8的數字,它會輸出數字。對於8輸出8000而不是1000,五輸出0401.我不明白爲什麼,有人可以幫忙嗎?彙編語言奇怪的錯誤

 .data 
inPrompt: .asciiz "Enter an integer: " 
outLab:  .asciiz "Least significant 4 bits of int entered are " 
############################ code segment ################################ 
     .text 
     .globl main 
main: 
     li $v0, 4 
     la $a0, inPrompt   
     syscall     # print input prompt 

     li $v0, 5 
     syscall     # read input integer 

     move $t0, $v0 

     li $v0, 4 
     la $a0, outLab   
     syscall 

     li $v0, 1 

     andi $a0, $t0, 8    
       syscall 

     andi $a0, $t0, 4    
       syscall 

     andi $a0, $t0, 2    
       syscall 

     andi $a0, $t0, 1   
       syscall 
      ########################################################## 

       li $v0, 10    # exit 
       syscall 

回答

0

的問題是,你被有效計算和打印數量的添加劑分解(2的冪的因子),而不是它的比特。

簡單地說,例如用於「位4」
  andi $a0, $t0, 4
將導致寄存器A0存儲...
- ..the值4如果在寄存器T0的值具有的加法因子4(例如4,5,6,7,12,13等)

- ...如果T0中的值不具有加法因子4(例如0,1,2 ,3,8,9,10等)。

這解釋了爲什麼50401因爲5 is 4 + 1或者更準確地說,5 is 0 * 8 + 4 + 0 * 2 + 1

你需要做的是兩件事情一個:

  • 測試,如果andi操作的結果結果非零,在這種情況下,在調用系統調用之前將1載入$ a0
  • [按位由位的相應數量(3次測試「4比特」時,爲「8位」進行測試時,兩次當測試「2比特」時和一次)]移位andi操作的結果

的第一個建議會導致類似下面的,代替「安迪+系統調用」羣體:

  andi $a0, $t0, 4 
      blez $a0, outBit4 # bit is zero output integer value 0 
      li $a0, 1   # bit is one ouptut integer value 1 (repl 4 by 1) 
    outBit4: syscall 

編輯
在保持該計劃下控制線16 ...(順便說一句,這要求和其他提示表明homework所以我是l提供一般思路而不是給出代碼)
有幾種縮短代碼的方法,但考慮到使用9條線的設置,16條LoC要求有點艱難:提示用戶輸入,獲取輸入和保存並輸出答案的開始...

最常見的方法是使用一個(或多個嵌套)循環。在這種情況下,單個循環就足夠了,基本上你需要重複4次幾乎相同的事情,所以以增加一些LoC來管理循環本身爲代價(即增加參數和檢測循環結束條件),你可以編寫以參數化的方式處理單個工作單元的片段,並在循環內部具有此邏輯。

一個稍微相關的方法是使用子程序,其中重複的邏輯寫入子程序,然後可以多次調用,通過不同的參數來實現參數化行爲。

我之前提到過,因爲它們在彙編語言中的使用非常普遍,而且實際上與編程相關。然而,就目前的'基於'邏輯而言,我恐怕這兩種方法都不會使事情發生在16C以下。您可能需要使用循環結構位移邏輯。

+0

我試圖實現你的第一個建議,但我只允許使用16行代碼,我無法管理它。因爲如果它是零,我需要輸出這兩個,所以我需要兩個分支?對於你的第二個建議,你是指sll還是sra? – 2013-03-04 06:47:49

+0

@EmilyAnnHall a)如果它是0,它也輸出給定的建議片段;不需要'else':在這兩種情況下我們輸出,唯一的區別是,如果零,我們跳過設置值爲1. b)第二個建議意味着'SRL',即右移邏輯(儘管因爲我們只有正值,'SRA'會有同樣的效果)c)保持東西在16行以下,請參閱編輯。 – mjv 2013-03-04 07:11:48

+0

你的第二個建議完全奏效!你真了不起,我真的很感謝你的幫助。 – 2013-03-04 07:21:27