2013-08-17 1 views
1

안녕하세요, 나는 변이 부분에 대해 정말로 혼란스러워합니다. N에 의한 왼쪽 쉬프트가 2^N의 결과를 산출한다는 것을 이해 합니다만, 어떻게 승수를 왼쪽으로 이동하고 피승수를 오른쪽으로 이동시키면서 2의 곱을 얻는가 ?? 어떻게 승수와 피승수를 이동하면 두 결과가 생깁니 까?

다음은 콘솔에서 입력 된 두 숫자의 제품을 계산하는 코드이다 :

.data 

string1: .asciiz "Enter multiplier : " 
string2: .asciiz "\nEnter multiplicand : " 

.text 

li $s0, -1 

la $a0, string1 
li $v0, 4 
syscall 

li $v0, 5 
syscall 

move $a0, $v0 
bltzal $a0, Negate 
move $t0, $v0 

la $a0, string2 
li $v0, 4 
syscall 

li $v0, 5 
syscall 

move $a0, $v0 
bltzal $a0, Negate 
move $t1, $v0 



li $t2, 1 
li $t3, 0 

loop: 

andi $t5, $t1, 1 

bnez $t5, addPartial 

shift: 
sll $t0,$t0,1 
srl $t1,$t1,1 
bgtz $t1, loop 


done: 

beqz $s0, negative_answer 
bgtz $s0, positive_answer 
bltz $s0, positive_values 

Negate: 

addiu $s0, $s0, 1 
negu $v0, $a0 
jr $ra 

addPartial: 
addu $t3, $t3, $t0 
j shift 

positive_answer: 
move $a0, $t3 
li $v0, 1 
syscall 

li $v0, 10 
syscall 

negative_answer: 

negu $t3, $t3 
move $a0, $t3 
li $v0, 1 
syscall 

li $v0, 10 
syscall 


positive_values: 
move $a0, $t3 
li $v0, 1 
syscall 

li $v0, 10 
syscall 

답변

1

I MIPS의 명령어 세트에 익숙하지. 또한 칭찬이 부족하여 제 답변이 그럴 수있는 지점이 아니라 어쨌든 여기에 있습니다.

7과 11 또는 0111b와 1011b를 곱하기를 원합니다. 이것은 다음과 같이 재 작성 될 수 있습니다. * 1,011

1 + 10 * 1011 + 100 * + 0,000 1,011 * 1,011 = * 1,011 1 + 1 × 10110 + 1 × 1,011,000 + 0 *

10,110,000 그렇다면와

shift right the multiplicand 
collect the bit pushed off 
add the multiplier to the answer if this bit is 1 
shift left the multiplier 
repeat until finished 

또는

check LO bit of multiplicand 
add the multiplier to the answer if this bit is 1 
shift left the multiplier 
shift right the multiplicand 
repeat until finished 

임의로 큰 곱셈의 답을 계산할 수 있습니다.

이 질문에 대한 답변을 보내주십시오.