İkili / Hex'den Montaj Talimatı setlerine tam olarak nasıl gidiyoruz?


13

Bu yüzden son zamanlarda biraz burada Gömülü / Montaj programlarını öğrenmeye çalışıyorum ve en düşük seviyeyi (kapılar ve benzeri) öğrenmeye çalışıyorum.

Bir şey beni olsa bulmaca .... nasıl "almak" talimat setleri olduğunu. Ben kapıları / TTL ve böyle çalışır nasıl biraz anlıyorum, ama ben mov, add, clr vb ... almak nasıl görmüyorum?

Muhtemelen aptalca bir soru ... ama ilk mikro işlemcilere / denetleyicilere geri dönüp düşünüyorum ... bir talimat setini tam olarak nasıl tasarladılar ve çalışır hale getirdiler?

edit: Clarity için sanırım, ilk mikroişlemci hakkında konuşurken im gibi davran, İkili aslında bir Komut Seti oluşturmak için nasıl gitti?


2
Her komutun bir değeri vardır, derleyici kodunuzu nasıl yapılandırıldığına bağlı olarak kodunuzu bu talimatlara dönüştürür.
Ramhound

1
Sorunuzu mükemmel bir şekilde anladığımdan emin değilim, ancak cevabınızı burada , burada veya burada bulabilirsiniz .
e-MEE


3
İkili programdan aslında bir Öğretim Kümesi oluşturmaya nasıl geçtiler? Aslında, "onlar" olmadı - en azından genel olarak, tam tersi. CPU tasarımcıları, CPU'nun gerçekleştireceği işlemleri belirler, daha sonra bundan talimat setini oluştururlar ve ardından talimatları (anımsatıcılar) opcodes (ikili makine kodu) ile eşlerler. @Scott Whitlock aşağıda iyi bir cevap verdi, sadece sorunuzun son kısmına değinmek istedim çünkü en azından benim tecrübelerime göre varsayımınız geri döndü.
Radian

1
Bu gerçekten güzel kitap: www1.idc.ac.il/tecs bana her şeyi açıkladı, bölümlerin çoğu çevrimiçi ücretsiz. Nand kapılarından kendi çipinizi (basit bir donanım açıklama dilinde), sonra bir montajcıyı, ardından bir derleyiciyi tasarlayın, sonra oluşturduğunuz dilde bir işletim sistemi yazın! Şaşırtıcı şeyler ve com sci derecesi olmayan biri olarak benim için iyi zaman geçirdim!
bplus

Yanıtlar:


18

CPU'nun kalbi ALU'dur . Sadece önceden tanımlanmış bazı ikili basamak serileri olan bir talimat (MOV gibi) almak ve ayrıca 0, 1 veya 2 işlenen almak ve bunlar üzerinde uygulanabilir işlemi yapmaktan sorumludur. En basit talimat, esasen hiçbir şey yapmayan bir NOP (işlem yok) olabilir. Diğer bir tipik işlem ADD'dir (iki değer ekler).

ALU "register" dan veri kaydeder ve yazar. Bunlar CPU'nun içindeki küçük bellek konumlarıdır. Talimatın bir kısmı (kaç girişiniz olduğuna bağlı olarak her giriş için 2 ila 3 bit) hangi kaydın okunacağını gösterir. ALU harici CPU'da, gerekli verilerin (ve talimatın) bellekten kayıtlara yüklenmesini ve sonuçların kayıtlardan belleğe yeniden yazılmasını sağlayan birimler vardır. Sonucun yazılacağı yer başka bir 2 veya 3 bit olarak da kodlanacaktır.

