Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Assembly vs C

Başlatan camby, 18 Mart 2010, 17:36:42

camby

Dizideki elemanların (10 elemanlı )küçükten büyüğe dizilmesi istedi ki C 'de bu çok kolay:
#include<stdio.h>
int main()
{
unsigned char a[10],i,c,temp;
for(i=0;i<10;i++)
for(c=0;c<9;c++)
if(a[c]>a[c+1])
{
temp=a[c];
a[c]=a[c+1];
a[c+1]=temp;
}
return 0;
}


Fakat bu kod Assembly'ye çevirildiğinde geri dönüş bu şekilde:

ROM used: 91 words (1%)
RAM used: 23 (6%)
.................... int main() 
.................... { 
0004: CLRF 04
0005: BCF 03.7
0006: MOVLW 1F
0007: ANDWF 03,F
0008: MOVLW 81
0009: BSF 03.5
000A: MOVWF 19
000B: MOVLW A6
000C: MOVWF 18
000D: MOVLW 90
000E: BCF 03.5
000F: MOVWF 18
0010: BSF 03.5
0011: BSF 1F.0
0012: BSF 1F.1
0013: BSF 1F.2
0014: BCF 1F.3
0015: MOVLW 07
0016: MOVWF 1C
.................... unsigned char a[10],i,c,temp; 
.................... //degerleri girilmish kabul ettim 
.................... for(i=0;i<10;i++) 
0017: BCF 03.5
0018: CLRF 2B
0019: MOVF 2B,W
001A: SUBLW 09
001B: BTFSS 03.0
001C: GOTO 058
.................... for(c=0;c<9;c++) 
001D: CLRF 2C
001E: MOVF 2C,W
001F: SUBLW 08
0020: BTFSS 03.0
0021: GOTO 056
.................... if(a[c]>a[c+1]) 
0022: MOVLW 21
0023: ADDWF 2C,W
0024: MOVWF 04
0025: BCF 03.7
0026: MOVF 00,W
0027: MOVWF 2E
0028: MOVLW 01
0029: ADDWF 2C,W
002A: ADDLW 21
002B: MOVWF 04
002C: BCF 03.7
002D: MOVF 00,W
002E: SUBWF 2E,W
002F: BTFSC 03.2
0030: GOTO 054
0031: BTFSS 03.0
0032: GOTO 054
.................... { 
.................... temp=a[c]; 
0033: MOVLW 21
0034: ADDWF 2C,W
0035: MOVWF 04
0036: BCF 03.7
0037: MOVF 00,W
0038: MOVWF 2D
.................... a[c]=a[c+1]; 
0039: MOVLW 21
003A: ADDWF 2C,W
003B: MOVWF 78
003C: CLRF 7A
003D: BTFSC 03.0
003E: INCF 7A,F
003F: MOVLW 01
0040: ADDWF 2C,W
0041: ADDLW 21
0042: MOVWF 04
0043: BCF 03.7
0044: MOVF 00,W
0045: MOVWF 31
0046: MOVF 78,W
0047: MOVWF 04
0048: BCF 03.7
0049: BTFSC 7A.0
004A: BSF 03.7
004B: MOVF 31,W
004C: MOVWF 00
.................... a[c+1]=temp; 
004D: MOVLW 01
004E: ADDWF 2C,W
004F: ADDLW 21
0050: MOVWF 04
0051: BCF 03.7
0052: MOVF 2D,W
0053: MOVWF 00
.................... } 
0054: INCF 2C,F
0055: GOTO 01E
0056: INCF 2B,F
0057: GOTO 019
.................... return 0; 
0058: MOVLW 00
0059: MOVWF 78
.................... } 
.................... 
.................... 
005A: SLEEP


Assembly'de INDF ve FSR kullanırak yazıldığında:
;Pic16f84a kullanığımızı varsayaraktan diziyi 0x0C adresinden başlatıyorum
;Bu program ile 16f84a kullanıldığında 67 adet değişen küçükten büyüğe sıralanabilir


