goto ile call arası fark

Başlatan kemalguler, 08 Ekim 2008, 13:35:41

kemalguler

Arkadaşlar,
asm programını anlatan kitaplarda goto komutunun mümkün olduğunca kullanılmaması tavsiye ediliyor.Aşağıdaki prg parçasında 2 si arasında ne fark vardır.Veya program çalırken ne gibi olumsuzluklar yaşanabilir?
*******************
.
.
   btfss    portb.0
   goto   ETIKET1
    bcf      portb.1
.
.
*******************
.
.
   btfss    portb.0
   call   ETIKET1
   bcf      portb.1
.
.
************
Şimdiden teşekkür ederim.

Logan

@kemalguler, "goto" ile "call" komutları birbirinden çok farklıdır. "goto" komutu ile belirlediğin etikete dallanır ve programı oradan itibaren devam ettirirsin. Fakat "call" da durum biraz daha farklıdır. Program, bu komutun kullanıldığı satırı kaydeder ve alt programa dallanır. Fakat program buradan devam edemez. Mutlaka "return" ile geri dönmek zorundadır. Geri döndüğünde ise kaldığı yerden devam eder. Kısacası "goto" komutu ile programın akışını değiştiririz, "call" ile kaldığımız yere geri döneriz. Assembler için "call" komutuna verilebilecek en güzel örnek delay rutinleridir.Umarım açıklayıcı olmuştur.
İmza.

Gurkan-Demirbas

GOTO:
Y departmanında çalışan bir işçiye; "sen artık Z departmanına tayin oldun ve orada ne denirse onu yapacaksın" demek

CALL:
Aynı işçiye "Z departmanına gidiyor ve oradaki işleri yapıyorsun ve de işlerin biter bitmez buraya dönüp işine devam ediyorsun" demektir

GOTO'da program akışı direk olarak verilen adresten itibaren işletilmeye alınır; ama CALL'da, Program Counter değeri stack'e atılır ve program akışı ilgili aderese dallanır ve de ne zaman RETURN komutuna rastlanırsa Stack'te bulunan adres, tekrar Program Counter'a yüklenerek kaldığı yere yani CALL komutundan sonraki komutla akışa devam edilir.

İşlemcilerde Stack'in boyutu farklı olabilir; dolayısı ile derinlemesine (içiçe) CALL kullanımı sınırlıdır, 16F serisinin çoğunda max 8 adet içiçe CALL kullanılabiliyor, çünkü stack 8 level'dır.

CALL genelde, program içerisinde 1'den fazla kullanılacak olan fonksiyonun; tek seferde yazılıp 1'den fazla çalıştırılabilmesine olanak sağlar. GOTO ise belirli bir karşılaştırma sonrası, karşılaştırma sonucuna bağlı olarak program akışının değiştirilmesi için kullanılır. (En azından ben böyle kullanıyorum)

GürkaN

XX_CİHAN_XX

Alıntı yapılan: "kemalguler"Arkadaşlar,
asm programını anlatan kitaplarda goto komutunun mümkün olduğunca kullanılmaması tavsiye ediliyor.........
Arkadaşlar goto ve call komutlarını çok güzel açıklamışlar.
Bende bu sözüne karşın, böyle hurafelere inanma ve kafanı takma diyorum  :)
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Tagli

Benim bildiğim bu "GOTO kullanmama tavsiyesi" üst seviye diller için geçerli. GOTO kullanmadan ASM'de kod yazmak adeta imkansız gibi.
Gökçe Tağlıoğlu

XX_CİHAN_XX

Açıkcası kendi kişisel görüşüm tabi,
Hangi programlama dili olursa olsun GOTO bir nimettir bana göre  :)
Düşünsenize mesela C de iç içe döngülerin içinden pat diye çıkıvericeksiniz bunun GOTO dışında mantıklı bir yolu bildiğim kadarıyla yok. Yada bir döngü yada koşulun içinden alt satırlarda başka bir noktaya sıçramak gerektiğinde olmaz GOTO iyi birşey değil ben o uzak noktayı bir şekilde yakınlara taşıyım diye mi cebelleşicez. Bence bunlar gereksiz.
Sonuçta C deki GOTO derlendiğinde ASM deki GOTO dan bir farkı olmuyorki tıpkı diğer bütün komutların ASM ye dönüştüğü gibi...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

OG

goto yu bırakın, dikkatli kullanıldıkça gosub bile problem değil, sayısız kullanıyorum.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mucit07

asm gotosuz olmaz  bundan 4 sene once süper asmciydim goto ile dongü kurulur. call gelince call bir alt programa dallanır orada işini yapar kaldıgı satıra ana programa gelir  olay budur. ancak c dilinde goto kullanılması  tavsiye edilmez cünkü programın akıcılıgı bozulur. goto dallanmaklada bazı istenmeyen baklar olusur. ben bu şekilde biliyom

XX_CİHAN_XX