Bir işlemi temsil eden ikili sayı olan "op kodları" seçimi keyfi değildir. İyi seçilmiş opodlar ALU'nun karmaşıklığını azaltır. Her bit veya bit grubu, ALU'daki belirli mantık geçidini etkinleştirme ve devre dışı bırakma eğilimindedir. Örneğin, bir ADD komutunun, dahili ekleme mantığının sonucunu seçmesi için çıkış aşamasını etkinleştirmesi gerekir. Benzer şekilde, bir MUL komutu çarpma mantığının sonucunu seçer. Tasarıma bağlı olarak, hem toplayıcı hem de çarpma devrelerinin her ikisini de işlemlerini giriş işlenenleri üzerinde gerçekleştirmesi oldukça olasıdır ve değişen sadece çıkış seçimi (ALU'nun çıkış bitlerine yazılan).


1
Sanırım ne soruyorum, nasıl seçiyorlar? Ve bunu nasıl tahsis etmeye gidiyorlar?

1
@Sauron: 3. paragrafı tekrar okuyun ve ikili aritmetik ve dijital devreleri anlamaya çalışın. Dijital bir devrede 8 bitlik bir hatla 256 komutla bir komut setini temsil edebilirim. Bu, olası her durumu aktarmak için donanım aygıtlarımda 8 io bağlantı noktasına ihtiyacım olduğu anlamına gelir (satır başına 2 durum ^ 8 satır = 256 olası durum). İşlem birimi daha sonra bu dijital giriş sinyaliyle ne yapılacağına karar verebilir. Dijital devre iki donanım durumunuz olduğu anlamına gelir: Yüksek ve Düşük, voltaj veya voltaj yok. İkili buradan geliyor. İkili gösterim metale en yakın olanıdır.
Falcon

3
@Sauron - bir dijital devrenin birkaç değerden birini nasıl seçebileceğini görmek için Dijital Çoklayıcılara bakın. 8 bitlik bir veri yolunuz varsa, bu ikili dijital çoklayıcılardan 8'ine paralel olarak ihtiyacınız vardır.
Scott Whitlock

1
@Falcon Tamam ....... Bunun daha anlamlı olduğunu düşünüyorum. Sonunda her şeyin ikili sinyallere gittiğini ve "mov" gibi bir komutun hala ikili olarak temsil edildiğini unutmaya devam ediyorum.

1
@Sauron - CPU hakkında biraz araştırma yapın, op kodlarının ne olduğunu ve nasıl çalıştıklarını anlamanıza yardımcı olacaktır. Neden bazı op kodlarının seçilmesi önemli değil, "neden" sorusunu sormak bile çok mantıklı değil. Nasıl seçildiklerini anlamak CPU ve yapısı hakkında daha fazla bilgi edinmenize yardımcı olabilir.
Ramhound

9

Sorunuzu tam anlamıyla alacağım ve genel olarak bilgisayarları değil, çoğunlukla mikroişlemcileri tartışacağım.

Tüm bilgisayarlarda bir tür makine kodu bulunur. Bir talimat bir opcode ve bir veya daha fazla işlenenden oluşur. Örneğin, Intel 4004 (ilk mikroişlemci) için ADD komutu 1000RRRR olarak kodlanmıştır; burada 1000, ADD için opcode'dur ve RRRR 0-15 (ikili dosyada 0000-1111) kayıt numarasını temsil eder.

16 4 bitlik kayıtlardan birine (INC, ISZ, LD, SUB, XCHG gibi) gönderme yapan diğer tüm talimatlar ayrıca kayıt numarasını kodlamak için düşük 4 biti ve belirtmek için en üst 4 bitin çeşitli kodlamalarını kullanır opcode. Örneğin, ADD, SUB, LD ve XCHG, kayıt alanıyla birlikte 1000, 1001, 1010 ve 1011 (tümü ikili olarak) opcodes kullanır. Böylece mantığın basitleştirilmesi için bir desenin nasıl kullanıldığını görebilirsiniz.

İlk bilgisayar programları elle yazılmış, makine dilinde bir program oluşturmak için 1'leri ve 0'ları elle kodlamıştır. Bu daha sonra bir ROM (Salt Okunur Bellek) olarak programlandı. Şimdi programlar genellikle mikrodenetleyiciler durumunda elektrikle silinebilir Flash belleğe yazılır veya mikroişlemciler varsa RAM biter. (İkincisi hala önyükleme için bir çeşit salt okunur belleğe ihtiyaç duyar.)

Makine dili sıkıcı bir şekilde hızlı hale gelir, bu nedenle anımsatıcı bir montajcı dili alıp, genellikle talimat başına bir montaj satırı satırı, makine koduna çeviren montajcı programları geliştirildi. Yani 10000001 yerine REKS EKLE yazılır.

Ancak ilk toplayıcı makine koduyla yazılmak zorundaydı. Daha sonra kendi montajcı koduyla yeniden yazılabilir ve makine dili sürümü ilk kez monte etmek için kullanılır. Bundan sonra, program kendini toplayabilir (buna bootstrapping denir).

İlk mikroişlemci ana bilgisayarlar ve mini bilgisayarlar geldikten çok sonra geliştirildiğinden ve 4004 yine de bir montajcıyı çalıştırmak için gerçekten uygun olmadığından, Intel muhtemelen büyük bilgisayarlarından birinde çalışan bir çapraz montajcı yazdı ve montaj kodunu 4004'ü ROM'lara programlanabilen ikili bir görüntüye dönüştürür.


4

Çok düşük seviyedeki bir bilgisayar bir veri yolu ve kontrolü ile temsil edilebilir . Bunları birlikte görmek, dijital mimaride / tasarımda temel olduğu için size çok fazla okuma verebilir.

Özetlemek için elimden geleni yapacağım:

Burada belirtildiği gibi, kalbimizde bir ALU var - ALU (ve CPU'nun diğer bölümleri) hakkında bilinmesi gereken şey, farklı işlemler için yeniden yapılandırılabilir olmasıdır. Daha spesifik olarak, veri yolunu yeniden yapılandırma yeteneğine sahibiz , bu da parametrelerin nasıl getirildiği, hangi işlemin yapılacağı ve daha sonra nerede depolanacağıdır. Bu üç şeyi manipüle edebildiğinizi hayal edin - bu bizim kontrolümüz .

Peki bunu nasıl başaracağız? Daha önce de belirtildiği gibi, düşük seviyeli dijital mantıktan yararlanabilir ve farklı yollar için çoklayıcılar oluşturabiliriz. Çoklayıcılar giriş için bir bit kümesi kullanılarak kontrol edilir - bu bitler nereden alınır? Talimatların kendisinden kodlanmıştır. Paket servisi olan restoran: mov, add vb. Gibi talimatlar, bir CPU'ya veri yolunu belirli bir işlem için nasıl yapılandıracağını söyleyen bir dizi bittir. Okuduğunuz (mov, add) insan tarafından okunabilir formdur (montaj dili) ve programımız veriyolları ve işlemler için bir prosedür tanımlar.

Bunun, bu alanda daha bilgili olanlara göre daha karmaşık süreçlerin aşırı basitleştirilmesinden dolayı özür dilerim. FYI, elektrik mühendisliği yığın değişimi, çok düşük seviyeli mantıkla uğraştığı için bu soruyu sormak için harika bir yer olurdu.


3

Sorunuzu anlarsam bin / hex veya montajın nasıl ilişkili olduğunu anlamıyorum.

Sorunuzun etinin, temel kapılardan nasıl VE VEYA VEYA DEĞİL, taşıma, yükleme, depolama, ekleme vb.

Temel kapılardan ve bunun gibi şeylerden nasıl bir ekleme ve çıkarma yapıldığını söyleyen bazı detaylara sahip sıfırdan yaptığım kendi küçük öğretim talimat setim var http://github.com/dwelch67/lsasim .

Petzold'dan Kod (bir şey bir şey) kitabına bakın. İlköğretim yoluna başlayabilir, ancak bilgisayar ve elektronik ile hiçbir şeyden ikili, altıgen ve temel kapılara vb.

Bugün nasıl sıfırdan inşa edeceğinizi mi soruyorsunuz, yoksa gün içinde nasıl yaptılar? Bugün komut setinin bir tanımıyla başlayacaksınız. sadece oturun ve yazın, yükler ve depolar ve hareketler ve alu şeyler olması gereken talimatların türlerini ve daha sonra kaç kayıt, kayıtların ne kadar büyük olduğunu, bunun kısmen talimat boyutunu etkilediğini düşünüyorsunuz, talimat boyutu hakkında ...

Durup size nasıl bir program yazdığınızı sorayım? Metin düzenleyicide boş bir ekranla mı başlıyorsunuz? İhtiyaç duyabileceğiniz değişkenleri, işlevleri, programlama dilini vb. Çözmeye çalıştığınız görev hakkında bir fikriniz var. Ve her insan farklı ama bir dereceye kadar bunu biraz yapıyorsunuz (işlevleri tanımlamak ve yazmak), bunun bir kısmı (yeniden kullanılabilir tanımlayıcılar ve numaralandırmalar ve yapılar ve şeyler ile başlık dosyaları yapma) ve diğer bir şey (sadece kod, değişkenler ve kod ile doldurun). Ve farklı görevler etrafında dolaşırsınız, sonunda kod boyutu, hız, okunabilirlik, kalite, işlevsellik vb. Arasında bir denge olduğunu hissedersiniz. Donanım tasarımından farklı değil. donanım tasarımcıları da programlama dillerini (vhdl, verilog) kullanır ve aynı işlemi gerçekleştirir,

Tıpkı bir yazılım programı bulmak gibi, arzuları, performansı, boyutu, özellikleri vb. Uygulamaya ilk tasarımda bazı büyük hatalarınız olduğunu ve başlangıç ​​tasarımına geri dönüp talimat setini, büyük veya küçük değişiklikleri değiştirmeniz gerektiğini öğrenebilirsiniz. Derlenmiş kodun, performansın vb. Kalitesini önemli ölçüde artıran birkaç özel talimata gerçekten ihtiyacınız olduğunu bulmak için bir derleyici ve simüle edilmiş bir işlemciye sahip olabilir.

Bu yüzden sıfırdan bir takım talimatlar icat ettiniz, benzer bit desenleriyle benzer talimatları gruplamak için donanım tasarımı ile biraz deneyim kullandınız, böylece sadece donanım dili programlaması için değil, daha kolay deşifre edilebilirler, ancak güç ve kapılardan tasarruf ederler. iyi şeyler. Bu günlerde bir çeşit simülatör yapacaksınız, anlayışım ARM önce bir yazılım simülatörü oldu, sonra donanım tasarımları daha sonra geldi, bunun doğru olup olmadığını bilmiyorum ama bu hikayeye bağlı kalmayın. Bu, bazı takımların sadece donanım uzmanları olabileceği ve HDL'de programlamaya girmek isteyebileceği takıma bağlıdır, benim gibi bazıları her ikisinden de biraz yapmak isteyebilir. Bu günlerde iyi donanım dili simülatörleri mevcuttur, böylece derlediğiniz ve simüle ettiğiniz herhangi bir donanımı inşa etmek zorunda kalmazsınız ve hata ayıklamanızın çoğunu bir donanım simülasyon programı / paketi ile yapmanız gerekmez. yazılım ekibi, komut kümesi için simüle edilmiş ram ve rom besleme programlarını kullanarak simüle edilmiş işlemciye monte ediciler ve derleyiciler geliştirebilir ve hızlandırır. Çok uzun zaman önce üzerinde çalıştığım bir işlemci üzerinde tam bir linux önyükleme simüle ettik, saatler sürdü ama işe yaradı (mantıkta bir önbellek hatası buldum).

Şimdi sorduğumu gerçekten düşündüğüm şey için. Temel kapılardan bir talimat seti ile bir işlemciye nasıl ulaşırsınız? Peki temel kapılar VE, VEYA, gerçekten analog değildir, zaman kavramına sahip değildirler, girişlerdeki voltajı anında değiştiremezsiniz ve bu voltajı değiştirdiğinizde çıkışlar değişmeye başlar. kapılar transistörlerden yapılır ve transistörler amplifikatörlerdir, girişi bir sayı ile çarpın ve diğer taraftaki akımın akmasına izin verin. bunları mantık kapıları olarak kullandığımızda, aslında onları aşırıya kaçıyoruz, giriş voltajı o kadar yüksek veya düşük ki, transistör sadece maksimum voltajı veya voltajsız (akım) çalışabilir. temel olarak transitor bir anahtara dönüştürülür. uzun lafın kısası, zaman kavramı yoktur. Bir talimat setine sahip olmak için, program boyunca sıralamamız gereken talimatların olması gerekir, şimdi bu talimatta olduğumuz kavramına sahip olmalıyız ve bir sonraki zaman diliminde bu talimat üzerinde çalışacağız. Bir amplifikatörü bir anahtara dönüştürme oyunu gibi, temel mantık kapılarını bir saatle kullanarak benzer oyunlar oynarsınız. Saatler, bir kutudaki sihirli kristallerden gelir (buraya girmeye değmez), belirli bir oranda açılıp kapanan voltajlar yapar. bu gerilimi mantık denklemlerinde kullanın ve bir şeyleri sıralamaya başlayabilirsiniz. Saatler, bir kutudaki sihirli kristallerden gelir (buraya girmeye değmez), belirli bir oranda açılıp kapanan voltajlar yapar. bu gerilimi mantık denklemlerinde kullanın ve bir şeyleri sıralamaya başlayabilirsiniz. Saatler, bir kutudaki sihirli kristallerden gelir (buraya girmeye değmez), belirli bir oranda açılıp kapanan voltajlar yapar. bu gerilimi mantık denklemlerinde kullanın ve bir şeyleri sıralamaya başlayabilirsiniz.

bu doğruluk tablosunu çok kısaca düşünün:

0 0 0
0 1 1
1 0 1
1 1 0

ikili olarak:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

sadece lsbit'e odaklanan bir bitlik toplayıcı, yukarıdaki doğruluk tablosu bir bitlik toplayıcıyı açıklar. Ayrıca bir XOR geçidini de tanımlar. Bir giriş doğrudur, diğeri doğrudur, ancak ikisi birden değildir.

Birden fazla bit almak için taşımak ve yürütmek taşıma bitleri bakmak zorunda ve üç bit toplayıcı iki işlenen ve iki çıkış, yürütmek ve sonuç bit bir taşıma gerekir. Bu üç girişli iki çıkış toplayıcısına sahip olduğunuzda, bunu istediğiniz kadar genişletin. Ancak bu hala analog, kapılar anında değişiyor.

Bu analog toplayıcıyı bir ADD komutuna nasıl dönüştürdüğünüz, düzenlediğiniz bu kapılara giriş olarak oturan talimatlara bakan bir mantığınız var mı? talimattaki bazı bitler, bu bir ekleme talimatı olduğunu söyler, bazı bitler bir işlenenin böyle olduğunu ve böyle bir kayıt olduğunu, belki 7 kaydını kaydedebilir, diğer bitler diğer işlenenin 4. kayıt olduğunu söyleyebilir ve mimariye bağlı olarak sonucu kayıt 2 koymak koymak talimatta tanımlanmış başka bir kayıt olabilir. Şimdi daha fazla mantık bunu alu toplayıcı bir girişine yönlendirilmesi ve 7 toplayıcıya yönlendirilmiş kayıt 4 ve kayıt yönlendirmek gerekiyor gibi görüyorum kayıt için toplayıcının çıkışı 2. Saat bu mantığın bir parçası olduğu için, saatin başlangıcından bir sonraki saatin başlangıcına kadar tüm analog sinyallerin yerleştiği ve yapmaları için bağlandıkları mantık denklemini çözdüğü bir süre vardır. Bir ışık anahtarını çevirdiğinizde aksine, ışık durumunu kapalı konumdan açık konuma değiştirirsiniz. o ışığın ısınması ve temel olarak sabit bir duruma gelmesi zaman alır. Burada pek de farklı değil.

Bu saat periyodu bir AND komutunun yürütme aşaması ise, bir sonraki saat periyodu sonucu çıktı kaydına kaydedeceğim gibi bazı şeyler mantıklıdır. Aynı zamanda bir sonraki talimatı getireceğim. Bu yüzden alu uygulamasının genellikle sadece bir saat olduğu modern işlemciler için analog mantık bu kadar hızlı mantık denklemlerini çözebilir. Bir sayıya kadar saymanız gereken eski işlemciler, toplayıcıyı kablolu olarak bırakır, toplayıcı mantığının çözümlenmesi için x saat döngü sayısını bekler, daha sonra çıktıdan gelen numuneyi örnekler, alu farklı girişleri besler, x için saat döngü sayısını bekler çözmek için, sonsuza kadar veya güç kesilene kadar tekrarlayın.

Mantık denklemleri ile ne demek istiyorum? sadece bu, eğer isterseniz VE, VEYA, DEĞİL kapıları açısından düşünebilirsiniz. Alu toplayıcı devresine yapılan her bir giriş biti için, geçerli talimatı içeren flip flopları (bireysel / tek bellek bitleri) (artı bunların her birini besleyen denklemleri) içeren saati içeren büyük olasılıkla çok uzun bir denklem vardır. bellek bitleri) ve açık ve kapalı. Yazdığınız tek bir yazılım işlevini, yazdığınız dilde alın; bunun, girdileri alan, bir görevi yerine getiren ve ardından bitirip bir sonuç döndüren bir işlev olduğu varsayılarak. Olası tüm girdi kombinasyonlarını ve bu işlev sayesinde farklı yürütme yollarının neler olduğunu düşünün. Bazı üst düzey dilde yazmış olabilirsiniz, ancak muhtemelen bu dilde bile, birçok iç içe if-then yapısını kullanarak onu daha ilkel ve daha ilkel olacak şekilde yeniden yazabilirsiniz. ve belki de meclis diline inin. Bahsettiğim denklemlerden farklı olarak, donanım programcısı, bu uzun sargılı denklemlerde, programlama dili bu kadar çok şey kaydettiğinde, montaj dilindeki uzun sargılı if-else ağaçlarında muhtemelen programladığınızdan daha fazla programlamaz. Kullandığınız derleyici gibi, küçük kaynak kodunuzu birçok if-then-elses ile uzun sargılı montaja dönüştürdüğü gibi, donanım programlama dil kodunu alıp mantık denklemlerine dönüştüren bir derleyici vardır.

Şimdi ilk cpu'ya geri dönüyoruz (bugün mikrodenetleyiciyi düşünürüz ama o zaman bir cpu idi). Yukarıdakilerin tümünü kağıt üzerinde yaptınız ve mantık denklemlerini yazdığınız donanım programlama dillerini kullanmadınız, ancak kapı sayısını ve bu kapıları basitleştirmek için telleri yapmak için talimatlar için bit desenlerini daha dikkatli seçtiniz. pratik olarak. Kağıt üzerinde, hem kablolu kablolu mantık kapılarının uzun bir listesini oluşturmalısınız hem de gerçek bileşenleri silikon maskenin şişmiş bir versiyonuna çizmeniz gerekiyordu. bugün bile cips layman açısından fotoğrafik veya serigrafi benzeri bir sürece benzer şekilde yapılır, böylece bu mavi baskıları alır ve küçültür ve sonra silikon katmanlara uygularsınız.

burada yine herkesin montajı daha iyi ele aldığı günlerde, sadece bir metin düzenleyiciniz ya da ilk programlarınızı kağıt üzerine elle yazmak zorunda kalabileceğiniz bir montajcıya sahip olmanıza gerek kalmadı. bir referans kılavuzu kullanarak, bunu makine koduna, sıfırlara ve sıfırlara dönüştürdü. Bu bilgisayarların bazılarında, anahtarları çevirerek, adres bitlerini çevirin, veri bitlerini kağıdınızdaki sayılarla eşleşene kadar çevirin, saat bitini yukarı ve sonra aşağıya çevirin ve bir bellek konumu yüklediniz. programınızın bir talimatının bir baytı, birkaç yüz kat daha tekrarlayın ve umarım hata yapmazsınız.

Aynı şekilde, ilk derleyici C derleyicisinin muhtemelen başka bir dilde yazılmış olduğunu söyler, sonra C'de yeniden yazılarak ve sonra tek başına ilk C derleyicisi tarafından derlenerek kendi kendini barındıran hale geldi. Daha sonra C derleyicileri, daha sonra kendi kendini barındıran diğer programlama dillerini icat etmek için kullanıldı. Kendi üzerine kurulmuş işletim sistemlerini ve metin editörlerini icat ettik ve köşedeki perdenin arkasındaki birkaç kişi için kara büyü kaldı ...

evet, çok uzun soluklu, gerçekten kavramak için yıllarca çalışmaya ve deneyime ihtiyaç duyan büyük bir soru. lsasim'e bak, herhangi bir konuda uzman olduğunu iddia etmiyorum, ama bir talimat seti, hem C'de yazılı talimatı yürüten bir simülatör hem de bir donanım programlama dilinde uygulanan işlemcinin başka bir uygulaması var farklı araçlar kullanılarak simüle edilmiştir. Artı bir ham montajcı ve diğer bazı araçlar ve benzeri. Belki de, bunların bazılarını, özellikle de donanım programlama dil kodunu inceleyerek, sorduğum varsayımdaki boşluğu kapatabilir. Eğer bu boşluğu kapatmadıysam veya uzun soluklu bir teğet yaptıysam, lütfen bu cevabı mutlu bir şekilde kaldıracağımı bildirin (programcıların takasında çok fazla takılmadığımı varsayarak).


Bu gerçekten yazarın sorusuna cevap vermez, en azından tartışmaya hiçbir şey eklemez, kabul edilen cevabın kapsamadığı anlamına gelir. İkili matematik% 100 doğru değil 1 + 1 0 taşması ile 0'dır. Kayıt defterinin boyutuna bağlı olarak ya 2 ya da 0 olur.
Ramhound

@dwelch DAMN! Ben daha az bir şey yoksa ölmek kalp hayranıyım +1
AceofSpades

2

CPU'lar 0'lar ve 1'ler üzerinde çalışır. Tüm talimatlarda kendilerini tanımlayan bir dizi bit vardı. Bu makine koduydu. İnsanların okuması ve yazması zor. İlk adım olarak 0'ları ve 1'leri 4 bitlik diziler halinde gruplandırdık ve onları temsil etmek için 0 ila F'yi kullandık. Bu, ezberlemek zorunda olduğumuz sayıları azalttı, ancak talimatlar için hex kodunu hatırlamak hala kolay değildi.

Böylece MOV ve ADD gibi "kelimeleri" olan montajı kullanmaya başladık. Montajcı, talimatları "0" ve 1 'lerin takım kodunu makine koduna dönüştüren doğru set ile değiştirecektir.

Sonunda, "talimatların" makine kodunun tüm dizilerini temsil edebileceği "daha yüksek" seviye diller geliştirdik.


FYI, sekizlik onaltılıktan önce ikili stenografi olarak kullanıldı.
ocodo

Slomojo haklıdır, Sekizli, taban 8, 3 bit kullanılmış, altıgen ile birlikte kullanılmıştır, taban 16, 4 bit kullanılmıştır. Octal'ın avantajı, herkesin 0 ila 7 arasındaki sayıları temsil etmesiydi. Hex'i kullanmayan insanlar genellikle A'dan F'ye kadar "rakamlar" tarafından gizlendi.
Jim C

0

Geçenlerde bu Q / A ile karşılaştım ve yaklaşık bir yıl önce bu yolda seyahat etmeye başladığımda; Bu konuyla ilgili kendi sorularım için çok iyi bir kaynak ve referans sayfası olarak bulurdum.


Bölüm 1: -Preface-

Biraz kendim hakkında:

Hala ilkokuldayken 80'li yılların ortalarından sonlarına kadar, 50'lerden 80'lere kadar olan ve devre kartlarına bakacak ve her zaman nasıl yapıldığını bilmek isteyen önemsiz stereolar, VCR ve diğer elektron cihazlarını parçalara ayırırım iş ... Yayın sinyalini nasıl elde ettiler, ses, video üretiyorlardı, bunu yapıyorlardı ve böyle ... Bir direnç, kondansatör, diyot ve transistör gibi orada ayrı parçaları tanıyabiliyordum, ama olmadı ne kadar genç yaşta ne yaptıklarını veya nasıl çalıştıklarını bilir

Yıllar boyunca her zaman Matematik, Fizik ve Kimya alanlarında olağanüstü oldum. Matematiği yüksek derecede anladım ve ortaokulumdan ve daha sonra gelen lise günlerimden bazı basit veya temel devreleri bile okuyabiliyordum, ancak mantık kapıları ve nasıl inşa edildiklerini öğrenmek için hiç yapmadım ... Lisede Boole Cebiri'ni Mantık, Olasılık ve İstatistik Onur sınıfımdan öğreniyorum. Tüm matematik ve fen derslerim onur dersleriydi. Bir üniversite yüksekokulunda ikinci döneme kadar Matematik almadım. Cebir Koleji'ni test ettim ve tazeleme kursu olarak Trigonometri aldım. Sınıftan en yüksek matematik seviyem tek değişkenli Matematik II.

3 ya da 4 yaşımdan beri video oyunları oynuyorum. Çocukken Atari, NES, Sega Genesis ve PS1 vardı. Yaşlandıkça ve geç gençlerime ve 20'lerin başlarına geldiğimde PS2 ve SNES'i tercih edilen başlıklarla edindim. Bu aynı zamanda Doom'a kadar uzanan PC oyunlarını da hesaba katmıyor!

Her zaman hevesli bir Konsol ve PC oyuncusu oldum ve bu langırt ve arcade oyunları içermiyor.

90'ların başında Noel için yaklaşık 12 yaşındayken ilk bilgisayarımı aldım. DOS 6.0 ve Win 3.11 veya OS / 2 günleri. O zamandan beri "Windows" işletim sistemleri ailesini her zaman tanıyordum ve sahip olduğum tüm sistemler Intel Mimarisiydi. Okuldan veya üniversiteden Apple veya Mac ile sınırlı deneyimim oldu, ancak Linux sistemlerinde çalışma ayrıcalığım olmadı. Cygwin'im var ve bash öğrenmeye elimi denedim, ancak Dos veya Komut İstemi sözdizimine çok alışkınım.

90'lı yılların başında PC-World'ün bir kopyasını alırdım ve kod parçacıklarını QBasic'e çok iyi bilmiyordum ve bu programların çalışmasını sağlamaya çalışırdım. Başarılı olan tek kişi, ana tuş sırasına basılan tuşlara farklı zil sesi tonlarını dönüştüren bir programdı. Cep telefonundaki zil seslerini kastetmiyorum, tuşu basılı tuttuğunuz sürece sürekli bir frekans demek istiyorum.

Bir bilgisayarın nasıl programlanacağını öğrenmek için elektronik cihazların sadece dijital ve mantıksal düzeyde devre içinde nasıl çalıştığını bilmek istemem her zaman bir tutkum oldu, ama her zaman kendi videomu yapmak istedim oyunlar. 90'ların başında bile Frogger ve Tetris oyunlarını yapmak istedim ...


Bu, Bilgisayar Bilimi alanındaki en zorlu programlama veya yazılım geliştirme türlerinden biriyle başa çıkma motivasyonum ve arzum oldu ve bu da 3D Oyun Motoru Tasarımı. Bilgisayar Bilimi'nde aynı derecede zor olan başka alanlar da vardır, ancak her bir karmaşık oyun motoru tipik olarak veya genellikle hemen hemen tümünü içerir, çünkü tek tek bileşenler veya alt motorlar tekniklerini veya özelliklerini gerektirir.

Lise günlerimden programlama konusunda biraz geçmişim vardı, ancak bu korkunç Visual Basic ile sınırlıydı. 1999 yılında liseden mezun olduktan birkaç yıl sonrasına kadar 2002 - 2003 yıllarında C / C ++ öğrenmeye ve öğrenmeye başladım. Bu güne kadar Bilgisayar Bilimi veya Bilgisayar Mühendisliği'nde herhangi bir üniversite sınıf deneyimim yok, ancak özveri ve kararlılık, bilgisayar, donanım, programlama, algoritma vb. söz konusu olduğunda hemen hemen her konsepti öğrendim ve hala elimden geldiğince öğrenmeye devam ediyorum ...

C / C ++ öğrenmenin ilk günlerinde internete erişebildim, ancak internet daha erken aşamalarındaydı, Amazon, Youtube, Facebook gibi web siteleri henüz mevcut değildi, hala 56k günüydü. İkinci bir özel hattınız yoksa, telefon hattınızı düzenleyen modemleri arayın. Bir görüntünün ekranda görüntülenmesi birkaç dakika sürer, sürekli video oynatmayı dikkate almayın.

C ++ 'da nasıl programlanacağını araştırmaya ve öğrenmeye geldiğinde, kaynaklar sınırlıydı ve çoğu metin biçimindeydi. Projeleri internet eğitiminin ilk günlerinden itibaren ele almaya çalışırken, bu projelerin birçoğu tam olarak tamamlanmadı, yazarlar ya profesyonel ya da üniversite öğrencileriydi ve okuyucunun derleme gibi gerekli kavramların çoğuna aşina olduğu konusunda birçok varsayımda bulundular. , bağlama ve hata ayıklama ve kütüphane entegrasyonu.

Bu konular hakkında hiçbir şey bilmeyen biri için kayboldular çünkü neyin yanlış gittiğini, nasıl düzeltileceğini ve düzgün çalışmasını nasıl sağlayacağını bilmiyorlar. Çok sınırlı kaynaklara sahip o günlerde saatler süren deneme yanılma aldı. Şimdi bu web sitesiyle yapabileceğimiz gibi yardım istemek veya cppreference'de bulabileceğiniz ayrıntılı açıklamalar bulmak mümkün değildi! Şahsen kimseyi tanımıyorsanız, yardım için başvurabileceğiniz çok fazla şey yoktu!

Zaman geçtikçe burada ve orada bazı bilgilerimi geliştirdim ve sonunda internet DSL'e dönüştü ve şimdi Yüksek Hızlı internet, web siteleri daha etkileşimli hale geldi, videolar gösterilmeye başladı, videoların kalitesi zamanla daha iyi hale geldi, siteler Youtube ortaya çıkmaya başladı ve araştırma tarafında işler biraz daha kolaylaştı. Giderek daha fazla öğretici hazır hale geldi, bazıları iyi ve yararlıydı, bazıları kötü uygulamalar öğretti ...

Ayrıca geliştirme için gerekli araçları bulmak ve edinmek için çok zaman harcadım. Dil sözdizimini, derleyici ve derleme işlemini, bağlamayı, kurmayı ve hata ayıklamayı öğrenmek zorunda kaldım. Sonra orada bulunan farklı kütüphaneler ve API'ler ve bu bağımlılıkları birbirine bağlamak için projelerimi veya çözümlerimi nasıl yapılandıracağımı öğrenmek zorunda kaldım.

Yıllar içinde C ++ dilinin zaman içinde gelişmesini, gelişmesini ve uyum sağlamasını izledim. Başlangıçta yıllarca neredeyse aynı kaldı, ancak son 10 yılda kuruluşundan bu yana bu kısa sürede önemli ölçüde değişti.

Tüm bunlardan bahsediyorum çünkü C ++, çok yönlülüğü, gücü, zengin özellik seti ve kendinizi ayağa vurmanıza izin verme yeteneği nedeniyle tamamen ustalaşmak için en zor dillerden biridir! Ve tüm uyarılarıyla bile, bu tür geliştirme için bir standart olarak en önde gelen endüstride kullanılan en güçlü ve tercih edilen dillerden biridir, çünkü doğru bir şekilde yapıldığında hızlı, özlü, güvenilir ve en küçük ayak izi.

O zamandan beri 3D Grafik Programlama ve Oyun Motoru Tasarımı öğrenmeye odaklanmak niyetiyle C / C ++ 'da uzun yıllar kendi kendime öğretildim. 100'lü ila 1000 saatlik arama, araştırma ve çok daha fazlasını bu bilgiyi yararlı çalışma ürünleri ve uygulamalarının tasarımına okuma, öğrenme ve uygulama içine koydum. Beceri setlerimi ve zanaatımı geliştirmek için her zaman daha fazla bilgi edinmek isteme ve arzum vardı.


Bu ilk aşamaydı, daha sonra C / C ++ ve hatta C # 'da yaptığım DirectX 9.c ile okumaya ve çalışmaya başlamıştım. Sonra DirectX 10 ve Legacy OpenGL 1.0'a geçtim. DirectX 11 ve OpenGL 3.x - 4.x'ten geldi ve şimdi Vulkan'da elimi denedim.

Hem metin hem de video formatlarında çeşitli çevrimiçi eğitimlerle çalışan başarılı oyun motorları oluşturdum. Matematikte güçlü bir geçmişe sahip olduğumu belirtmiştim ancak Matematik I ve II ile sınırlıydı. Kendime üniversitedeki Matematik tabanlı Fizik dersimden biraz bilgi sahibi olduğum Vector Calculus'u öğretmek zorunda kaldım, ancak Afin Dönüşümler ve Analitik Geometri ile Lineer Cebir için, bazı denklemler, fonksiyonlar, yöntemler, algoritmalar ve kavramlara ihtiyaç vardı. Sonra bunları yüzlerce ila binlerce saat hata ayıklama koyarak mümkün olduğunca genel ve hatasız verimli, okunabilir, güvenilir, yeniden kullanılabilir koda nasıl çevirmek zorunda kaldım.

Bellek yönetimi, referans sayma, örnekleme, özyineleme ve çok daha fazlasını içeren bir oyun motorunun tüm bileşenleri olmasa bile birçoğunda kullanılan konuları ve algoritmaları öğrenen muhteşem bir yolculuk oldu. Hepsini burada listeleyebildim ama 3 ya da 4 cevap alanını doldurmak için yeterli bilgi olurdu. Ancak, alt başlıklarını değil genel konuların listesini ekleyeceğim.

İşte tüm çeşitli teknikler, render ve gölgelendirici boru hatları, gölgelendiriciler aracılığıyla gölgeleme ve aydınlatma teknikleri, ön ve son işleme, çerçeve arabellekleri, arka tamponlar içeren tamamen işlevsel bir oyun motorundan oluşan konu veya konu listesi. , görüntü yükleme, ses ve model yükleme ve ayrıştırma, renkli malzeme özelliklerine sahip ilkel şekiller oluşturma, manuel doku eşleme, nesne dönüşümleri, kamera türleri, sahne grafiği hiyerarşileri, dokular için yönetici sınıfları, ses, yazı tipleri ve gölgelendiriciler ve bellek yönetimi, istisna işleme ile kayıt sistemi, çok iş parçacıklı ve paralel programlama teknikleri, ağ oluşturma, fizik motoru, çarpışma algılama, parçacık üreteci, animasyon, oyun AI, arazi üretimi, gökyüzü kutuları ve gökyüzü kubbeleri, su işleme,yeşillik ve daha fazlası ..., metin oluşturma, HUD bindirmeleri, envanterler, harita ve makro üretimi, durum sistemi ve devlet makineleri için dokulu yazı tipine sahip GUI'ler ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi komut dosyası dilinizi oluşturmak için bir ayrıştırıcı yazma uygulama başlangıcında kendi kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneği.ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi kodlama dilinizi oluşturmak üzere bir ayrıştırıcı yazarak, yalnızca ilgili nesneleri kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneğine sahip olmak uygulama başlangıcında.ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi kodlama dilinizi oluşturmak üzere bir ayrıştırıcı yazarak, yalnızca ilgili nesneleri kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneğine sahip olmak uygulama başlangıcında.


Yıllar içinde ve dışında montaj dilini öğrenmek istemiştim, derleyiciler, montajcılar ve basit işletim sistemleri hakkında bilgi edinmek istedim, iç işleri, nasıl inşa edildikleri ve tasarlandıklarını kastediyorum.

Zaman geçtikten sonra biraz da adım attım ve donanım öykünmesini öğrenmeye başladım. Özellikle NES'e odaklandım, ancak genel olarak CPU'ların donanım öykünmesini öğrenmek istedim. Bu, beni kavramı zaten bildiğim talimat setini ve Intel'in x86 ailesine bir dereceye kadar aşina olduğum şeyi öğrenmeye götürdü, ancak şimdi 6502 Öğretim Setini öğrenmek zorunda kaldım.

Yine de bu konuya girerek daha fazla araştırma yaptım ve Komut Seti Mimarisi'ni Mühendislik perspektifinden öğrenmeye başladım. Bu, CPU'nun mantık kapılarından nasıl inşa edildiğini ve mantık kapılarının diğer çeşitli elektrikli bileşenlerle birlikte transistörlerden nasıl inşa edildiğini öğrenmemi sağladı. Bu yüzden bunu yukarıdan aşağıya doğru iki açıdan öğrenmeye başladım. Her iki yöntem de çok etkiliydi ve her ikisinden de öğrenmenin, yazılımın donanımı ettiği yerde köprü veya boşluk oluşturmaya yardımcı olduğunu düşünüyorum.

Bundan, Boole Cebirimi yenilemek zorunda kaldım ve K-Haritaları, Uygulama Tabloları, Mealy ve Moore Devlet Makineleri ve İkili Mantık ve Aritmetik ile Fiziksel Mantıksal Kapıları ve Entegre Devreleri ilişkilendiren diğer çeşitli şeyleri öğrendim. Bu da beni Logisim ile çalışmaya başladığım ve HDL, VHDL, Verilog vb.

Bunların hepsini son 15-18 yıldır yapabileceğim boş zamanlarımda öğreniyorum.


İşte yıllar boyunca bana yol gösteren bazı siteler ve bağlantılar. Bunların çoğu yakın zamanda öğrendiğim sitelerin çoğu ya artık yok, bağlantılarını kaybettim ve hatırlamıyorum ya da arama motorları onları arama listelerinin en arkasına itti ...

  • Diller - C ++

  • 3D Grafik Eğiticileri ve Kaynak Web Siteleri

  • Youtube serileri ve kanalları , donanım, bilgisayar ve elektrik mühendisliğinin yanı sıra yukarıdaki konuları da kapsıyor. Listelenecek çok fazla var, bu yüzden burada en yararlı ve becerikli bulduğum birkaçını listeleyeceğim. Bağlantıları sağlamayacağım, ancak bu kanalları youtube'da arayabilirsiniz.

    • 3Blue1Brown - İleri Matematik
    • Bisqwit - Gelişmiş C / C ++ Programlama (Uygulama Projeleri) - NES Hardware Emulator
    • Jason Turner - Gelişmiş Modern C ++ programlama teknikleri
    • javidx9 - Gelişmiş C / C ++ Programlama (Uygulama Projeleri) - NES Donanım Emülatörü / Bazı Montajlar
    • MIT OpenCourse - Matematik ve Bilgisayar Bilimi Üniversite Dersleri
    • Bilkent Online Kurslar - Bilgisayar Bilimi ve Bilgisayar Mühendisliğinde Üniversite Dersleri (CPU Design MIPS)
    • Cherno - Gelişmiş C / C ++ Programlama Konuları ve Uygulamaları - Game Engine Geliştirme
    • Ben Eater - Donanım Mühendisliği - Breadboard'lar ile Pratik Uygulama
    • Neso Academy - Donanım Mühendisliği - Teori ve Kavramlar
    • Socratica - Python programlama
    • Basitçe söylemek gerekirse - Donanım Mühendisliği - Teori ve Kavramlar
    • Bitwise - Gelişmiş C / C ++ Donanım Öykünmesi ile Bir Montajcı Tasarlama
    • Bo Qian - Veri yapıları ve algoritmalarında C ++ konuları.
    • LineByLine - Vulkan Programlama
    • Joshua Shucker - Vulkan Programlama
    • www.MarekKnows.com - C ++, 3D Matematik ve Oyun Motoru Geliştirme

Ve bunlar bu konularla ilgili çeşitli kitaplardan bazılarını hesaba katmıyor.

-Not- Lütfen buna oy vermeyin, çünkü bu sadece kendi kişisel deneyimimin okuyucusuna bir mesajdır ve orijinal soruyu cevaplamak veya referans vermek için yapılan herhangi bir girişimden geçersizdir. Önümüzdeki birkaç gün içinde zamanım olduğunda; Referans ve kaynak seti olarak faydalı bağlantılar sağlarken OP'nin sorusu hakkındaki düşüncelerimi vermek için bir takip cevabı ekleyeceğim ve bu yanıtı buraya bazı bağlantılar eklemek ve bu notu değiştirmek için de güncelleyeceğim. Geç oldu ve şu anda yazdıklarımı düzeltmek ve düzenlemek için zamanım yok. Bunu yapabildiğim zaman yapacağım ".


Bu yanıtı veya yayını daha yeni güncelledim. Soruyu cevaplayacak 2. Bölümü ekleyecektim, ancak bunu yapmak için yeterli itibar puanım yok. İkinci cevabımı ekleyebilmem için gereken itibar puanlarını oluşturmam biraz zaman alacak. Bu gönderi asıl cevap değil ama referans olarak kullanacağım ve gerçek cevabımın gerekçesiyle tabloya bakacağım. Yazılım ve donanım arasındaki boşluğu kapatmaya yardımcı olmak için yukarıda listelenen kaynaklardan bazılarına sahip olmak gerekir.
Francis Cugler

-2

Özünde, bir CPU genellikle sadece bir durum makinesidir. Bu yüzden mantık kapılarının ve parmak arası terliklerin veya kayıtların durum makineleri yapmak için nasıl birleştiğini anlamanız gerekir.

Bir durum makinesi, girdileri ve geçerli durumu alır, bunları boole (ve potansiyel olarak aritmetik) mantığı aracılığıyla çalıştırır ve daha sonra çıktılar ve bir sonraki durum sağlar. Girişlerden biri talimat yazmacı olabilir. Çıkışlardan biri, kaynağın talimat yazmacını yeniden yüklemesi için bir etkinleştirme ve bir seçim olabilir, belki de bir program sayacı olarak hareket eden başka bir yazmacı artırabilir veya yükleyebilir. Bununla birlikte, bazı adreslenebilir bellekler ile talimatlar arasında sıralama yapabilirsiniz.

Talimatları sıralamak için bir yolunuz olduğunda, bu talimat bitlerini ve mevcut durumu başka bir kontrol bitleri grubuna çözmek için mantığı kullanabilirsiniz. Bu kontrol bitlerinden bazıları, aritmetik ve kelime çapında mantık yapabilen bir grup mantığı kontrol etmek için girdi olarak işlev görebilir, buna ALU olarak adlandırılabilir. Diğer bitler ALU için bir şeyler yükleyebilir veya girişleri seçebilir. Diğer bitler, ALU'nun sonuçlarının nerede saklanacağını söyleyebilir. Veya adres kayıtlarını yükleyin. Veya belleğe veya diğer çıkışlara yazın. Vb.

Bir komut seti tasarlamanın bir parçası, sadece kod çözüldüğünde, tüm bitleri ve durum makine sıralamasını kontrol eden bit kombinasyonlarını bulmaktır. Bu, binlerce farklı yolla yapılmış ve (yeniden) optimize edilmiştir.

Bu önemsiz konu hakkında en az 3 seviye üniversite ders kitabı bulunmaktadır.


2
Bu, MOV işleminin ikili değere nasıl dahil edildiğini açıklamaz. Bu, MOV işleminin bir değer olduğundan, kullandığımız bir anahtar kelimeden bahsetmez, bu yüzden 16 ila 32 bit ikili değeri ezberlememiz gerekmez.
Ramhound
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.