2012-04-11 31 views
5

Bunu doğru anlıyorsam, program sayacı yürütülecek komutun adresini gösterir ve çoğu durumda bir sonraki yönerge adresine ilerlemek için program sayacına dörde eklersiniz. Ancak, bir kelimeye işaret eden bir program sayacınız var mı (ör. 15), bir sonraki talimatı ilerletmek istiyorsanız, bir sonraki talimatı almak için doğrudan 15'e 4 eklemeniz var mıdır? Herhangi bir açıklamaProgram Sayacı?

cevap

6

Takdir edilecektir. Bu şey talimat işaretçisi olarak adlandırılır. İşlemcinin mevcut komutun kodunu çözmesi durumunda, ne kadar bayt içerdiğini bulur ve mevcut talimat işaretçisine ne kadar değer katacağını bilir, böylece mevcut komut çalıştırıldığında işlemci bir sonraki işlemin ne olacağını bilir.

Örneğin, işlemci örnekte olduğu gibi 15 yönergesini saklayan yönerge işaretçisi ile başlar - bu adreste ne olduğuna bakar, 5 bayt işgal eden bir komut olur, sorun yok - 5'e ekler. akım değeri ve bu 20'yi verir ve böylece yönerge göstergesi şimdi 20 değerini depolar ve işlemci daha sonra mevcut komutu yürütür.

+1

Örneğiniz mantıklı, ancak eklediğiniz şey bu adresteki neye bağlı olarak PC + 4 nereden geliyor? – Ockham

+1

@ user28694: Bu, bir işlemciye bağlı olacaktır. Bazı işlemciler, tüm talimatların aynı uzunlukta olduğu talimat setine sahiptir, böylece kayıtsız şartsız +4 olabilirler. Bazı işlemciler değişken uzunluktaki talimatlara sahip olacaklar ve talimatın ilk baytını kullanarak hangi komutları ele aldıklarına karar verecekler. – sharptooth

+0

[32 bit uzunluğundaki tüm MIPS yönergeleri] değil (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

Program sayacını hiçbir zaman doğrudan ilerletemezsiniz - Programınızı yürüterek CPU sizin için yapar. Programlayıcı olarak, program sayıcısını çeşitli atlama yönergelerini (koşullu, koşulsuz, alt yordamlara atlar, vb.) Yürüterek gerçekleştirirsiniz. Program sayacına bir ofset eklemeniz gerektiğinde belirli bir durum, konum bağımsız kodunda şubeniz olduğunda ortaya çıkar. Bununla birlikte, bu durumda bile, komutun boyutunu program sayacına eklemezsiniz: bunun yerine, "göreli adrese bir şube" yürüterek atlamak istediğiniz yerin ofsetini sağlarsınız.

+0

Mutlak adres 0x4000'de bulunan uygulama koduna atlayacak bir bootloader yazarken ne dersiniz? Bu durumda program sayacını mutlak adrese doğrudan değiştireceğiz. – eepty

+0

@eepty İkinci cümlenin söylediği de budur: bir kayıt talimatı ile değil, bir atlama talimatı ile yapıyorsunuz. – dasblinkenlight