Montaj kodu Nesne koduna çevrildiğinde ne olur?


1

Sistem Yazılımı geliştirme ile ilgileniyorum. Bir derleyicinin çalışmasını birkaç gündür analiz ediyorum. Derleyici tarafından üretilen bir derleme kodu (diyelim) clc bir opcode var f8 ve yukarıdaki anımsatıcıyı birleştiren Assembler'ın opcode'un yerine geçtiğinden eminim. f8 burada.

Beni rahatsız eden şey, bu aşamadan sonra (Aradaki bağlantı aşamasının farkındayım).

Yani, bu aşamadan sonra tam olarak ne oluyor? Son çalıştırılabilir dosyanın ham bir ikili dosya olduğunu söyleyin. Bu opcode anlamına mı geliyor f8 ikili verilere dönüştürülür 1111 1000 ve dosyada saklanır?

Bu durumda, neden bir ikili dosyanın ikili içeriğini normal bir metin editörü kullanarak (Notepad) söyleyemiyorum - sonuçta '0'lar ve' 1'ler doğru mu?


"Aradaki Bağlanma aşamasının farkındayım" - Yanlış, bağlama aşaması sonra montaj. "Bu aşamadan sonra tam olarak ne oluyor" - Derlemenin yer değiştirebilir nesne kodu (diğer nesne dosyalarıyla bağlantılı olabilir) veya mutlak nesne kodu üretip üretmediğine bağlıdır. “Sonuçta '0' ve '1 haklı' - Evet, ancak bir metin editörü daima bu ikili veriyi metin için kod olarak görür (örneğin, ASCII). Çözücü Verileri makine kodu olarak değerlendirecek ve opcod ve operandları
sawdust

1
Bir anahtar noktayı kaçırıyorsunuz f8 "dönüştürülmüş" olması gerekmez, zaten olduğu 1111 1000 Onlar sadece aynı şeyin farklı temsilleridir. Biri hex, diğeri binary olarak gösterilmiştir. Hex, biraz daha okunaklı olma avantajına sahiptir ve bu durumda f1 1111 ve 8 = 1000 olan ikili kuadları tek hanelere bölmenin düzgün bir yan etkisi vardır. CPU tarafından kullanılan temel ünite ikili hanedir, ancak insanlar Onaltılık gösterimleri kullanın.
Mokubai

Yanıtlar:


2

İlk önce, her zaman iş için doğru aleti kullanın. İkili dosyaları görüntülemek için kullanılan metin editörü, çivilemek için bir bıçak kullanmakla aynıdır. Bu tür görevler için herhangi bir HEX görüntüleyici / düzenleyici kullanın veya söz konusu ikili dosyanın içindekileri bilen aracı kullanın. Eğer CPU'nun kodları hakkında konuşursak IDA Pro ücretsiz veya OllyDbg Yürütülebilir dosyaların içindekileri analiz etmek için yararlı olacaktır.

Bu opcode anlamına mı geliyor f8 ikili verilere dönüştürülür 1111 1000 ve dosyada saklanır?

@Mokubai tarafından doğru bir şekilde belirtildiği gibi - 0xF8 aynı sayıdır 1111 1000bir tanesi HEX notasyonunda, sonuncusu ikili gösterim olarak gösterilmiştir. Ondalık sistemde 248 ile aynıdır.

CPU opcode'larından (veya derleyici assembler kaynak kodunu) elle çalıştırılabilir kod oluşturuyorsanız, i386 CPU tanıyacaktır 0xF8 (veya 0b11111000 veya 248 - hepsi aynı) CLC talimat.

Derleyici tarafından oluşturulan bir derleme kodu clc bir opcode var f8 ve   Assembler'in yukarıdaki anımsatıcıyı topladığından eminim   op kodunu değiştirir f8 burada.

Bu doğru, ancak - "Derleyici tarafından oluşturulan bir derleme kodu". "Montaj kodu" ile kod kodları arasındaki farkı doğru anladığınızdan emin olmak istiyorum. Opcodes, CPU'nun anlayabileceği tam bir dildir, sadece sayılardır (CPU mnemonics aka assembler çevirmenleri bir rüya iken ilk bilgisayarları nasıl programladığımızdır)

Günümüzde, çoğunlukla "doğrudan" derlemeyi yüksek seviye programlama dilden doğrudan CPU işlem kodları üreten C / C ++ / GoLang gibi derleyicilerle çalıştırılabilir ikili dosyalara kullanıyoruz.
(Aslında “doğru derleme” dediğimde doğru değil, başlık derleyicileri altında çalıştırılabilir ikili dosyalar üretmeden önce birden fazla adım atıyorlardı, ancak son kullanıcı için benzinin nasıl harekete dönüştüğünü bilmeye gerek kalmadan bir araba kullanıyormuşuz gibi görünüyor)

Yorumda @ sawdust tarafından doğru bir şekilde belirtildiği gibi, üst seviye programlama dilleri CPU opcodları oluşturmak için farklı stratejiler kullanabilir. Örneğin analiz edebilirsiniz gcc derleyici, kodları yapmak için kullanılacak birleştirme kodu üretmesini söyleyerek, kodları nasıl pişireceğini derleyici (nesne kodları)

 gcc -S -o myprogram.asm myprogram.c

Bu durumda, neden ikili içeriğini göremiyorum   normal bir metin editörü kullanarak bir ikili dosya (Not Defteri) diyor - sonuçta   '0 ve' 1 doğru mu?

Not Defteri başka bir dil konuş. ASCII, Notepad için "Yunan" olan başka bir şey kendi "opcodes" ini anlıyor.


1
"C / C ++ / GoLang gibi derleyiciler" montaj kodu "oluşturmaz, ancak doğrudan opcod oluşturur" - Belki bir istisna bulabilirsin, ama bu genel olarak doğru değil. Nesne kodu oluşturmadan önce en az üç C derleyicisi ve oluşturulan üç derleme kaynağının hepsini kullandım. Bunu biliyorum çünkü derleyici hatalarını en iyi duruma getirme hatalarını bildirmek zorunda kaldım ve derleyicinin C'den hatalı kod oluşturduğunu kanıtlamak için assembler çıktısını kullandım
sawdust

OP’yi kabul ederek yanıltıcı f8 "ikili" ye dönüştürülür. Hiçbir gerçek dönüşüm gerçekleşmez, ne de yapması gerekmez, bunlar tamamen aynı şeyin temsilleridir. f8 sadece daha insanın okunabilir bir temsilidir 1111 1000.
Mokubai

@Mokubai Hayır Ben 'f8' -> gt; binary dedim ya clc anımsatıcı - & gt; f8 hangisi 11111000. f8 ve 11111000 Aynı sayının sadece farklı gösterimidir
Alex

@sawdust Haklısın, demek istedim gcc -o binexe source.c. Cevabımı düzelteceğim
Alex

Alıntı yaptığınız ve daha sonra olumlu cevap veren ve ardından netleştirdiğiniz belirli bir soru soruyor. Aşağıdaki cümlenin doğruluğuna itiraz etmiyorum, ancak cümlesinin ilk bölümünü doğrudan doğrudan "evet" olarak vermesi, sorusunu yanıtlayana, onun varsayımının doğru olduğu ve bazı ilave dönüşüm adımlarının olduğu izlenimini verebilir. . "Evet" i kaldırmak yeterli olacaktır.
Mokubai
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.