Montaj kodu vs Makine kodu vs Nesne kodu?


227

Nesne kodu, makine kodu ve montaj kodu arasındaki fark nedir?

Farklarının görsel bir örneğini verebilir misiniz?


Ayrıca "nesne kodu" adının nereden geldiğini merak ediyorum. "Nesne" kelimesinin anlamı ne? Bir şekilde nesne yönelimli programlama veya sadece bir ad tesadüfüyle mi ilgili?
SasQ


Nesne kodunun ne olduğunu sormuyorum, Yüzbaşı Obvious. Adı nereden geldi ve neden "nesne" kodu denir soruyorum.
BarbaraKwarc

Yanıtlar:


296

Makine kodu , doğrudan CPU tarafından çalıştırılabilen ikili (1'ler ve 0'lar) kodlardır. Bir metin düzenleyicide bir makine kodu dosyasını açmak için olsaydı sen basılamaz karakterler dahil çöp görecekti (hayır, o , basılamaz karakterler;)).

Nesne kodu , makine kodunun henüz tam bir programa bağlı olmayan bir kısmıdır. Tamamlanmış ürünü oluşturan belirli bir kütüphane veya modülün makine kodudur. Ayrıca, tamamlanmış bir programın makine kodunda bulunmayan yer tutucular veya ofsetler içerebilir. Bağlayıcı bağlantı herşey birlikte ile bu tutucuları ve uzaklıklar kullanacaktır.

Montaj kodu , çoğunlukla makine talimatları ile doğrudan 1: 1 analogu olan düz metin ve (bir şekilde) insan tarafından okunabilen kaynak kodudur. Bu, gerçek talimatlar, kayıtlar veya diğer kaynaklar için anımsatıcılar kullanılarak gerçekleştirilir. Örnekler JMPve MULTCPU atlama ve çarpma talimatları için. Makine kodunun aksine, CPU montaj kodunu anlamıyor. Bir kullanımı ile makineye montaj kodu dönüştürmek assembler veya derleyici genellikle işlemci talimatlardan daha da soyutlanmış yüksek düzeyli bir programlama dili ile birlikte derleyici düşünmek olsa.

Tam bir program oluşturmak, program için kaynak kodunun derleme veya C ++ gibi daha üst düzey bir dilde yazılmasını içerir . Kaynak kodu, nesne koduna monte edilir (montaj kodu için) veya (daha üst düzey diller için) derlenir ve ayrı modüller, son programın makine kodu olmak için birbirine bağlanır. Çok basit programlar söz konusu olduğunda bağlantı adımına gerek olmayabilir. IDE (entegre geliştirme ortamı) gibi diğer durumlarda, bağlayıcı ve derleyici birlikte çağrılabilir. Diğer durumlarda, ortama son uygulamanın nasıl oluşturulacağını söylemek için karmaşık bir make komut dosyası veya çözüm dosyası kullanılabilir.

Farklı davranan, yorumlanmış diller de vardır . Yorumlanan diller, özel bir tercüman programının makine koduna dayanır. Temel düzeyde, bir tercüman kaynak kodunu ayrıştırır ve komutları hemen yeni makine koduna dönüştürür ve yürütür. Bazen çalışma zamanı ortamı veya sanal makine olarak da adlandırılan modern tercümanlar çok daha karmaşıktır: bir seferde kaynak kodun tüm bölümlerini değerlendirmek, mümkün olduğunda önbelleğe almak ve optimize etmek ve karmaşık bellek yönetimi görevlerini yönetmek. Yorumlanan bir dil, montaj koduna benzer şekilde, daha düşük seviyeli bir ara dile veya bayt koduna önceden derlenebilir.


24
+1: güzel, ama biraz basitleştiren cevap - tüm montaj talimatları makine talimatlarına 1: 1 çevrilmez ve nesne dosyaları başka veriler de içerebilir (yer değiştirme bilgileri, sembol tabloları, ...)
Christoph

5
İlk sayınız için, ikincisini daha net hale getirmek için düzenlenmiş bir gelincik kelimesi eklendi.
Joel Coehoorn

2
@Christoph: "tüm montaj talimatları 1: 1 makine talimatlarına çevrilmez" dersiniz, lütfen bir örnek verin.
Olof Forshell

