학교 숙제를 위해 각 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 디스플레이 없음)에서 올바를 수 있기를 바랍니다.
andi는 $ a0에서 비트를 설정 해제해야합니다. 그러면 $ a1은 ori'd에 있어야합니다. 그러나 과제는 마감일이고, 나는 그것을 알아 내지 못했습니다. : –