Basit talimat kodlama

Oct 07 2020

Aşağıdaki montaj talimatını alalım:

add    %cl,%bl

Bu 00 cb, şu şekilde veya 00000000 11001011ikili olarak kodlanır . cbModR / M bit alanlarına koymak şöyle görünür:

  1   1   0   0   1   0  1   1
+---+---+---+---+---+---+---+---+
|  mod  |    reg    |    r/m    |
+---+---+---+---+---+---+---+---+

Ve burada kayıt alanına baktığımızda şunu elde ederiz:

  • mod: 11(Adresleme modunu kaydet)
  • reg: 001(cl kaydı)
  • r / m: 011(bl yazmacı)

Ve inanıyorum 000000dsolduğu addtalimat ve d=s=0hepsi kayıtları konum beri. Bu talimatın nasıl kodlandığının doğru bir anlayışı mı? Ek olarak, 'tam kodlama' şeması için aşağıdakiler doğru olur (bayt cinsinden değil bit cinsinden):

[empty]         0x0         0b11001011     [empty]        [empty]          [empty]
_ _ _ _        _ _             _              _           _ _ _ _          _ _ _ _
Prefix      Instruction    Mod-reg-r/m      Scale       displacement      immediate

Talimatı 'deşifre etme' girişimimde eksik olduğum şeyler var mı?

Yanıtlar

2 PeterCordes Oct 08 2020 at 04:14

Evet, doğru görünüyor.

Genel model (8086'ya dayanan "eski" ALU talimatları için) kodlamaya op r/m, rkarşı op r, r/m8 bit ve 16/32 bit için normal bir modelde işlem kodu baytının düşük 2 bitini kullanır, ancak buna gerek yoktur buna güvenmek için.

Intel, her bir talimatın her kodlaması için cilt 2 kılavuzunda tam olarak neler olduğunu belgeliyor. addÖrneğin İşlem / En sütunu ve İşlenen Kodlama tablosuna bakın . (Ayrıca bakınızhttps://ref.x86asm.net/coder64.htmher işlem kodu için hangi işlenenin hangisi olduğunu da belirtir). Bunların ikisi de hangi işlem kodlarının ModRM bayt aldığını ve hangilerinin almadığını bilmenizi sağlar.

Bunlar elbette Intel sözdizimi sırasını kullanır. İşlemci listesinin Intel ve AMD kılavuzlarına karşı sırasını tersine çeviren AT&T sözdizimini kullanırken kılavuzları ve öğreticileri takip etmeye çalışarak hayatınızı daha karmaşık hale getiriyorsunuz.

Örneğin 00 /r, işlenen kodlaması olarak listelenirMR , görebildiğimiz tablodan 1 = işlenen ModRM:r/m (r, w), yani okunup yazılır ve r/malan tarafından kodlanır . işlenen 2 = ModRM:reg (r), bu nedenle regalan tarafından kodlanmış salt okunur bir kaynaktır .

Eğlenceli bir gerçek: 00 00olduğu add [rax], alveya AT & Tadd %al, (%rax)

GAS'tan şu kodlamalardan birini seçmesini isteyebileceğinizi unutmayın: x86 XOR işlem kodu farklılıkları

{load}  add    %cl,%bl        # 02 d9
{store} add    %cl,%bl        # 00 cb

Ayrıca bkz.MOV r / m8, r8 ve MOV r8, r / m8 arasındaki fark