2011-03-24 101 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