2012-10-18 5 views
1

임 2 개의 8 비트 숫자를 곱해서 255보다 큰 결과를 얻기 위해 16 비트 위치에 저장하려고합니다.이 작업을 수행하는 가장 빠른 방법은 이동을 통한 것입니다.이 작업은 rrcf 함수를 통해 구현하려고했습니다 bcf를 사용하여 원하지 않는 반송을 제거합니다.빠른 8x8bit 곱하기 어셈블리 pic18

이것은 ive가 생각해 낸 것입니다. Ive는 모든 코드에 대해 의견을 말하려고 했으므로 내 사고 프로세스를 볼 수 있습니다. 임 : PIC18 및 ASM 프로그래밍 전반에 상당히 새로운 내용. (잘하면) 도움을 줄 때 염두에 두시기 바랍니다. 내가 MPLAB SIM을 실행할 때, 내가 가지고있는 것보다 더 좋은 자리에 들어갈 필요가 있습니다. 카운터를 모두 내리면됩니다.

이것은 반복적으로 테스트되는 곱셈기의 마지막 비트로 인해 발생한다고 생각합니다. 따라서 0이 될 것이므로 매번 더하기 명령을 건너 뜁니다. 비트 0-7에서 점진적으로 BTFSC를 이동하는 루프를 만들 수 있습니까? 나는 이것이 문제라고 생각한다. 그러나 나는 코드를 이해할 수 없다. 나는 essentailly 주 8 시간을 쓸 수 있지만, 메신저는 코드 공간을 저장하려고

  LIST P=18F4550 
      #include <P18F4550.INC> 

      ;equates 
      counter equ 0x00 ;set counter 
      multiplicand equ 0x01 ;set multiplicand 
      multiplier equ 0x02 ;set multiplier 
      resultHigh equ 0x03 ;set resultHigh 
      resultLow equ 0x04 ;set resultLow 

      ;test program 

      movlw d'100' ;move literal d'100' to wreg 
      movwf multiplicand ;set multiplicand 
      movlw d'400'  ;move literal d'400' 
      movlw multiplier ;set multiplier 
      movlw d'8'   ;counter 
      movwf counter  ;set counter 

      main: 
      btfsc multiplier, 0   ;test LSB if 0,skip next if 0 
      addwf multiplier, resultLow ;add if 1 to resultLow 
      bcf STATUS,C     ;clear carry flag 
      rlcf multiplier    ;rotate multiplier left 
      bcf STATUS,C     ;clear carry 
      rlcf resultLow    ;rotate resultLow w/ carry 
      rlcf resultHigh    ;rotate resultHigh 
                    ;w/carry from resultLow 

      decf counter     ;dec counter 
      goto main     ;repeat for 8 bits 
      end 

답변

0

가이 코드에 대한 몇 가지 이상한 것들 :

  1. 당신이 결코 multiplicand를 사용하지 않는, 그래서 어떻게 번식 가능성이 당신에 의해 수 그것? addwf multiplier, resultLow을 작성할 때 복사하여 붙여 넣기 오류가 발생 했습니까? 당신이 두 숫자의 곱 대신 하나의 숫자의 제곱을 계산하기를 원하지 않는 한, 모든 논리에 의해 multiplicand이되어야합니다.

  2. 당신이 비트를 확인해야로서 의미가 multiplier의 최하위 비트를 테스트,하지만 당신은 영원히 0으로 그 비트를 회전, multiplier 왼쪽으로 이동. 보이지 않는다. 가장 오른쪽 비트를 확인하거나 오른쪽 시프트를 수행해야합니다.

  3. 결과에 변화가 추가 된 후에 발생합니다. 예를 들어 1을 1과 같이 8 비트 숫자 대신 1 비트 숫자를 곱하고 제품에서 1을 예상한다고 가정합니다. 결과에 1을 더한 다음 결과를 왼쪽으로 이동합니다. 이것만으로도 제품에서 2를 얻을 수 있습니다. 어떻게 그럴 수 있지? 전환과 추가 순서를 뒤집는 것은 어떻습니까?

  4. 내가 볼 수있는 방법 루프 완료 counter 내가 당신의 CPU에 익숙 해요 있지만, 그것은 당신이 counter을 감소하고 무조건 main에 다시 뛰어 나에게 보이는 0에 도달합니다. 이것은 조건부 점프가되는 이유는 무엇입니까?

다음 의사 코드

곱셈이 수행해야하는 방법을 보여줍니다

multiplier = multiplier_value 
multiplicand = multiplicand_value 

counter = 8 
resultLow = 0 
resultHigh = 0 

main: 

carry = 0 
shift left: carry <- resultLow <- carry 
shift left: carry <- resultHigh <- carry 

carry = 0 ; you don't need to zero it here, actually 
shift left: carry <- multiplier <- carry 

if carry = 0, goto no_add 

carry = 0 
resultLow = resultLow + multiplicand + carry 
resultHigh = resultHigh + 0 + carry 

no_add: 

counter = counter - 1 
if counter ≠ 0, goto main 
+0

승수와 피승수를 절대 추가하지 않으면 결과를 추가하기 만하면됩니다. 특히 바이너리로. 1001X1101 – matt

+0

이 있다면 1101 + 00000 + 110100 + 110100을 함께 쓰십시오. – matt

+0

몇 가지 바실리카 실수를 저질 렀지 만, 나는 무엇을 바꿀지 알아낼 수 없습니다 !!!! – matt

3

실제로 PIC18 ASM 지원 단일 CPU 사이클 8 * 8 unsign 하드웨어 곱셈.

MOVLW 100 
    MOVWF multiplicand 
    MOVLW 33 
;multiply multiplicand with WREG 
    MULWF multiplicand 
;product is stored in registers PRODH:PRODL