Etiket Arşivi: ‘variable’

ADDR ve OFFSET farkı

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.

Kategori Assembly
30.07.2007
2185 Okunma