Intel ve AT&T Sözdizimi
Önceki Linux ile Sembolik Makina Dili Kullanımı Sonraki
Intel ve AT&T Sözdizimi
Intel ve AT&T Sembolik Makina Dili sözdizimleri görünüşte birbirlerinden çok farklıdırlar ve bu durum ilk başta Intel sözdizimi kullanıp daha sonra AT&T sözdizimi ile karşılaşan ya da önce AT&T daha sonra Intel sözdizimi kullanan birisi için karışıklık yaratmaktadır. Sözü fazla uzatmadan temellere başlayalım.
Önekler
Intel sözdiziminde yazmaçların ve sabit değerlerin önekleri yoktur. Buna karşın AT&T sözdiziminde yazmaçlar bir '%' ve sabit değerler de bir '$' öneki alırlar. Intel sözdiziminde hexadecimal (onaltılık) veya binary (ikilik) sistemdeki sabit değerler sırasıyla 'h' ve 'b' öneki alırlar. Eğer ilk hexadecimal basamak bir harf ise değer bir '0' öneki alır. Örnek:
  Intel Sözdizimi         AT&T Sözdizimi
------------------      ---------------------
  mov eax,1               movl $1,%eax
  mov ebx,0ffh            movl $0xff,%ebx
  int 80h                 int  $0x80
Terimlerin Yönü
Intel sözdizimindeki terimlerin yönü AT&T sözdizimindekinin tersidir. Intel sözdiziminde ilk terim hedef (destination) ve ikinci terim kaynak (source) olur, buna karşın AT&T sözdiziminde ilk terim kaynak ve ikinci terim hedeftir. Bu durumda AT&T sözdiziminin yararı açıktır. Soldan sağa okuruz, soldan sağa yazarız, öyleyse soldan sağa olan sözdizimi zaten doğal olandır. Örnek:
Intel SözdizimiAT&T Sözdizimi
komut hedef,kaynak
mov   eax,[ecx]
komut kaynak,hedef
movl  (%ecx),%eax
Bellek Terimleri
Yukarıda da görüldüğü gibi bellek terimleri de farklıdır. Intel sözdiziminde temel yazmaç [ ve ] karakaterleri arasına yazılırken buna karşın AT&T sözdiziminde ( ve ) karakterleri arasına yazılır. Örnek:
Intel SözdizimiAT&T Sözdizimi
mov eax,[ebx]
mov eax,[ebx+3]
movl (%ebx),%eax
movl 3(%ebx),%eax
Karmaşık işlemler gerektiren yönergelerde AT&T sözdiziminin Intel sözdizimine göre anlaşılması daha güçtür. Bu tür işlemler için Intel sözdizimi
    segreg:[base+index*scale+disp]
şeklindedir. AT&T sözdizimi ise
    %segreg:disp(base,index,scale)
şeklindedir.
index, scale, disp ve segreg isteğe bağlıdır ve istenirse kullanılmayabilir. scale tanımlı değilse ve index tanımlı ise, scale 1 kabul edilir. segreg yönergeye ve uygulamanın gerçek kipte mi yoksa korumalı kipte mi çalıştığına bağlıdır. Gerçek kipte komuta bağlı olmasına karşın, korumalı kipte kullanımı gerekli değildir. Kullanılan sabit değer, AT&T'de scale veya disp için kulanıldığında $ öneki kullanılmaz. Örnek:
Intel SözdizimiAT&T Sözdizimi
komut foo,segreg:[base+index*scale+disp]
mov   eax,[ebx+20h]
add   eax,[ebx+ecx*2h]
lea   eax,[ebx+ecx]
sub   eax,[ebx+ecx*4h-20h]
komut  %segreg:disp(base,index,scale),foo
movl  0x20(%ebx),%eax
addl  (%ebx,%ecx,0x2),%eax
leal  (%ebx,%ecx),%eax
subl  -0x20(%ebx,%ecx,0x4),%eax
Gördüğünüz gibi AT&T'nin anlaşılması güçtür.
    [base+index*scale+disp]
kalıbı,
    disp(base,index,scale)
kalıbına göre daha anlamlı bir görünüm sağlar.
Sonekler
Sizin de fark ettiğiniz gibi AT&T sözdiziminde komutların sonekleri vardır. Bu sonekler kullanılan terimin boyutunu verir. Uzun için (long: 32 bit) l, sözcük için (word: 16 bit) w ve bayt (byte: 8 bit) için b kullanılır. Intel sözdiziminde bellek terimleri için benzer yönergeler kullanılır, örneğin byte ptr, word ptr, dword ptr. Tabii ki dword, long'a karşılık gelmektedir. Bu işlem C dilindeki tür dönüştürmeye benzemektedir, fakat kullanılan yazmaçların kapasitesi varsayılan tür genişliği olarak düşünüldüğü zaman gerekli olmamaktadır. Örnek:
Intel SözdizimiAT&T Sözdizimi
mov al,bl
mov ax,bx
mov eax,ebx
mov eax, dword ptr [ebx]
movb %bl,%al
movw %bx,%ax
movl %ebx,%eax
movl (%ebx),%eax
BURADAN SONRAKİ TÜM ÖRNEKLER AT&T SÖZDİZİMİNDE OLACAKTIR
Önceki Üst Ana Başlık Sonraki
Giriş Başlangıç Sistem Çağrıları
Bir Linux Kitaplığı Sayfası