Skip to content

ulyildiz/42-ft_printf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Va_ Fonksiyonları

Variadic Function olarak geçen bu arkadaşlar "va_start", "va_arg", "va_end", "va_cpy"dir. Bu fonksiyonlar va_list structında değişken alır.

va_list

va_list belirsiz veri tipli belirsiz sayıdaki argüman alan fonksiyonlarda kullanılan veri tipidir.

	unsigned int gp_offset;
	unsigned int fp_offset;
	void *overflow_arg_area;
	void *reg_save_area;

va_list structı ise yukarıdaki gibidir(İşlemci mimarisi göre değişebilir.).

reg_save_area

Register save area işlemcideki çalışma anında registerlara atanmış geçici verilerin saklandığı yerdir. Program çalışırken belirli sayıda register tutulabilir ve bu sayı işlemci mimarisine göre değişir.

overflow_arg_area

Overflow argument area işlemcide reg_save_areadan taşan argümanların tutulduğu bölgedir.

Bu iki alan da çoğu zaman C derleyicileri tarafından arkaplanda kullanılır. Bulabildiğim sebepleri ise genel anlamda registerlarda geçici saklanmış değerleri çekme daha hızlı ve kolay kılınmıştır.

Offset -> bir mesafe göstergesidir. Bir nesnenin başlangıç değerinden bir sonraki noktaya kadar olan tam sayıdır.

gp_offset (General purpose offset)

Genel amaçlı registerlar(GPR) genel amaçlı veri tipleri(char, int, short, long, adresler ..) için kullanılanlardır. Her bir register 8 bytedır.

fp_offset (Float Point offset)

Kayan işaretçi registerlar(FPR) özelleştirilmiş bir şekilde float sayılar için kullanılanlardır. Her bir registeri ise 16 bytetır.

va_start

va_start ise değişken argümanlara başlamadan hemen önceki initialize eder. Bu başlatma işlemleri, genellikle argümanlar stackte olduğundan o frame e eriştirebilir. İlk variadiz argumanla son arasında ofseti hesaplar. İlk argümana işaretçi ayarlar ve derşeyice özgü işlemler optimizasyon (varsa)gerçekleşir.

va_arg

va_arg aldığı 2 değişken ile (va_list argümanı, type) argümanları atlar. başlangıç adresi elinde olduğu için girdiğimiz type'a göre nerede bitireceğini belirler ve block block işlemini uygular.

va_end

va_end ise ise va_list yapısını geçersiz kılar(cleanup işlemlerine sokar) reinitialize edilmesi gerekir. Cleanup olarak dahili bir veri yapısı olduğundan işaretçileri/bayrakları sıfırlar. Derleyice özgü temizleme işlemleri varsa yapabilir. Stackta veya geçiçi veri yapılarında(register(?)) yapının kullandığı yerleri resetleyebilir(?).

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published