2011-03-24 54 views
0

對於學校中的作業分配,我需要使用MMIO LED顯示,其中每個LED都精確地存儲在一個字節中的2位。對於作業,我需要「向上,向下,向左,向右」移動這些LED。我還需要設置顏色(我將爲此使用0x40)。這是我的問題:取消設置和重置某些位

當我點擊「右」箭頭將LED移動到1列時,當它應該返回到黑色(0x00)時,它仍然保留在當前列中。如果我點擊右側4次(正好移動1個字節),我會得到另一個點亮的LED,並保留原來的LED。

這是我的MIPS代碼:

getLedPattern: 
move $t2, $s2 
andi $t1, $t2, 0x3 #remainder of x/4 is in $t0 
sll $t0, $t2, 2 #x/4 is in $t0 
beq $t0, 0, case0 
beq $t0, 1, case1 
beq $t0, 2, case2 
case3: 
    andi $a0, 0xFFFFFFFC 
    #insert $a1 into bits 0 and 1 of $a0 into $v0 
    or $v0, $a0, $a1 
    jr $ra 

case2: 
    andi $a0, 0xFFFFFCFF 
    #insert $a1 into bits 2 and 3 of $a0 into $v0 
    #srl $a1, $a1, 2 
    or $v0, $a0, $a1 
    jr $ra 

case1: 
    andi $a0, 0xFFFCFFFF 
    #insert $a1 into bits 4 and 5 of $a0 into $v0 
    #srl $a1, $a1, 4 
    or $v0, $a0, $a1 
    jr $ra 

case0: 
    andi $a0, 0xFCFFFFFF 
    #insert $a1 into bits 6 and 7 of $a0 into $v0 
    #srl $a1, $a1, 6 
    or $v0, $a0, $a1 
    jr $ra 

setLED: 
    addi $sp, $sp, -20 
    sw $ra, 0($sp) 
    sw $t0, 4($sp) 
    sw $t1, 8($sp) 
    sw $t2, 12($sp) 
    sw $t3, 16($sp) 

move $t5, $a0 
sll $t6, $a1, 5  # y*32 
srl $t2, $a2, 2  # x/4 
add $t5, $t5, $t6 
add $t5, $t5, $t2 
lb $a0, 0($t5) 
move $a1, $a3 
jal getLedPattern 
sb $v0, 0($t5) 
move $s3, $t5 

lw $ra, 0($sp) 
lw $t0, 4($sp) 
lw $t1, 8($sp) 
lw $t2, 12($sp) 
lw $t3, 16($sp) 
addi $sp, $sp, 20 
jr $ra 

的邏輯是,它在開始時在存儲器位置0xFFFFOOO8(左上LED),向下移動一行(32個字節)並在x列(加X *比特)。但是,我似乎無法取消當前的LED並將其移到一個。任何幫助,將不勝感激。我相信我或getLedPattern:是錯誤的,但不是100%肯定的。

希望得到這個正確的,我將能夠在一般意義上得到這個正確的(沒有LED顯示屏)。

+0

andi應該已經取消設置$ a0中的位,並且那麼$ a1應該已經過去了。但是,這個任務是到期的,我沒有弄明白。 :( – 2011-03-26 17:06:46

回答

1

我想你的常量清除位是錯誤的。 儘量不要使用以下:

0xfffffffc // or ~0x03 
0xfffffff3 // or ~0x0C 
0xffffffcf // or ~0x30 
0xffffff3f // or ~0xC0 

還有其他的古怪在你的代碼:

  • S2被使用,但從來沒有
  • S3設定,但從未使用
  • 案例1和案例2將永遠不會達成,因爲$ t0可以容納,也不可能是1
+0

謝謝。我沒有給它一個鏡頭,因爲這個項目到期了(我沒有時間)。$ s3是一個全局變量,我曾經用過並且在整個過程中使用...我將如何計算剩餘的? – 2011-03-29 14:33:29