Assembly ÇARPMA İSLEMİ yardım :(

Başlatan picpro, 11 Kasım 2014, 01:31:27

picpro

Arkadaslar Herhangibir sayıyı  2 ile carpabiliyorm (a*2) ( asagidaki kodlar)  fakat 2 sayıyı nasil birbiriyle carpıcaz (a*b)  yardımcı olrmsnz    :-\

(a*2)

void main()
{
asm{
  setup:
BSF STATUS,RP1
BSF STATUS,RP0
CLRF ANSEL
CLRF ANSELH
BCF STATUS,RP1
CLRF TRISC
MOVLW 0XFF
MOVWF TRISA
MOVWF TRISB
BCF STATUS,RP0
TEKRAR:
RLF PORTA,w
MOVWF PORTC
GOTO TEKRAR

}

}
----------------------------------------------------------------------------------
(a*2) dolaylı adresleme ile

void main()
{
asm{
  setup:
BSF STATUS,RP1
BSF STATUS,RP0
CLRF ANSEL
CLRF ANSELH
BCF STATUS,RP1
CLRF TRISC
MOVLW 0XFF
MOVWF TRISA
MOVWF TRISB
BCF STATUS,RP0
TEKRAR:
MOVLW 0X25
MOVWF FSR
MOVF PORTA,w
MOVWF INDF
INCF FSR,f
MOVF PORTB,w
MOVWF INDF
MOVF INDF,w







GOTO TEKRAR

}

}
gerisine aklım ermiyo :(

Kabil ATICI

bu işlem birkaç şekilde yapılabilir;
a ve b sayıları için
a sayısı b kere toplanabilir.
yalnız sonucun 2 baytlık bir sayı olacağı göz önüne alınmalı..

       baştan b 0 ise sonuç sıfır
        b 1 ise sonuç a olacak.
          a1=0
          b 1 azalt
dongu1:
          a1=a1+a
          b '1 1 azalt sıfır değilse dongu1 gite
          sonuç a1'de (muhtemelen 2 bayt.)
sorunu dön b kez döngüye girmesi

diğer yöntemde (ister bitleri tek tek kontrol eder döngü ile yaparsın, ister her biti tek tek kontrol eder yapasın. işlem elle çarpma yapmak ile aynıdır. Sadece bit bazında yapmak gerekir.

      baştan b 0 ise sonuç sıfır
      b 1 ise sonuç a olacak.
      a1=0  sonuç
      a2=0
;1.bit
    b bit 0 1 mi 1 ise
     a1=a
;2.bit
      b bit1 1 mi? 1 ise
      a2=1
      a2 sola kaydır
      a1=a1+a2
;3.bit
      b bit2 1 mi? 1 ise
      a2=a
      a2 sola kaydır
      a2 sola kaydır
      a1=a1+a2
;4bit
      b bit3 1 mi? 1 ise
      a2=a
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a1=a1+a2
....
;8bit
      b bit7 1 mi? 1 ise
      a2=a
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a2 sola kaydır
      a1=a1+a2

sonuç a1, muhtemelen 2 bayt...
döngülü veya alt alta yapmanın farkı süre ve program belleğidir.
alt alta yapıldığında fazla program belleği harcar ama hızlı çalışır,
döngü ile yapıldığında süre yavaş program belleğinde daha az yer kaplar.

örneğin çarpım sonucu 8 bit kalacağı düşünülerek
; "toplam"="sayi"x"defa" işlemi için tanımlıyoruz
        movfw sayi
CarpimDongu
       addwf toplam,f
       decfsz defa
       goto CarpimDongu


başka bir örnek
http://www.robot.metu.edu.tr/dosya/asm_tut_1.pdf

ek bölme işlemi için.
http://www.robot.metu.edu.tr/dosya/asm_tut_2.pdf
ambar7

camby

komut setinde çarpma işlemi olmayan bir MCU'da a*b için  a sayısını kere kendinle toplamak en kolay yol.

Fakat bu durumda sayılar büyüdükçe işlem uzayacaktır, örneğin 1 * 1000 dediğinizde, bir döngü 1000 kere dönecektir sonuç üretebilmek için.

Çarpma işlemi olan komut setinde zaten sorun yok, çarptırıp sonucu başka bir register'dan okunuyor.

Çarpma işlemi olmayan MCU'da daha kısa yolları da var bu işin, 2 sayı birbiri üzerine kaydırılınca yanlış hatırlamıyorsam 8 yada 16 döngüde sayının büyüklüğü ne olursa olsun çıkıyordu sonuç, Microchip notlarında da olması lazım bunun.

Tabi bu işler biraz eskide kaldı : )