對於學校中的作業分配,我需要使用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顯示屏)。
andi應該已經取消設置$ a0中的位,並且那麼$ a1應該已經過去了。但是,這個任務是到期的,我沒有弄明白。 :( – 2011-03-26 17:06:46