/i/Yazılım

Umuyoruz ki geleceğin yazılımcıları bu altinciden çıkacak!
    başlık yok! burası bom boş!
  1. 4.
    0
    şuku bi ara uğraşıcam sana atarım mesaj bi el atarsın
    ···
  2. 3.
    +3
    bunu ülkenin başına geçirelim lan kafasi çalişiyor herhalde bunun
    ···
  3. 2.
    +1
    Beynim dondu aq
    ···
  4. 1.
    +2
    Panpalar acil yardım lazım.

    8086 komut setini emüle edecek bir sanal makine yazıyorum. Tabii bunun için de makine dilini enkode etmek gerek.

    686 ve 8086 Assembly'i zaten bildiğim için ve Assembly'nin makine dilinin daha kolay anlaşılabilmesi için metinleştirilmiş bir halden ibaret olduğundan dolayı (Mesela MOV EAX, 10h assembly komutu B8 10 00 00 00 makine dili komutuna eşdeğer. MOV EAX makine dilinde B8'in karşılığı, 10h da makine diline çevrilirken little endian formatında 10 00 00 00 olarak kodlanmış) kolayca yaparım diyordum.

    Ama öyle olmadı, byteları okurken çok fazla şeye dikkat etmem gerekiyor.

    B8 (MOV EAX, imm32/16) gibi komutlar basit ama mesele CMP gibi karmaşık komutlara gelince her şey karışıyor. Demek istediğim CMP gibi karışık komutlar ile alakalı çok fazla kombinasyon var. Aynı anda segment override aktif olabilir, size override aktif olabilir, hepsi için teker teker kontrol yaptıkça kod gereksiz yere aşırı derecede şişiyor.

    8086'dan iyi anlayan panpalar yardım edin.

    Edit:

    Şu an kodumun çalışma mantığı şöyle:

    Öncelikle kodda her bir prefix grubuna ait prefixi kontrol ediyorum. Bulduğum her prefix grubuna ait prefix için o prefixi seçiyorum ve IP'yi 1 arttırıyorum. Sonra extended opcode prefix (0x0F) kontrolü yapıyorum. Eğer o da varsa IP'yi 1 arttırıp opcode'u extended opcode tablosundan, yoksa IP'yi arttırmayıp normal opcode tablosundan opcode'u fetch ediyorum. Kodu fetch ettikten sonra eğer tek bytelık bir opcode ise son 3 biti register biti olduğu için oradan hangi register'a veri yazılacağını bulup IP'yi bir arttırıyorum ve x byte operand aldıktan sonra IP'yi x arttırıyorum.

    Ama her bir opcode için farklı farklı şeyler gerekince kod aşırı uzunlaştı, x86emu tarzı emülatörler bunu nasıl bu kadar az kodla yapabiliyor?
    ···