Makine kodunda programlamayı öğrenmeye yönelik kaynaklar? [kapalı]


24

Ben Java'dan C ++ 'ya ve C'ye kadar programlama ve sevme konusunda yeni bir öğrenciyim. Geriye dönüp barbarlara taşındım ve Meclise devam etmeyi düşündüm.

Ancak, sürprizime göre, birçok insan bunun C kadar hızlı olmadığını ve faydası olmadığını söyledi. Ya bir çekirdeğin nasıl programlanacağını ya da bir C derleyicisi yazmayı öğrendiklerini önerdiler. Benim hayalim ikili programlamayı öğrenmek (makine kodu) veya belki de çıplak metal programlamak (fiziksel olarak mikro kontrol cihazı programlamak) ya da bios veya bagaj yükleyicileri ya da bu tür bir şey yazmak.

Bu kadar çok araştırmadan sonra duyduğum tek şey hex hex editörünün bu çağda ve çağda bulabildiğim makine diline en yakın şey olduğu. Bilmediğim başka şeyler var mı? Makine kodunda programlamayı öğrenmek için herhangi bir kaynak var mı? Tercihen 8 bitlik bir mikro kontrolör / mikroişlemci üzerinde.

Bu soru benimkine benziyor, ancak önce pratik öğrenmeye sonra teoriyi anlamakla ilgileniyorum.


2
Buradaki problem tam olarak nedir ? Makine kodunu kodlamanın mümkün olup olmadığını soruyorsanız cevap muhtemelen "evet" tir. Öğreticiler için soruyorsanız, a) sorunuzun ne olduğunu açıkça belirtin, ama b) yapıcı bir soru değil.
ChrisF

6
C yeterince metal değil mi?
Tom Squires

6
Ben program bare metalher zaman benim sunucu kutusunu tekme. Harikalar yaratıyor!
yannis

7
Hiç aşağı inmeyi düşündün mü? Kendi işlemcinizi hackleyin
SK-mantık

3
@ SK-mantık, evet, makine kodu programlaması yaklaşık 1 saat sonra bozulmaz hale gelir. Haklısın, daha iyi ve daha verimli bir fikir CPU uygulamasına geçmektir. 6502'nin ( visual6502.org ) sanal versiyonlarının yanı sıra modern ayrık mantık kullanarak CPU'ları kurmak isteyen veya yapmak isteyenlerin de var ( bradrodriguez.com/papers/piscedu2.htm )
Angelo

Yanıtlar:


27

İnsanlar makine kodunda programlama yapmazlar (mazoşist olmadıkça). Makine kodunu üretmek için (veya geliştirme araçları) araçlar (çapraz geliştirme araçları dahil derleyici veya montajcı) veya belki de makine kodu üreten kütüphaneler (LLVM, libjit, GNU lightning, ....) kullanırlar. Bu nedenle, makine kodu oluşturma, derleme, optimize ediciler ve mikro mimariler hakkındaki kaynaklar da önemlidir.

Ve çoğu zaman, iyi bir optimize edici derleyici yapabileceğinizden daha iyi makine kodu üretir. Muhtemelen iyi bir optimize ediciden daha iyi bir 200 satır derleyici kodu yazamazsınız.

Makine kodunu anlamak istiyorsanız, önce montajı öğrenin. Makine koduna çok yakın. Akıllıca kullanın, yalnızca C ile kodlayamayacağınız şeyler için (veya Ocaml, Haskell, Common Lisp, Scala). İyi bir yol, genellikle bir C işlevi içinde asmtalimatlar (özellikle GCC'nin genişletilmiş montaj özelliği) kullanmaktır. Montaj kodunu okumak (tarafından oluşturulan gcc -S -O2 -fverbose-asm) da yardımcı olabilir.

Linux Assembly HowTo okumak için iyi bir şeydir.

Mevcut işlemcinin komut seti mimarisi (yonga tarafından anlaşılan talimatlar kümesi) oldukça karmaşık. Yaygın olanlar x86 (32 bit modda tipik bir bilgisayar), X86-64 (64 bit modda bir masaüstü bilgisayar), ARM (akıllı telefonlar, ...), PowerPC vb. nedeniyle). Belki de önce öğrenmek, örneğin Knuth'un MMIX'i gibi bir varsayımsal komut seti daha basittir.


8
"İnsanlar C programlamıyor (...). Belki modern dilleri kullanıyorlar, belki de C arka
uçuyla

