2014-02-25 3 views
0

이것은 숙제에 문제가 있지만 완전히 난처하게 보입니다. 이러한 문제는 솔직한 해결책을 가져야하며 선생님이 실수로 이런 문제를 만들었을지 궁금합니다. 그러나 정확한 텍스트는 다음과 같습니다MIPS 어셈블리 코드 - 메모리의 8 비트 시프트 수를 사용하여 왼쪽으로 쉬프트

"메모리 위치 0x10010012에 저장된 8 비트 시프트 수에 따라 메모리 위치 0x10010010과 0x10010011의 16 비트 내용을 논리적으로 시프트하려면 LSHIFT라는 프로그램을 작성하십시오."

여기 내 문제입니다. 논리적으로 비트를 이동하기 위해서 MIPS는 두 가지 명령 만 가지고 있습니다 : 즉, sll은 즉각적인 값 (따라서 사용할 수 없습니다)과 sllv는 레지스터에 저장된 값을 취하지 만 5 비트만을 사용합니다. 즉, sllv를 사용하면 비트를 최대 32 개 (2^5)까지만 이동할 수 있지만 문제는 256 자리 (8 비트 시프트 수의 경우 2^8)로 이동할 프로그램을 작성하기를 원합니다. 나는 단지이 문제를 두 가지 방법으로 생각할 수 :

1) 대신

2) (8 개 별도의 지침을 8 개 조각으로 8 비트 숫자를 끊고 실행 곱셈을 사용하여 예를 들어, 시프트 카운트가 256 인 경우, 왼쪽 시프트 32 배, 8 배).

또 다른 메모리 위치로 비트를 이동할 수 있는지 다시 확인하고 싶습니다. 맞습니까? 아니면 32 비트, % 4 메모리 주소로 제한되어 있습니까? 예를 들어, 비트 수가 메모리 공간의 동일한 32 비트로 제한되기 때문에 카운트 11111의 5 비트 시프트는 카운트 11111111의 8 비트 시프트와 동일합니까?

내가 잘못한 것이 있으면 간단히 말해야한다. 왜냐하면 내가 말했듯이 간단한 해결책이 있어야하기 때문이다.

+0

레지스터가 16 비트 이상 왼쪽으로 이동했는지 어떻게 알 수 있습니까? (그리고 정확히 곱셈을 사용할 계획입니까?) 나에게 이것은 이름이 떨어지는 것처럼 들립니다. –

+0

그건 내 질문의 일부 였어. 차이가 있는지 물어 보았습니다 (메모리 공간의 크기보다 더 크거나 작은 비트 시프트 사이에서). 귀하의 의견에서 나는 당신이 말할 수 없다고 가정하고 나는 sllv 명령을 사용할 수 있습니다. 또한, 가치가있는 부분에 대해서는 시프트를 곱셈으로 대체하려고합니다. 각 비트 시프트마다 두 번씩 곱하면됩니다. – Bobazonski

답변

1

sllv은 32 비트 레지스터 중 하나를 선택하기 위해 5 비트를 사용합니다. 거기에서 그 레지스터의 5 비트로 제한되지 않습니다.

이것 좀 봐 :

.text 
main: 

    addi $t0 $zero 1 
    addi $t1 $zero 30 
    sllv $a0 $t0 $t1 

    li $v0 1 
    syscall 

    jr $ra 

출력 1073741824 또는^30 2.