5
@Olof: RISC mimarileri bazen montaj düzeyinde bir sanal talimat seti sağlar - örneğin MIPS sözde talimatları ( en.wikipedia.org/wiki/MIPS_architecture#Pseudo_instructions )
Christoph

3
@Panzercrisis Montajcı tarafından hiçbir şey eklenmedi. Gerçek makine talimatlarına yazdıklarınızın doğrudan çevirisi. Ve "gereksiz" derleyiciler tarafından eklenen ekstra kodu çağırmak olmaz
Joel Coehoorn

125

Diğer cevaplar farkın iyi bir açıklamasını verdi, ama siz de bir görsel istediniz. İşte C kodundan bir yürütülebilir dosyaya yolculuk ettiklerini gösteren bir diyagram.


3
Bunu gerçekten yararlı buluyorum, ancak "Makine kodu" etiketi eksik
Alexx Roche

Peki çalıştırılabilir kod seviyesinde olduğunda, bu makine koduna eşdeğer midir?
CMCDragonkai

3
Bu şema bağlamında, "nesne kodu" makine kodudur.
Grafik Noob

5
Aslında, hem nesne kodu hem de yürütülebilir kod makine kodlarıdır. fark, nesne kodunun tamamlanmış program olmamasıdır. Tam bir yürütülebilir program / kod oluşturmak için şemada gösterildiği gibi diğer yardımcı kütüphane / modül kodlarıyla birleştirilmesi gerekir.
okey_on

@okeyxyz, işlemci tarafından doğrudan yürütüldüğünü söylemek ne düzeyde doğru olur? Montajcıdan sonra, bağlayıcıdan sonra, yükleyiciden sonra, mikrodenetleyiciye dönüştürüldükten sonra?
Celeritas

49

Montaj kodu, makine kodunun okunabilir bir temsilidir:

mov eax, 77
jmp anywhere

Makine kodu saf onaltılık koddur:

5F 3A E3 F1

Bir nesne dosyasındaki gibi nesne kodu demek istediğinizi varsayalım. Bu, makine kodunun bir varyantıdır, bir sıçrama, bir bağlayıcının bunları doldurabileceği şekilde parametrelenmiştir.

Montajcı, montaj kodunu makine koduna (nesne kodu) dönüştürmek için kullanılır. Bağlayıcı, yürütülebilir bir nesne oluşturmak için birkaç nesne (ve kütüphane) dosyasını birbirine bağlar.

Bir kez saf hex bir montajcı programı (montajcı yok) yazdım Neyse ki bu iyi eski (eski) 6502 geri yoluydu. Ama pentium opcodes için montajcılar var sevindim.


76
Hayır, hayır, hayır, hayır. Makine kodu onaltılı kod değil. saf bir ikili. Onaltılı kod sadece ikili uygun bir temsilidir.
Breton

56
Gerçekten aşırı uçlara gidersek, ikili değil, bir devrede depolanan elektrik miktarıdır. ;-)
Toon Krijthe

17
Evet tabi ki. Orada onaltılık arasında bir ilişki olduğunu ve "Makine Kodunu" diyeceğimiz, ancak onaltılık söylemek oldukça doğru değil ise makine kodu. Söylemeye çalıştığım tek şey bu.
Breton

9
@Breton Bu anlamda "onaltılı kod" diye bir şey yoktur, değil mi? "Onaltılı kod" makine kodunu görüntülemenin bir yoludur. Makine kodunu onaltılık, ikili, sekizli, ondalık veya istediğiniz gibi görüntüleyebilirsiniz. Yine bu anlamda bir de "ikili kod" yoktur. Yine, "ikili kod" sadece makine kodunu görüntülemenin bir yoludur.
Utku

9
@Breton Söyledikleriniz gerçekten bir anlam ifade etmiyor .. İkili, tıpkı hex gibi bir temsil yoludur. Onaltılık değilse, ikilik de değildir.
Koray Tugay

18

8B 5D 32 makine kodu

mov ebx, [ebp+32h] montaj

lmylib.soiçeren 8B 5D 32nesne kodu


8

Henüz belirtilmeyen bir nokta, birkaç farklı montaj kodu türünün olmasıdır. En temel biçimde, talimatlarda kullanılan tüm sayılar sabit olarak belirtilmelidir. Örneğin:

1902 $: BD 37 14: LDA 1437 $, X
1905 $: 85 03: 03 $ STA
1907: 85 09: 09 dolar
1909 $: CA: DEX
190A: 10: 1902 BPL