;=======Tanımlanan elemanlar======
	
		CBLOCK		0x0C		;a dizisinin eleman sayısı 67	
		a1				;dizinin ilk elemanın ismi a1 adresi:0x0C
		a2				;0x0D
		a3				;0x0E
		a4				;0x0F
		a5				;0x10
;		....
;		...
		a67				;0x4E
		TEMP				;0x4F
		ENDC

;..................
;...............
;...................


BASLA		movlw		0x0B		;dizinin ilk elemanın bir önceki adresi FSR yazmacına yüklendi
		movwf		FSR

UP		movlw		0x4E		;Hedef
		subwf		FSR,w
		btfsc		STATUS,Z	;dizinin son elemanı kontrol edildi mi?
		GOTO		CIKIS		;dizilim tamamlandı , ÇIKIŞ

		incf		FSR		;dizinin 2 elemanını karşılaştıran bölüm
		movf		INDF,w
		incf		FSR
		subwf		INDF,w
		btfss		STATUS,C	;sıralama doğru mu?
		GOTO		UP		;evet doğru , sıradakine bak
						
		movf		INDF,w		;Yer değişimi yapan bölüm
		movwf		TEMP
		decf		FSR
		movf		INDF,w
		incf		FSR
		movwf		INDF
		decf		FSR
		movf		TEMP,w
		movwf		INDF
		GOTO		UP		;Başa dön

CIKIS 		nop				;işlem tamam , a dizisi küçükten büyüğe dizildi
;............
;..............
;...............


Açıklama: CCS C ile for ve if deyimleri kullanılılarak 10 adet elemanın yerlerini değiştirmek için 90 satır kod üretmiştir , dizilmeye çalışılan eleman sayısı arttığında aynı oranda program kodu uzayacak ve kullanılan ram miktarı artacaktır. 60 eleman bu işleme sokulduğunda ise en az 500 satır yer kaplayacak ki pic'te başka işlemler de yapıldığını düşünürsek çoğu zaman program pic'e sığmayacak.

Aynı işlem bu sefer N kadar elemanın yeri değiştirilerek Assembly ile hazırlandığında dolaylı adresleme kullanılarak yanlızca 23 satır komut ile halledilir. Fazladan sadece tek  Ram adresi kullanılmıştır.

Yorumlarınızı bekliyorum

F493

Selam,

  Optimizasyonlar açıkmı bu işlemleri yaparken.

Esen kalın.

Klein

Bu örnekteki kod
void sirala(void){
	for(i=0;i<10;i++) 
		for(c=0;c<9;c++) 
			if(a[c]>a[c+1]) { temp=a[c]; a[c]=a[c+1]; a[c+1]=temp; }
}


Bu  NC30 derleyicisinin ürettiği  kod.

  191                                  	.glb	_sirala
   192  00000                           _sirala:
   193                                  ;## # C_SRC :		for(i=0;i<10;i++) 
   194  00000  B70000r               Z  	mov.b	#00H,_i
   195  00003                           L1:
   196                                  ;## # C_SRC :			for(c=0;c<9;c++) 
   197  00003  B70000r               Z  	mov.b	#00H,_c
   198  00006                           L13:
   199                                  ;## # C_SRC :				if(a[c]>a[c+1]) { temp=a[c]; a[c]=a[c+1]; a[c+1]=temp; }
   200  00006  330000r               S  	mov.b	_c,A0
   201  00009  C0CC0000r0000r           	cmp.b	_a+1[A0],_a[A0]
   202  0000F  6D16                     	jleu	L25
   203  00011  72CF0000r0000r           	mov.b	_a[A0],_temp
   204  00017  72CC0000r0000r           	mov.b	_a+1[A0],_a[A0]
   205  0001D  330000r               S  	mov.b	_c,A0
   206  00020  72FC0000r0000r           	mov.b	_temp,_a+1[A0]
   207  00026                           L25:
   208  00026  A70000r                  	inc.b	_c
   209  00029  E7090000r             S  	cmp.b	#09H,_c
   210  0002D  6CD8                     	jltu	L13
   211  0002F  A70000r                  	inc.b	_i
   212  00032  E70A0000r             S  	cmp.b	#0aH,_i
   213  00036  6CCC                     	jltu	L1
   214                                  ;## # C_SRC :	}
   215  00038  F3                       	rts	
   216  00039                           E1:
   217  00039                           M1:
   218                                  
   219                                  
   220                                  ;## #	FUNCTION main