Kesinlikle katılıyorum. Ve şu anki çalışma projem (MELT, bkz. Gcc-melt.org ) C'ye çevrilmiş bir
DSL'dir


6
Peki ya oluşturmak ve montaj yapmak isteyenler? Bu kadar yaygın olmasalar da, makine kodunu öğrenmenin nedenleri var.
Jetti

Bir komut seti mimarisini öğrendiğini söyleyebilirim (montaj hatırlatıcılarını kullanarak). Talimatın tam olarak kodlanmasını açıkça nadiren öğrenirsiniz (örneğin, NOP 0x90'dır). Bir montajcı veya bir makine kodu üreticisi yazarken bunu bilmeniz gerekir. (Benzer şekilde, nadiren Unicode'un UTF8 kodlamasını da öğrenmeniz gerekir).
Basile Starynkevitch,

13

Daha önce de belirtildiği gibi Montajı öğrenin .

Assembly dili, bilgisayarlar, mikroişlemciler, mikrodenetleyiciler ve diğer programlanabilir cihazlar için düşük seviyeli bir programlama dilidir. Belirli bir CPU mimarisini programlamak için gereken makine kodlarının ve diğer sabitlerin sembolik bir gösterimini uygular.

Yani Meclis bir symbolic representation of machine code.

Şimdi “Tamam, peki hepsini nasıl öğrenebilirim?” Diye soruyor olabilirsiniz. Sormana çok sevindim:

  1. Ne olduğunu anlayın. Çok düşük seviyededir ve bir bilgisayarı çok derinlemesine anlamanızı sağlar. Vikipedi ile başlamak ve sonra bu kısa bölümü okumak isteyebilirsiniz .
  2. Öğren! En iyi okuma muhtemelen Muhtemelen Meclis Dili ve Meclis Dili Sanatıdır.
  3. Kodlamayı al!

Bu diğer konuyu okuyordum ve sanırım bunun üzerine yanıldım: programmers.stackexchange.com/a/82573/43388 bir eğitim bulabildiğim o türden bir şey? Ancak, geçişi kolaylaştırmak için önce montajı öğrenmem gerekiyor.
AceofSpades

1
Teşekkürler, sanırım popüler talep üzerine montaj öğrenmem gerekiyor. +1
AceofSpades

8

Hedefinizi tekrar gözden geçirmenizi şiddetle tavsiye ediyorum ve işte neden:

Önce BBC Mikrobilgisayarında 6502 Assembly Language (Model B, 32K) öğrendim. Makro birleştirici içeren harika bir BASIC uygulaması vardı. Onları okulda okuduk, böylece makineler 10 dakika boyunca kullanılmasaydı, her ekran boyunca, odanın etrafında (ağlar halinde) bir Lemming yürüyüşü yapmak için doğrudan ekran tamponu manipülasyonu gibi şeyler yapan her türlü yaramaz programı yazdım. . 7. Sınıf arkadaşlarım arasında kıkırdama uyuşmalarına neden oldu.

Bir Commodore 64'ü evdeyken, bunun yanında 6502 assembly dili olan 6510 işlemciye sahip olduğunu ve bazı ilginç ekstralar olduğunu öğrendim. Bir montajcı satın aldım ( kartuşla geldi ) ve programları BASIC aracılığıyla çağırdım. En çok satan oyun yazma vizyonuyla nihayetinde, bit-twiddled video görüntüleme donanımının korkak çip müziğine animasyonlu ilginç renk çubuğu efektleri yapmak için ara verdiğini kaydeden birkaç demo oluşturmayı başardım. Etkileyici, ama bu yararlı değil.

Daha sonra bir ARM2 işlemciye sahip olan bir Acorn Arşimet'i A310 aldım, bu yüzden BBC Micro (aynı miras) olarak yerleşik makro montajcısıyla aynı harika BASIC uygulamasını kullandım. Bir arty dostunun grafik sağladığı bir kaç oyun, ayrıca bazı sinüzoit tabanlı trippy demolarını bir araya getirmeyi başardım. Bunların ikisi de programlanması zor bir işti ve hatalı kod makineyi indirebilirdi (yanlışlıkla açma donanımı sıfırlama kaydı vb.), Kaydetmediysem her şeyi kaybediyor (diskete!).

