2017-09-24 6 views
0

제발 도와주세요, 나는이 간단한 문제를 알아 내려고 5 시간 이상을 보냈습니다. 당신의 삶에 대해 어떻게 생각하는지 이해할 수 없습니다.shift를 사용하여 MIPS 어셈블리에서 곱셈을 수행하고 추가하려면 어떻게해야합니까?

나는 7 * 5와 같은 문제를 해결하고 MIPS 어셈블리에서 결과를 반환하기로되어 있지만 shift와 add를 사용하여 수행해야한다. 나는 우리가 주어진 힌트를 MIPS 코드로 변환하는 방법을 이해할 수 없다. 내가 아래 그림이 어떻게 작동하는지 그리고 그 뒤에있는 논리를 100 % 이해하고 있지만, MIPS 어셈블리 코드로 변환 할 수는 없지만, 5 시간 이상을 할애했다. 내가 MIPS의 작품을 추가하는 방법을 이동 작품, 내가 이해하는 방법을 이해

here is what we were given as a hint

은, 난 그냥 MIPS의 어셈블리 언어로, 그 이미지에 표시됩니다 무엇을 할 수 방법을 모르겠어요. (나는 영어를이 코드로 변환하는 방법을 모른다 .MIPS는 너무 베어 본다.)

나는 분명해야한다! : 두 숫자는 가변이다. 나는 매번 두 개의 다른 수를 취하고 결과를 얻는 코드를 쓰는 방법을 모른다. shift와 add를 사용한다. 7 * 5, 6 * 9, 17 * 3 등 사용자가 두 숫자에 대해 입력 한 값이 음수가 아닌 한 코드는 결과를 가져와야합니다.

+0

강사에게 질문해야하는 질문입니다. 'sll'과'addu'는 MIPS에서 사용하기 쉽습니다. 어셈블리 언어의 기본 개념을 설명 할 사람을 물어 보는 것 같습니다. 이 질문에 대한 stackoverflow 형식에 맞는 좋은 대답을 가질 가능성이 있다고 생각하지 않습니다. –

+0

질문을 다시 읽어야한다고 생각합니다. 나는 내가 분명히 말했듯이 두 가지 명령을 사용하여 곱셈을하는 더 큰 문제를 번역하는 방법을 잘 알고있다. 왼쪽으로 시프트하면 기본적으로 시프트 할 때마다 숫자가 2 씩 증가합니다. 문자 그대로 추가하면 숫자가 추가되고 새 레지스터에 저장됩니다. 이제는 숫자를 함께 곱하는 방법을 사용합니다. 이미지에서 알 수 있듯이 MIPS 어셈블리 코드에서이를 표현하는 방법을 모르겠습니다. –

+0

7 * 4 ='li $ t0,7' (또는 의사 명령이없는 이유가 있다면'addi $ t0, $ zero, 7')'sll $ t0, $ t0, 2' ..yaaay,'t0 = 28'. (바이너리't0 = 00000111','sll' 다음에 :'t0 = 00011100' = 오래된 값을 2 비트 씩 왼쪽으로 이동). – Ped7g

답변

1

1 학년 학교에서 우리는 a * (b + c) = ab + ac라는 것을 알게 되었습니까? 따라서 7 * 5 = 7 * (4 + 1) = 7 * 4 + 7 * 1 둘 다 2의 멱승 ... (2^2 및 2^0)입니다.

상수가 아니라면 중요합니까?

우리가 초등 학교에서 배운 것과 동일한 것들은 efgh가 0 또는 1 인 것처럼 훨씬 단순합니다. 따라서 h 비트 (비트 0)에 ​​g 비트가 설정되면 (abcd < <) abcd를 더한 다음 abcd를 추가하십시오. < < f가 설정되면 1 (비트 2) abcd < < 2를 추가하십시오. .

실제로 당신은 그것을하는 법을 알고 /하지 않았습니다. 단지 초등학교와 같은 연필과 종이는 5 시간을 보내는 이유 ... 표시된 노력

편집

unsigned int a,b,x,y; 
for(y=0,x=0;x<32;x++) if(a&(1<<x)) y+=b<<x; 


for(y=0,x=1,z=b;x;x<<=1,z<<=1) if(x&a) y+=z; 
+0

2 x 2를 할 때 이것은 저에게 효과적이지 않습니다. 10이 2이면 2로 끝납니다. 문제를 해결하려고하면 10 + (10 << 1)이됩니다. 그게 4가 아닌 6이 될 것입니다. –

+0

@dmscs 1 * (10 << 1) + 0 * (10 << 0) (각 이동 된 값 (2의 거듭 제곱))을 0으로 곱하거나 1, 해당 비트가 설정되어 있는지 여부에 따라 승수 (여기서 1 * 및 0 * 양식을 두 번째 값의 원래 "10"). * 0 및 * 1 곱하기없이 어떻게 해야할지 명확하다. – Ped7g

+0

@dmscs 두 번째 피연산자 비트가 각각 설정되었다고 가정하면 누적기에 추가 한 2 * 3이 아니라 2 * 2가됩니다. –

0

, 여기 주요 스포일러를 넣어하지 않습니다,하지만 당신은 아마 당신이 한 번, 그것을 후회합니다 당신이 솔루션 주위에서 어떻게 돌아가고 있는지 알게 될 것입니다. 이 내부적으로 어떻게 작동하는지, 그것은 이진 값으로, 첫 번째 논문에 해독 시도 등등, 큰 "A"/ "B"값을 오버플 물론

s0 = a, s1 = b, s2 = 0 (will be result) 
multiply_loop: 
    if (s1 == 0) goto output_result 
    t1 = s1&1 
    if (t1 == 0) goto skip_add 
    s2 += s0 
skip_add: 
    s0 <<= 1; multiply "a" by 2 
    s1 >>= 1; shift bits of "b" to right by 1 for s1&1 test 
    goto multiply_loop 

output_result: 
    s2 is result of multiplication 

.

+0

이해하지만 mips로 변환했을 때 작동하지 않는 것 같습니다. https://pastebin.com/KN7kP9u3 2 * 5를하면 결과가 –

+0

입니다. https://pastebin.com/qFx7iuUs 죄송합니다. 두뇌가 너무 튀었습니다. 나는 이전 버전에서 이것을 입력했기 때문에 실수를했습니다. . 이것은 지금과 같은 모양이며, 나는 여전히 5 * 2 = 5의 잘못된 답을 얻습니다. –

+0

예, 이것이 코드의 기능입니다.원본 값이 아닌 이동 값을 결과에 추가해야합니다. 각각의 루프는 값이 점점 더 이동하므로 's0'는 (a << (i-1))와 같고 * s *는 항상 a와 동일하게 유지되는 * i * 번째 루프에서 s0는 동일하게 유지됩니다. MARS 또는 SPIM에서 시스템 호출로 판단하면 두 가지 모두 디버거를 사용할 수 있습니다. 값을 잠시 바라보고 있으면, s2 = 0 + 5 인 s2 = s2 + s3이고, 그 순간 s0은 10과 같습니다. 디버거에서 코드를 통해 단일 단계 만 수행하면 모든 것을 볼 수 있습니다. 당신은 주요 아이디어 (a * = 2)를 놓쳤습니다. – Ped7g