Bu da yukarıdaki kodun  açıklamalardan arındırılmış hali


  194  00000  B70000r               Z  	mov.b	#00H,_i
   195  00003                           L1:
   197  00003  B70000r               Z  	mov.b	#00H,_c
   198  00006                           L13:
   200  00006  330000r               S  	mov.b	_c,A0
   201  00009  C0CC0000r0000r           	cmp.b	_a+1[A0],_a[A0]
   202  0000F  6D16                     	jleu	L25
   203  00011  72CF0000r0000r           	mov.b	_a[A0],_temp
   204  00017  72CC0000r0000r           	mov.b	_a+1[A0],_a[A0]
   205  0001D  330000r               S  	mov.b	_c,A0
   206  00020  72FC0000r0000r           	mov.b	_temp,_a+1[A0]
   207  00026                           L25:
   208  00026  A70000r                  	inc.b	_c
   209  00029  E7090000r             S  	cmp.b	#09H,_c
   210  0002D  6CD8                     	jltu	L13
   211  0002F  A70000r                  	inc.b	_i
   212  00032  E70A0000r             S  	cmp.b	#0aH,_i
   213  00036  6CCC                     	jltu	L1

fahri-

Projeniz için en uygunu hangisi ise onu kullanabilirsiniz. Kendinizi illaki bu dili kullanıcam diye sınırlamanıza gerek yok. Bazı projelerde asembler bazı projelerde c kullanabilirsiniz. Bazı projelerimde asembler kullansam sanırım 1 sene de bitiremezdim. :)
Kullanacağımız pic in hafızası yeterli ise asembler ile uğraşmaya değmez diye düşünüyorum.

camby

tabi öle de biri 23 satır biri 560 satır kod üretiyor , hani biyerlerde bi eksiklik yoksa bu işlemlerde , yapay zeka baya geride gibi

ErsinErce

Alıntı yapılan: "Klein"Bu örnekteki kod
void sirala(void){
	for(i=0;i<10;i++) 
		for(c=0;c<9;c++) 
			if(a[c]>a[c+1]) { temp=a[c]; a[c]=a[c+1]; a[c+1]=temp; }
}


Bu kodları birde bu şekilde derler misiniz, sonucunu merak ettim =)

void sirala(void){
	for(i=10;i!=0;i--) 
		for(c=9;c!=0;c--) 
			if(a[c-1]>a[c]) { temp=a[c-1]; a[c-1]=a[c]; a[c-1]=temp; }
}

Klein

C kaynak kod
void sirala(void){	
	for(i=10;i!=0;i--) 		
		for(c=9;c!=0;c--) 			
			if(a[c-1]>a[c]) { temp=a[c-1]; a[c-1]=a[c]; a[c-1]=temp; }
			
}


Derleyici tarafından oluşturulmuş ASM

   194  00000  C70A0000r             S  	mov.b	#0aH,_i
   195  00004                           L1:
   197  00004  C7090000r             S  	mov.b	#09H,_c
   198  00008                           L13:
   200  00008  330000r               S  	mov.b	_c,A0
   201  0000B  7345                     	mov.w	A0,A1
   202  0000D  F2                       	dec.w	A0
   203  0000E  C0DC0000r0000r           	cmp.b	_a[A1],_a[A0]
   204  00014  6D17                     	jleu	L25
   205  00016  72CF0000r0000r           	mov.b	_a[A0],_temp
   206  0001C  72DC0000r0000r           	mov.b	_a[A1],_a[A0]
   207  00022  330000r               S  	mov.b	_c,A0
   208  00025  F2                       	dec.w	A0
   209  00026  72FC0000r0000r           	mov.b	_temp,_a[A0]
   210  0002C                           L25:
   211  0002C  AF0000r                  	dec.b	_c
   212  0002F  6ED8                     	jne	L13
   213  00031  AF0000r                  	dec.b	_i
   214  00034  6ECF                     	jne	L1
   216  00036  F3                       	rts