Union ile Struct arasındaki ince farka dikkat etmek lazım.
Union'un esnekliği burada çok önemli
Union'un esnekliği burada çok önemli
.386
INCLUDE irvine32.inc
.data?
my_Struct_1 STRUCT
x dd ?
y dd ?
my_Struct_1 ENDS
; Union
; Union ve Struct benzer yapıdadır fakat:
; Union'un amacı, aynı bellek alanında birden fazla veri türü saklamaktır.
; Bu, farklı veri türlerinin aynı bellek konumunu paylaşmasına olanak tanır ve bu veri türlerinden birine veri yazıldığında, diğer veri türleri geçersiz kılınır.
; Union, aynı bellek alanını kullanarak farklı veri türleri arasında geçiş yapmaya olanak tanır.
; Union, aynı veriyi farklı şekillerde yorumlamak için kullanılabilir. Örneğin, bir bellek alanı hem bir tamsayı olarak hem de bir dizi karakter olarak yorumlanabilir.
; Union'un boyutu en büyük değişkenin boyutu kadardır. Aşağıdaki örnekde union'un boyutu REAL8 (8 Byte) kadardır.
my_Union UNION
STRUCT
my_Data_1 dd ?
my_Data_2 dd ?
my_Data_3 dd ?
ENDS
; Union içerisine isimli struct tanımlanmıyor.
a1 dd ?
a2 real8 ?
a3 db ?
my_Point_1 my_Struct_1 <> ; x dd ? y dd ? (8 BYTE)
my_Point_2 my_Struct_1 <> ; x dd ? y dd ? (8 BYTE)
my_Union ENDS
union_1 my_Union <>
; Struct, a1, a2, a3, my_Point_1 ve my_Point_2; Aynı başlangıç adreslerine sahiptirler ve bu adres Uninon'un başlangıç adresidir.
; my_Union ---> Union'daki boyutunu verir, Örneğin burada my_Union = 12 (Union'un boyutu union içerisindeki en büyük elemanın boyutu kadardır.)
; Union içerisinde bir Struct var ise union'un boyutu struct'un boyutuna eşittir.
; my_Union.my_Data_1 ---> Union'daki my_Data_1 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Data_1 = 0
; my_Union.my_Data_2 ---> Union'daki my_Data_2 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Data_2 = 0
; my_Union.my_Data_3 ---> Union'daki my_Data_3 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Data_3 = 0
; my_Union.a1 ---> Union'daki a1 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.a1 = 0
; my_Union.a2 ---> Union'daki a2 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.a2 = 0
; my_Union.a3 ---> Union'daki a3 verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.a3 = 0
; my_Union.my_Point_1 ---> Union'daki my_Point_1 veri bloğunun o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_1 = 0
; my_Union.my_Point_2 ---> Union'daki my_Point_2 veri bloğunun o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_2 = 0
; my_Union.my_Point_1.x ---> Union'daki my_Point_1 veri bloğu içerisindeki x verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_1.x = 0
; my_Union.my_Point_1.y ---> Union'daki my_Point_1 veri bloğu içerisindeki y verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_1.y = 0
; my_Union.my_Point_2.x ---> Union'daki my_Point_2 veri bloğu içerisindeki x verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_2.x = 0
; my_Union.my_Point_2.y ---> Union'daki my_Point_2 veri bloğu içerisindeki y verisinin o yapıdaki offsetini verir. Örneğin burada my_Union.my_Point_2.y = 0
; union_1 ---> ( union_1'in başlangıç adresini verir. a1 verisinin başlangıç adresi ile aynı.)
; union_1.my_Data_1 ---> ( union_1'deki my_Data_1 verisini verir. )
; union_1.my_Data_2 ---> ( union_1'deki my_Data_2 verisini verir. )
; union_1.my_Data_3 ---> ( union_1'deki my_Data_3 verisini verir. )
; union_1.a1 ---> ( union_1'deki a1 verisini verir. )
; union_1.a2 ---> ( union_1'deki a2 verisini verir. )
; union_1.a3 ---> ( union_1'deki a3 verisini verir. )
; union_1.my_Point_1 ---> ( my_Point_1 veri bloğunu verir. )
; union_1.my_Point_2 ---> ( my_Point_2 veri bloğunu verir. )
; union_1.my_Point_1.x ---> ( my_Point_1 veri bloğundaki x verisini verir. )
; union_1.my_Point_1.y ---> ( my_Point_1 veri bloğundaki y verisini verir. )
; union_1.my_Point_2.x ---> ( my_Point_2 veri bloğundaki x verisini verir. )
; union_1.my_Point_2.y ---> ( my_Point_2 veri bloğundaki y verisini verir. )
.code
start PROC
; ---------------------------------------------------------------------------
mov eax, 5 ; EAX = 5
mov dword ptr union_1.a1, eax ; a1 = 5
mov ebx, dword ptr union_1.a1 ; EBX = 5
mov eax,7 ; EAX = 7
mov dword ptr union_1.a3, eax ; a3 = 7
mov ecx, dword ptr union_1.a3 ; ECX = 7
mov ebx, dword ptr union_1.a1 ; a1 = EBX = 7
; İlk başta a1'e 5 dedim daha sonra a3'e 7 dedim.
; a3'e 7 dedikten sonra a1'deki 5 etkisiz hale geldi.
; Hatta my_Union içerisindeki bütün değişkenler 7'ye eşitlendi.
; Artık 7'yi daha fazla değişken ismiyle ifade etme şansımız oldu.
; ---------------------------------------------------------------------------
mov eax, 3 ; EAX = 3
mov dword ptr union_1.my_Data_1, eax ; my_Data_1 = 3
mov ebx, dword ptr union_1.my_Data_1 ; ECX = 3
mov eax, 5 ; EAX = 5
mov dword ptr union_1.my_Data_2, eax ; my_Data_2 = 5
mov ecx, dword ptr union_1.my_Data_2 ; ECX = 5
mov eax, 7 ; EAX = 7
mov dword ptr union_1.my_Data_3, eax ; my_Data_3 = 7
mov edx, dword ptr union_1.my_Data_3 ; EBX = 7
mov ebx, dword ptr union_1.my_Data_1
; İlk örnekteki gibi olmayıp my_Data_1'den sonra başka bir değişkene değer verilince my_Data_1 kendi değerini koruyor.
; Bu yüzden union içerisindeki structure'ın boyutu ne kadar ise structure için o kadar bellek tahsis edilir.
; my_Union içerisindeki my_Struct toplam 3 DWORD'luk yer kaplar. Hatta bu 3 DWORD = 12 BYTE my_Union'un boyutudur.
mov eax, dword ptr union_1.a1 ; EAX = a1 = 3
mov eax, dword ptr union_1.a2 ; EAX = a2 = 3
mov eax, dword ptr union_1.a3 ; EAX = a3 = 3
; my_Union içerisinde olup my_Struct dışında kalan a1, a2 ve a3 isimli değişkenler ise Structure içerisindeki ilk veriyi alır. Yani a1 = a2 = a3 = my_Data_1
; ---------------------------------------------------------------------------
; my_Union dışında tanımlanmış my_Struct_2 yapısını kullanan my_Point_1 ve my_Point_2 adında ki veri bloklarını inceleyelim.
mov eax, 3 ; EAX = 3
mov dword ptr union_1.my_Data_1, eax ; my_Data_1 = 3
mov ebx, dword ptr union_1.my_Data_1 ; ECX = 3
mov eax, 5 ; EAX = 5
mov dword ptr union_1.my_Data_2, eax ; my_Data_2 = 5
mov ecx, dword ptr union_1.my_Data_2 ; ECX = 5
mov eax, 7 ; EAX = 7
mov dword ptr union_1.my_Data_3, eax ; my_Data_3 = 7
mov edx, dword ptr union_1.my_Data_3 ; EBX = 7
mov eax, dword ptr union_1.my_Point_1.x ; EAX = my_Point_1.x = my_Data_1 = 3
mov eax, dword ptr union_1.my_Point_1.y ; EAX = my_Point_1.y = my_Data_2 = 5
mov eax, dword ptr union_1.my_Point_2.x ; EAX = my_Point_2.x = my_Data_1 = 3
mov eax, dword ptr union_1.my_Point_2.y ; EAX = my_Point_2.y = my_Data_2 = 5
; my_Struct_1'in içerisine veriler yazılınca my_Point_1 ve my_Point_2 blokları içerisindeki x ve y değişkenlerine my_Struct_1 yapısının başından itibaren veriler alınıp sırayla yerleştirilir.
; Örneğin 5 sayısını my_Data_2 ile ve my_Point_1.y ile ifade edebiliriz.
; ---------------------------------------------------------------------------
; Sonuç olarak 3 DWORD (12 BYTE) boyutunda, my_Union adında bir Union tanımlamış olduk.
; ---------------------------------------------------------------------------
ret
start endp
end startBu içeriği görmek için giriş yapın.