Basit talimat kodlama
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
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