Yukarıdaki kod biti, bir Atari 2600 kartuşunda 1900 $ adresinde saklanırsa, 1437 $ adresinden başlayan bir tablodan getirilen farklı renklerde bir dizi satır görüntüler. Bazı araçlarda, bir adresin yazılması, yukarıdaki satırın en sağ kısmı ile birlikte, orta sütunda gösterilen değerleri belleğe kaydeder ve bir sonraki satıra aşağıdaki adresle başlar. Bu formdaki kodu yazmak, onaltılık yazımdan çok daha uygundu, ancak her şeyin kesin adreslerini bilmek zorundaydı.

Çoğu montajcı, birinin sembolik adresleri kullanmasına izin verir. Yukarıdaki kod daha çok şöyle yazılır:

rainbow_lp:
  lda ColorTbl, x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow_lp

Montajcı, LDA talimatını otomatik olarak ayarlayacak, böylece ColorTbl etiketine hangi adresin eşlendiğini gösterecektir. Bu tip birleştirici kullanmak, kod yazmayı ve düzenlemeyi, tüm adresleri el ile tuşlamak ve el ile tutmak zorunda kaldığında mümkün olandan çok daha kolay hale getirir.


1
+1. Bir ek nokta daha var: En ünlüleri Intel ve AT&T olmak üzere farklı montaj dili sözdizimleri de var .
informatik01

1
@ informatik01: Zilog Z80 vs Intel 8080 anımsatıcılarına ne dersiniz? Sanırım Intel vs AT&T sözdizimi savaşından önce gelir.
supercat

Tartışmaya gerek yok, sadece bu yönden (farklı sözdizimi) bahsettim ve en popüler / iyi bilinen / ünlü iki sözdiziminin bir örneğini verdim.
informatik01

4

Kaynak kodu, Montaj kodu, Makine kodu, Nesne kodu, Bayt kodu, Yürütülebilir dosya ve Kütüphane dosyası.

Tüm bu terimler çoğu insan için karşılıklı olarak ayrıcalıklı olduklarını düşündükleri için çoğu zaman kafa karıştırıcıdır . İlişkilerini anlamak için şemaya bakın. Her terimin açıklaması aşağıda verilmiştir.


Kod türleri


Kaynak kodu

Okunabilir (programlama) dilde talimatlar


Üst düzey kod


C, C ++ ve Java programları gibi yüksek seviyeli (programlama) bir dilde yazılmış talimatlar


Montaj kodu

Bir montaj dilinde yazılmış talimatlar (bir tür alt seviye programlama dili). Derleme işleminin ilk adımı olarak, üst düzey kod bu forma dönüştürülür. Daha sonra gerçek makine koduna dönüştürülen montaj kodudur. Çoğu sistemde, bu iki adım derleme işleminin bir parçası olarak otomatik olarak gerçekleştirilir.
ör. program.asm


Nesne kodu

Bir derleme işleminin ürünü. Makine kodu veya bayt kodu şeklinde olabilir.
ör. dosya.o


Makine kodu

Makine dilinde talimatlar.
ör. a.out


Bayt kodu

JVM gibi bir tercüman tarafından yürütülebilen bir ara formda talimat.
ör. Java sınıfı dosyası


Çalıştırılabilir dosya

Bağlama işleminin ürünü. CPU tarafından doğrudan çalıştırılabilen makine kodlarıdır.
örneğin, bir .exe dosyası.

Bazı bağlamlarda bayt kodu veya komut dosyası dili yönergeleri içeren bir dosyanın da yürütülebilir olarak değerlendirilebileceğini unutmayın.


Kütüphane dosyası

Bazı kodlar, yeniden kullanılabilirlik gibi farklı nedenlerle bu forma derlenir ve daha sonra yürütülebilir dosyalar tarafından kullanılır.


1
Tüm meclisin insanlar tarafından yazılan ve / veya sürdürülen en katı kod anlamında gerçekten kaynak olmadığını iddia ediyorum . Genellikle kaynaktan makine tarafından üretilir ve asla insan tüketimi için tasarlanmamıştır (örneğin, gcc gerçekten cc1yürütülebilir dosyanın içinde yerleşik bir montajcıya sahip olmak yerine ayrı bir montajcıya beslediği bir asm metni oluşturur ). Bence asm dairesi "kaynak" dairenin sol tarafına yapışmalıdır, çünkü bazı asm kaynak değil sadece asmdır. Tabii ki hiçbir zaman nesne kodu değildir, ancak bazı asm kaynaktan nesne dosyalarına giden yolda bir adımdır.
Peter Cordes

