- 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.