Üniversitede C ++ ve böylece C. ile tanışmıştım. Sun / Solaris ve diğer bazı büyük ana bilgisayarları programlamak için kullanabildim. Bu makinelerin hangi CPU mimarisinde çalıştığı hakkında hiçbir fikrim yok - C ++ araçları bana profesyonel uygulamalar üretmek için ihtiyaç duyduğum gücü verdiğinden hiçbir zaman assembler kullanmamalı ya da makine kodu okumam gerekmedi.

Uni'den sonra Windows ve Unix'in çeşitli lezzetlerinde çalıştım. C ve C ++ tüm bu makinelerde çalıştı ve sonunda Java da yaptı.

Sonra hata ayıklama için kapsamlı bir araç zinciri ile DirectX ile C ++ kullanarak Windows ve Dreamcast üzerinde çalıştı.

Daha sonra Smart TV'ler için ARM tabanlı yonga setleri ile çalışmak üzere işe başladım (2000'de). Her ne kadar ARM2 ile olan deneyimim burada ilgili olsa da, iş C tabanlıdır. Arşimet'te yaptığım donanımlarla ilgili tüm dürtmelerin, basit bit titreyen işlemleri kullanarak C de yapılabileceğini öğrendim. Görevimin bir kısmı, kod tabanını Windows, Playstation 2, Linux, diğer TV ve mobil yonga setlerine geçirmek oldu. Bu platformların tümü hem C derleyicisi (genellikle GCC) hem de temel makineye yazmak için bir miktar API ile mevcuttu - gömülü dünya nadiren bir çekirdek O / S'dir. Bir önyükleyici ve mini BIOS yazmanın ötesinde herhangi bir platform için tam makine kodunu bilmeme hiç gerek yoktu, ikisi de mevcut ilk fırsatta C koduna atladı (tuzak vektörleri ayarladıktan sonra,

Bir sonraki iş Windows'ta C ++, C # ve JavaScript ile çalışıyordu. Makine kodu yok.

Şu anki iş çeşitli platformlarda C ++, JavaScript, Python, LUA, HTML ve diğer dillerle çalışıyor. Bu platformların hangi makine kodunu çalıştırdığı hakkında hiçbir fikrim yok, ne de bilmem gerek - derleyici kodumuzu olması gereken şeye çevirir. Eğer çökerse, hatayı hata ayıklayıcıda veya çalışma zamanı teşhisi sırasında (istisnalar, sinyaller, vb.) Yakalarım.

Eğlence için iOS uygulamalarını evde geçirdiğim az miktarda boş zamanlarında geliştiriyorum. Objective-C ve birden fazla yonga setinde çalışan bir API kullanır. Görünüşe göre onlar ARM tabanlı, ama gelişimimde hiçbir makine kodu görmedim.

Assembly dilini öğrenmek için büyüleyici bir alıştırma olsa da, şimdi daha büyük bir düzen (veya iki) daha üretken olmanıza izin veren daha yüksek seviyeli araçlar ve diller var.

Müthiş bir montaj dili / makine kodu programcısı için mevcut olan iş fırsatlarının sayısı, JavaScript, Java, C #, C ++ veya ObjC gibi bir şeye kıyasla küçüktür.

Bunu asıl amaçtan ziyade hobi / taraf ilgisi yapmanızı tavsiye ederim.


6
Bu bir hobi. İşlerin nasıl yürüdüğünü ve mümkünse onları çok temel düzeyde manipüle etmeyi öğrenmekle ilgileniyorum. +1
Ocak'ta 13:12

6

Benim önerim? MIPS'i öğrenin ve (basit) bir MIPS işlemcisinin nasıl oluşturulacağını öğrenin. Aslında göründüğünden daha kolay.

MIPS'nin diğer bazı mimarilere göre avantajı basitliğidir. Bir sürü küçük ayrıntıya kapılmayacaksınız, ancak diğer mimarilere kod yazmak için ihtiyaç duyduğunuz tüm büyük fikirleri öğreneceksiniz.

Tesadüfen, bu benim (üçüncü) sınıf içi CS sınıfımın son projesiydi. İsterseniz ödevi okuyabilir ve derslere video veya slayt olarak göz atabilirsiniz .

Diğer şeylerin yanı sıra, biz yaptığımız MIPS kod ikili dönüştü alır nasıl kapak; sınavlardaki bazı (çok basit) makine kodlarını bile çözmemiz gerekti.

Her şeyi kapsamayı istemeseniz bile, derslerin çoğu, öğrencilerin en sevdiği öğretim görevlilerinden biri tarafından verildi ve kendi başlarına izlemek eğlencelidir.


Bağlantılar için çok teşekkür ederim ve nereden başlamalıyım açıklıyor. +1
Ocak'ta 13:12

6

Ben Java'dan C ++ 'ya ve C'ye kadar programlama ve sevme konusunda yeni bir öğrenciyim. Geriye dönüp barbarlara taşındım ve Meclise devam etmeyi düşündüm.

Almak için mükemmel bir yol. C'den Meclise ve daha aşağıya atlayışım (düşüş?) Aynı isimdeki kitaba dayanan bir Bilgisayar Kursu ve Tasarımı dersi oldu .

Bu kitabı, temel MIPS montajındaki ilk bölümler için boru hattı ve bellek mimarisi boyunca tavsiye ederim. Daha da iyisi, aynı tema etrafında bir kursa katılmak veya çevrimiçi bazı dersler bulmak olacaktır.

Ayrıca ellerinizi kirli yazma düzeneği almak için MARS MIPS Simülatörü bakın .


4

Makinenin tam olarak nasıl çalıştığını anlamak istiyorsanız, neden mümkün olan en düşük seviyeye gitmiyorsunuz ve bulunduğunuz yere kadar yükselmiyorsunuz (örneğin, C, C ++)?

Demek istediğim: neden bir devre üzerinde transistörlü kendi 4-bit toplayıcıyı oluşturmuyorsun (talimatlar / eğitim için arıyorsanız sadece Google)?

Ondan sonra biraz RAM ile küçük bir bilgisayar inşa edin ve sonra Assembly'yi öğrenmeye başlayın ve onunla bir veya iki program yazın.


Orijinal poster sıfırdan bir bilgisayar yaparsa , kendi derlemesini tanımlaması (sadece öğrenmesi gerekmez) gerekir.
Basile Starynkevitch

@ daniels Gerçek düşük seviyeli olan bitlerden eklemeyi öğrenerek nedenleri anlıyorum. +1
AceofSpades

Bir bilgisayarı sıfırdan inşa etmenin bir alternatifi, Z80 veya 6502 gibi, hala anlaşılması kolay olan bazı eski işlemcileri (ve onun montaj dilini) öğrenmek olabilir. Sanırım oynayabileceğiniz emülatörler bile var.
Giorgio

@AceofSpades CPU'ları ve CPU bileşenlerini (örneğin bir toplayıcı) kolayca oluşturmak için harika bir yol Minecraft'ta redstone'dur, bunu tavsiye ederim. Minecraft'ta bazı basit makineler üzerinde çalışmaya başladım ve bilgisayarların arkasındaki teori ve mantığı anlamamı oldukça arttırdı.
Aaron,

1

Bunun için yapılmış bir talimat setine, bir simülatöre ve temeller üzerine bazı derslere ders için bir talimat veya konsept verdim. Sadece programı yazın, çalıştırın ve sonra ne yaptığını öğrenin, bir sonraki derse geçin.

http://www.github.com/dwelch67/lsasim

Ayrıca birkaç ana komut setinde de simülatörüm var. Asm öğrenmede kullanmak için iyi olan herhangi biri veya hepsi (x86'yı gerçekten öğrenmek zorunda kaldığınızı düşünüyorsanız, en son öğrenin ve çatalladığım gibi bir simülatör kullanın, sonra ilk önce 8088/86 ileri gidin). Bir simülatöre karşı öğrenmenin artıları ve eksileri vardır, özellikle de başlangıçta büyük bir profesyonel, hiçbir şeyi mahvetmemeniz ve görüşün büyüklüğüdür. Yeni bir talimat setini öğrenmek için önce gömülü bir platforma, mikrokontrolcüye, vb. Atlamak, neler olup bittiğini görememekle birlikte, başarısız olmanın uzun bir yolunu gösteren ...


1

Charles Petzold'un Kodu konuya çok iyi bir giriş niteliğindedir ve makine, tezgah ve RAM dizilerinin nasıl oluşturulacağını ve makine kodunu ve montaj dilini ve bunların üst seviye dillerle ilişkisini içeren bir bilgisayar oluşturma işlemini açıklar. Aynı zamanda bilgisayar tarihi hakkında büyük bir okuma.

Ve bu soruyu daha önce kullanılabilecek electronics.stackexchange'te okudum


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.