2014-09-15 5 views
0

안녕하세요, 임시 직원으로 비트를 저장하려고합니다. 레지스터. 이 일을 제대로하고 있습니까? 그리고 나는 그것에, 나는 얼마나 많은 1이 십진수 (0-16)의 바이너리 형식에 있는지 알기 위해 노력하고 있는데, 나는이 일을 올바르게하고 있는가? 여기에 중요한 코드의 덩어리가 잘 (바로 출력하고 무엇을하지 않음)비트를 저장하는 MIPS에 혼란이있다.

# for (i = 0; i <= 16; i++) 
li $s0, 0 # i = 0 

li $s3, 0 #constant zero 

li $s4, 0 #i-2=0 

bgt $s0, 16, bottom 
top: 
# calculate n from i 
# Your part starts here 

sb $t1, ($s0) #store LSB from number i in t1 

sltu $t7,$s3,$t1 # check if t1 is a 1, if it is set t7 = 1 

add $s1 ,$s3,$t1 # add 1 to n 

ble $s4, 7, bloop # loop through rest of bits 

bloop: 

srl $t7, $s0, 1 # move bits in i right one, bringing in a zero from the left 

sltu $t6, $s3, $t7 # check if t7 is a 1, if it is set t6 to 1 

add $s1, $t6, $s1 # add increment n up 1 

bgt $s4, 7, continue # break out of loop 

continue: 
+0

죄송합니다, sb $ t1 ($ s0)에 대한 언급을 잊어 버렸습니다. 오류가 발생했습니다 --- 런타임 예외 0x00400034 : 범위를 벗어난 주소 0x00000000 – user1914650

답변

1

이 당신의 코드를 볼 수 있습니다, 나머지는 작품이다

li $s0, 0 
    li $s3, 0 
    li $s4, 0 

이 지침은 3 개 레지스터 $s0, $s3 설정은, 및 bottom-$s4

bgt $s0, 16, bottom 

0 지점 $s0 경우보다 16 이제입니다은 처음에는 0이되고 앞에는이라는 레이블이 없으므로 여기로 돌아갈 방법이 없으므로이 분기는 절대 사용되지 않습니다. 또한 조립하지 않을 것입니다. 어디서나 bottom 라벨을 정의하지 마십시오.

top: 

레이블 top, 다시 여기에 루프 등을 분기 할 수 있도록 - 그러나 당신의 코드는 그래서 결코 실제로 것, top에는 지점이 없습니다.

sb $t1, ($s0) 

저장소 $s0 의해 주어진 어드레스에서의 바이트 $t1. 이제 처음으로 루프에 들어가서 $t0을 설정 한 적이 없으므로 저장 하시겠습니까? 더 나쁜 것은 $s0이 0으로 설정되었으므로 주소 0에 저장되므로 충돌이 발생합니다 (런타임 오류가 발생 함).

그래서이 상점은 실제로 의미가 없습니다. 잘못된 주소에 쓰레기를 보관하고 있습니다.

sltu $t7,$s3,$t1 

$t1$s3을 비교하여 0 또는 1인지에 따라 $s3$t7 설정 미만 $t1이다. $t1은 여전히 ​​가비지 (아무 것도 입력하지 않은 것)이지만 $s3이 0이므로 문제가되지 않으므로 비교가 항상 거짓입니다. 어쨌든 중요한 것은 아닙니다. 결코 이후로 $t7을 사용하십시오.

add $s1 ,$s3,$t1 

추가 $s3 (이는 0) $t1에 (쓰레기입니다), 그리고 미만 7의 경우

ble $s4, 7, bloop 
bloop: 

7 및 지점에 $s4 비교 $s1에 결과 (쓰레기)를 저장 $s4은 0이므로 분기 할 예정이지만 bloop이 바로 뒤에 있으므로 분기가 적용되지 않습니다. 그래서이 (및 레이블)은 아무 것도하지 않기 때문에 잘 삭제되었을 수 있습니다.

srl $t7, $s0, 1 

시프트 $s0 1 개 비트 위치를 떠나 $t7로 저장한다. $s0은 위의 0으로 설정되었으며 0으로 시프트하면 0이 $t7에 저장됩니다.

sltu $t6, $s3, $t7 

(0)과 낮은보다 저장 (0)

add $s1, $t6, $s1 

$s1에 결과를두고, $s1$t6를 추가 $t6 결과 $s3 (0) $t7에 비교 - 이것이 첫 번째 명령은 처음 세 개 이후부터는 의미가있는 명령어입니다. $t6가 zer0했다 그러나, 실제로는 아무것도에게

bgt $s4, 7, continue 
continue: 

목표를 잘 분기 이후로 아무것도하지 않는 또 다른 지점을하지 않습니다.

그래서 지나치게 코드는 무의미하게 선택되지 않은 무의미한 명령처럼 보입니다. 루핑에 대한 설명에도 불구하고 루프가 없습니다. 질문의 제목에도 불구하고 "비트"와 관련된 것은 없습니다.

+0

나중에 일부 값 설정이 엉망이되었습니다. . 루프 하단과 상단 작업, 그들은 큰 코드의 코드 밖으로이 비트 밖에 존재합니다. 계속 (나의 이해에) 나는 엉덩이 루프에서 나를 깨고, orignal lopp에 나를 두는 것이다. 나는 안에있다. 그것은 정상이다. – user1914650

+0

이것은이 코드 블록의 최종 목표입니다. 숫자 0-16의 이진수 표현에서 1의 수를 찾아이를 레지스터 $ s1에 저장합니다. – user1914650