Assembly yazarken bir çok kaynak kodda “ADDR” ya da “OFFSET” komutlarını görmüşsünüzdür. Aralarında küçük bir fark bulunan bu iki komut da program içerisinde kullandığımız değişkenlerin hafızadaki adreslerini alırlar. Fark şudur: Offset sadece genel değişkenlerin hafıza adreslerini alabilirken, “ADDR” hem genel hem de yerel değişkenlerin adreslerini alabilmektedir. Aklınızda bulunsun. Kolay gelsin.
Yıllar sonra gelen düzenleme:
Yukarıdakilere ek olarak yazmak istediğim birkaç bilgi daha var.
OFFSET -> DATA ya da DATA? segmentlerinde tanımlanan bir değişkenin adresini döndürür:
.DATA
intUzunluk db 0Ch
.CODE
mov eax, intUzunluk ;eax = 0Ch
mov edx, offset intUzunluk ;edx = 0040123Eh (bir adres değeri)
;0Ch değerinin saklandığı bellek adresi
LOCAL etiketiyle bir işlem/prosedür içerisine yerel değişkenler tanımlayabiliriz. Bu değişkenlerin bellek adresleri olmaz bunlar yığın-stack ‘de çalışma zamanında yaratılırlar.
OFFSET işte bu bellek adresi olmayan yerel değişkenleri çağıramaz.
ADDR etiketiyle bu yerel değişkenleri çağırabiliriz.
ADDR global değişkenleri aynı OFFSET gibi çağırır: PUSH komutu kullanarak:
push GlobalDegisken
ADDR yerel değişkenleri çağırırken onların Fiziksel Bellekteki adreslerini LEA komutu kullanarak çağırır ve PUSH ile yığına gönderir
lea eax,YerelDegisken
push eax
Yerel değişkeni addr ile çağırırken eax yazmacının değiştirileceğini unutmayalım.
İyi çalışmalar.