2016-04-02 15 views
-4

Basit bir c programının gcc'sini kullanarak derlenmiş bir ikili dosyam var. Kendi disketleyicimi yazıyorum, ELF başlığını ve ELF dosyalarından diğer başlıkları okuyabiliyorum.Opcode/makine kodundan montaj talimatları veya anımsatılar nasıl edinilir?

ELF ikili dosyasından ".text" bölümünü okuyorum. Ve operasyonu mnemonics/assembly komutuna dönüştürmeye çalışıyorum.

Nasıl ham opcode/makine kodu mnemonics/assembly komutuna dönüştürülür ?? C kaynak kodu:

#include <stdio.h> 

int main() 
{ 
    int i = 10; 
    int j = 22 + i; 

    return 0; 
} 

takiben i ELF dosyasını okuduktan sonra aldık ham opcode örneğidir:

55 ffffff89 ffffffe5 ffffff83 ffffffec 20 ffffffc7 45 ffffffec 3 ffffffc7 45 
fffffff0 41 ffffffc7 45 fffffff4 8 ffffffc7 45 fffffff8 21 ffffff8b 45 
ffffffec ffffff83 ffffffc0 16 ffffff89 45 fffffffc ffffffb8 ffffffc9 ffffffc3 
+0

Disassembler'ınızın muhtemelen tüm opcodes'ların bir listesini ve bunlara karşılık gelen talimatları eklemesi gerekir ve ayrıca tüm önekleri ve ModR/M ve SIB baytlarını ayrıştırmak zorunda kalır. Tüm bu bilgileri [Intel'in kılavuzları] 'nda bulabilirsiniz (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html). – Michael

+3

Kodunuzu düzeltmeniz gerekir, böylece 8 bit değerlerini yazdırmadan önce 32 bit'e kadar uzatmaz. –

+2

** 'imzasız char' ** seçeneğini kullanarak opcode değerlerini okuyun ve'% 02x' ile yazdırın. –

cevap

2

Eğer (muhtemelen var) yüklü GNU binutils varsa soru ise, "o ffffff rakamları elde Neden", o zaman bize kodu göstermek gerekir

objdump --disassemble elf-file 

kullanabileceğiniz sayıları üretir. Büyük olasılıkla imzalı karakterlerden int'ye bir işaret uzantısı sorunu yaşatıyorsunuz.

+2

Tabii ki onlar (http://stackoverflow.com/questions/36370689/what-numeric-values-defines-in-dissembled-of-c-code) –