2011-03-24 3 views
0

학교 숙제를 위해 각 LED가 정확하게 1 바이트 내에 2 비트 저장된 MMIO LED 디스플레이를 사용해야합니다. 과제를 위해 나는이 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를 해제하고 하나 이상의 LED를 움직일 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 내 또는 getLedPattern :은 틀렸지 만 100 % 확실하지는 않습니다.

바라기를, 나는이 올바른 것을 얻는 것이 일반 감각 (LED 디스플레이 없음)에서 올바를 수 있기를 바랍니다.

+0

andi는 $ a0에서 비트를 설정 해제해야합니다. 그러면 $ a1은 ori'd에 있어야합니다. 그러나 과제는 마감일이고, 나는 그것을 알아 내지 못했습니다. : –

답변

1

비트 지우기에 대한 상수가 잘못되었다고 생각합니다. 다음 대신 시도 :

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

코드에서 다른 이상한이 있습니다

  • S2를 사용하지만, 설정
  • S3
  • 을 설정하지,하지만
  • 케이스 가구 1과 case2를 사용하지 않습니다 $ t0은 1을 유지할 수 없기 때문에 도달 할 수 없습니다. 2
+0

감사합니다. 프로젝트가 만기가 되었기 때문에 나는 그 기회를 포기하지 않았다. (그리고 나는 시간이 없다.) $ s3은 내가 전역 변수로 사용했던 전역 변수였다 ... 그리고 나머지는 어떻게 계산 했을까? ? –

관련 문제