@PeterCordes Yorum için çok teşekkür ederim. Gcc'nin çalışması hakkında ne söylediğinin farkında değildim. Ancak, sizinle tamamen aynı fikirde olabilirsem korkarım. Demek istediğim, kaynak kodu, insan tarafından okunabilen bir programlama dili kullanılarak yazılmış bir şeydir. İnsanlar tarafından yazılabilir veya korunmayabilir. Dönüştürücülerden haberdar olacağınızdan eminim. Size göre, böyle bir derleyicinin ürününü hangi kategoriye koyacaksınız? Kaynak kodu mu yoksa başka bir şey mi? Yanılıyorsam lütfen beni düzeltin. Daha fazla yorum her zaman beklerim.
Bertram Gilfoyle

1

Montaj kodu burada tartışılmıştır .

"Bir montaj dili, bilgisayarları programlama için düşük seviyeli bir dildir. Belirli bir CPU mimarisini programlamak için gereken sayısal makine kodlarının ve diğer sabitlerin sembolik bir temsilini uygular."

Makine kodu burada tartışılmıştır .

"Makine kodu veya makine dili doğrudan bilgisayarın merkezi işlem birimi tarafından yürütülen bir talimatlar ve veriler sistemidir."

Temel olarak, derleyici kodu dildir ve bir derleyici (bir derleyiciye benzer) tarafından nesne koduna (CPU'nun çalıştığı yerel kod) çevrilir.


1

Bence bunlar ana farklar

  • kodun okunabilirliği
  • kodunuzun ne yaptığı üzerinde kontrol

Okunabilirlik, kodun litte çaba ile oluşturulduktan 6 ay sonra iyileştirilmesini veya değiştirilmesini sağlayabilir, diğer yandan performans kritikse, üretimde sahip olacağınız belirli donanımı hedeflemek için düşük seviyeli bir dil kullanmak isteyebilirsiniz. daha hızlı yürütme.

Günümüzde IMO bilgisayarlar, bir programcının OOP ile hızlı bir şekilde çalışmasını sağlayacak kadar hızlıdır.


1

Montaj, insanların anlayabileceği kısa bir terimdir ve doğrudan bir CPU'nun kullandığı makine koduna çevrilebilir.

İnsanlar tarafından biraz anlaşılabilir olsa da, Assembler hala düşük seviyededir. Yararlı bir şey yapmak çok kod gerektirir.

Bunun yerine C, BASIC, FORTAN gibi daha yüksek seviyeli diller kullanıyoruz (tamam biliyorum kendimle çıktığımı biliyorum). Derlendiğinde bunlar nesne kodu üretir. İlk diller nesne kodu olarak makine diline sahipti.

Bugün birçok dil, böyle bir JAVA ve C # genellikle makine kodu olmayan, ancak makine kodu üretmek için çalışma zamanında kolayca yorumlanabilen bir bayt koduna derlenir.


Java ve C # ile ilgili yorumunuz her ikisi de bayt kodlarının yorumlanmaması için Just In Time derlemesini kullanır. C # (genellikle .NET), daha sonra hedef CPU için yerel makine diline JIT uygulanan Orta Dil (IL) derler.
Craig Shearer

-1

Programlarınızın kaynak dosyaları nesne dosyalarına derlenir ve daha sonra bağlayıcı bu nesne dosyalarını birbirine bağlayarak mimarinizin makine kodlarını içeren yürütülebilir bir dosya oluşturur.

Hem nesne dosyası hem de yürütülebilir dosya, bir metin düzenleyicisi tarafından açıldığında mimarinin makine kodunu yazdırılabilir ve yazdırılamayan karakterler biçiminde içerir.

Bununla birlikte, dosyalar arasındaki ikilik, nesne dosyalarının çözülmemiş harici referanslar (örneğin) içerebilmesidir printf. Yani, diğer nesne dosyalarına bağlı olması gerekebilir .. Yani, çözülemeyen harici referansların C / C ++ çalışma zamanı kütüphanesi gibi diğer nesne dosyalarıyla bağlantı kurarak iyi çalıştırılabilir yürütülebilir dosyayı elde etmek için çözülmesi gerekir. .

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.