Terim Belirteçleri
Önceki Linux için Satıriçi Sembolik Makina Dili (Inline Assembly) Sonraki
Terim Belirteçleri
Daha önce anlatıldığı gibi, "asm" yapısındaki her terim parantez içindeki bir C deyimi tarafından takip edilen bir terim belirteci tarafından dizi olarak açıklanmalıdır. Terim belirteçleri gerektiği gibi terimin komuttaki adresleme yöntemini tespit ederler. Bunun dışında belirteçler:
  • Terimin bir yazmaçda tutulabilirliğini ve tutulabileceği yazmaç türünü
  • Terimin bellek göstericisi mi olduğunu ve bu durumda tutabileceği adres türlerini
  • Terimin direk bir sabit mi olduğunu da belirtir.
Belirteçler karşılaştırma için iki terim gerektirebilirler. Geçerli bir kaç belirteç çeşitli sıklıklarda kullanılır, bunlar aşağıda kısaca açıklanmıştır. Terim belirteçlerinin tam listesi için GCC ve GAS kılavuzlarına başvurabilirsiniz.
Sık kullanılan belirteçler:
Yazmaç terimi belirteçleri (r)
Terimler, bu belirteç kullanılarak belirtilirse Genel Amaçlı Yazmaçlarda (GPR) tutulur. Aşağıdaki örneğe bakın:
asm ("movl %%cr3, %0\n" :"=r"(cr3val));
Burada cr3val değişkeni yazmaçta tutulur, %cr3'ün değeri bu yazmaca kopyalanır ve cr3val'ın değeri bellekte bu yazmaç tarafından güncelleştirilir. r belirteci belirtildiğinde GCC cr3val'ın değerini uygun herhangi bir Genel Amaçlı Yazmaçta (GPR) tutar. Yazmacı belirtmek için, yazmaç isimlerini doğrudan özel yazmaç belirteçleri ile belirtmelisiniz.
  a     %eax
  b     %ebx
  c     %ecx
  d     %edx
  S     %esi
  D     %edi
Bellek terimi belirteçleri (m)
Terimler bellekteyken, onlar üzerinde yapılacak her hangi bir işlem doğrudan bellek bölümüne de uygulanır, yazmaç belirteçleri ise değeri önce bir yazmaçta tutarlar sonra bellek bölümüne yazarlar. Yazmaç belirteçleri genelde kesin olarak gerektiklerinde veya önemli bir performans artışı sağladıklarında kullanılırlar. C değişkenlerinin "asm" içinde güncellenmesi gerektiğinde veya değerini bir yazmaçta tutmak istemediğiniz durumlarda bellek belirteçleri çok daha verimli olurlar. Örneğin sdtr'nin değeri loc bellek bölümünde tutuluyor:
("sidt %0\n" : :"m"(loc));
Karşılaştırma (rakam) belirteçleri
Bazı durumlarda tek bir değişken hem girdi hem de çıktı terimi olabilir. Bu durum "asm"de karşılaştırma belirteçleri ile belirtilir.
asm ("incl %0" :"=a"(var):"0"(var));
Örneğimizde belirteçleri karşılaştırmak için %eax yazmacı hem girdi hem de çıktı yazmacı olarak kullanılmıştır. var girdisi %eax yazmacına atanıyor, ve %eax arttırdıktan sonra var'da saklanıyor. " 0 " burada 0'ıncı çıktı belirteci gibi tanımlanmıştır. Bu, var'ın değerinin sadece %eax'te saklanabileceğini belirtir. Bu belirteç:
  • Girdinin bir değişkenden okunduğu ve sonucun yine bu değişkene yazıldığı gibi durumlarda
  • Girdi ve çıktıların ayrılmasının gerekmediği gibi durumlarda kullanılabilir. Karşılaştırma belirteçlerinin önemi geçerli yazmaçları verimli kullanmamızı sağlamalarındandır.
Önceki Üst Ana Başlık Sonraki
Geri Dönen Yazmaç Listesi  Başlangıç Genel Satıriçi Sembolik Makina Dili Kullanım Örnekleri
Bir Linux Kitaplığı Sayfası