Bu olay bence tamamen goto yu kullanan yani programı yazan kişiye bağlı.
Goto yu doğru yerde ve gerektiğinde kullanmaktan kaçınılmamalı bence.
Dolayısıyla böyle bir intiba oluşturmak bence yanlış.
Adamlar bu komutu kullanalım diye yapmışlar :)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

controller

fonksiyonun veya altprogramın sonuna kadar gitme zorunluluğu yoksa return veya ret ile istediğiniz yerinden dönebilirsiniz. goto ile sonuna kadar gitmeye gerek yok.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

CLR

Alıntı yapılan: "XX_CİHAN_XX"Açıkcası kendi kişisel görüşüm tabi,
Hangi programlama dili olursa olsun GOTO bir nimettir bana göre  :)
Düşünsenize mesela C de iç içe döngülerin içinden pat diye çıkıvericeksiniz bunun GOTO dışında mantıklı bir yolu bildiğim kadarıyla yok. Yada bir döngü yada koşulun içinden alt satırlarda başka bir noktaya sıçramak gerektiğinde olmaz GOTO iyi birşey değil ben o uzak noktayı bir şekilde yakınlara taşıyım diye mi cebelleşicez. Bence bunlar gereksiz.
Sonuçta C deki GOTO derlendiğinde ASM deki GOTO dan bir farkı olmuyorki tıpkı diğer bütün komutların ASM ye dönüştüğü gibi...

Merhaba,

@XX_CİHAN_XX
C'de break komutu ile pat diye döngü içlerinden çıkabilirsin.

@kemalguler
Goto ve call için ise,
Aradaki farkları arkadaşlar söylemiş,

Fakat asm'de uzun bir program yazıyorsanız çoğu şeyi goto'dan çok call ile yapılır çünkü tekrar eden routine kullanmak kolaydır ve program verimli (programın yer kapladığı alan küçük olacaktır) olur. (bu yapıya ben C benzeşimli asm diyorum, altprogramlar + macrolar) PIC16 serisi için söylüyorum, 8 derinlikli bir stack var dolayısıyla iç içe call sayısı sayılması gerekir. Bu sayı aşılırsa işlemcinin kitleneceği veya saçmalayacağı kesin. Dolayısıyla iç içe çok sayıda call kullanmak ta sakıncalı.

Sonuç olarak nerede neyi kullanacağını biliyorsan istediğini istediğin kadar kullanabilirsin.
Knowledge and Experience are Power

XX_CİHAN_XX

Alıntı yapılan: "XX_CİHAN_XX"
........
Düşünsenize mesela C de iç içe döngülerin içinden pat diye çıkıvericeksiniz bunun GOTO dışında mantıklı bir yolu bildiğim kadarıyla yok. .......
Alıntı yapılan: "eemkutay"
@XX_CİHAN_XX
C'de break komutu ile pat diye döngü içlerinden çıkabilirsin.

Hocam dikkat ederseniz iç içe döngü dedim.
Break ile sadece bulunduğunuz döngünün dışına çıkabilirsiniz.
İçinde bulunduğunuz tüm döngülerin dışına pat diye çıkılımıyor  :)

Alıntı yapılan: "eemkutay"
Sonuç olarak nerede neyi kullanacağını biliyorsan istediğini istediğin kadar kullanabilirsin.

Benimde anlatmaya çalıştığım şey bu zaten hocam. Yani boşuna C de veya basic de vb. goto kullanmak zararlıdır felan gibi şeyler görüyorum sağda solda. 10 yıllık C kullanıcısı değlim ama mantıklı olarak yaklaştığımızda 2x2=4 gibi bir sonuç çıkıyor. Buda sizin son söylediğiniz cümle oluyor. Baksanıza üst seviye programlama dilleri için söylenen bu sözün bu başlığı açan arkadaşımız asm için söylendiğini görmüş ve kafası karışmış. Yani bu tarz söylemler bana gerek boş yere kafa karışıklığı yapıyor hepsi bu  :)
Saygılar, sevgiler
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Merhaba,

@XX_CİHAN_XX
Doğru haklısın, iç içe loop'larda C'nin "goto" keyword ile çıkılır. Yorumunda iç içe loop olayını kaçırmışım hemde sen C'de yeni olduğun için belki "break" keyword'unu bilmiyorsundur diye yardımcı olmak istedim.

Kolay gelsin
Knowledge and Experience are Power

Tagli

Aslında bir yerde (veya birinden, tam hatırlamıyorum) döngüden çıkmanın hatalı bir programlama tekniği olduğunu duymuştum. Söylendiğine göre döngünün devam şartı iyi yazılırsa döngüden break vs. ile çıkmaya gerek kalmazmış. Ama ben bu görüşe katılmıyorum, kendim de döngüden çıkmayı sık sık kullanırım. Program etkin olarak çalıştıktan ve kod da anlaşılır olduktan sonra gerisinin pek de önemi yok.

Dipnot: Diğer dillerde var mı bilmiyorum ama Fortran'da döngülere isim verilebiliyor ve tek bir exit (break'in Fortran'da karşılığı) ile en dıştaki döngüden bile çıkılabiliyor.
Gökçe Tağlıoğlu