January 05, 2013

Ben bir miktar inline assmebly biliyorum ve de PIC assembly'si...

Tabii ki tüm instructions set hakkında bilgim yok. Ama ne yapmak istediğini alternatif örneği ile görürsem belki yardımcı olabilirim. Kesme kullanmadığımız müddetçe assembly ile her işletim sistemiyle uyumlu çok şey yapabiliriz. Hatta derlenen D kodunun assembly halinde çok şey araklayıp değiştirebiliriz. Biraz kafa yorucu ama çok zor değil...:)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2013

Şimdi buldum debug yaparken breakpoint koyunca Disassembly bölümü çıkıyormuş :)

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2013

Öncelikle teşekkür ederim :)

Yapılacak işlem çok zor değil sanırım

enum {
	OP_BIR1=0,	OP_IKI,	OP_UC
};

size_t[] optable;// operandlarımızın goto için adresini tutan bir değişken
asm{
	call op_bir;
	add EAX, 4; // EAX içerisinde operandımızın adresi var
	//optable dizisine EAX değeri atacak asm kodu
}

op_bir:
	asm{
		mov EAX, [ESP];
		ret;
	}
       //operand birin işlemleri ve daha sonra diğer operanda geçmek için bir komut
op_iki:
	asm{
		mov EAX, [ESP];
		ret;
	}
       //operand ikinin işlemleri ve daha sonra diğer operanda geçmek için bir komut
op_uc:
	asm{
		mov EAX, [ESP];
		ret;
	}
       //operand üçün işlemleri ve daha sonra diğer operanda geçmek için bir komut

Temel mantığıyla böyle olacak yanlışım olabilir umarım nasıl olacağını anlatabilmişimdir

diğer operanda geçmek içi olan komutu sonra tanımlarız. Ama o fonksiyonda da optable adresindeki adresse goto ile gideceğiz.

Kurduğum mantıkta sorun olabilir ama buna benzer birşey olacak :)

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2013

Şu an için ilk önce diziye değer yazmak için gerekli olan asm kodunu yazmak lazım

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2013
module main;
import std.stdio;

void main(){
	size_t c;
	asm{ call L_opcode_1; add EAX, 4; mov c, EAX; }
	writeln(0);
	asm { mov EAX, c; jmp EAX; }
	return;
L_opcode_1:
	asm { mov EAX, [ESP];
		ret;
	}
	writeln(1);

}

Bu kodun tam olarak neresinde hata var?

Zekeriya

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2013

Bu daha önce D forumlarında bir kaç sene önce ve büyük olasılıkla bearophile adlı kişi tarafından önerilmişti. O tartışmayı şimdi bulamıyorum... Tamam buldum! :)

http://forum.dlang.org/thread/gltqflqrvsxggarxjkde@forum.dlang.org?page=1

Tam da senin yaptığın yorumlayıcılar için uygun olduğu söyleniyor. Walter 'final switch'in bu amaçla kullanılabileceğinin altını çizmiş. Bunun henüz yeterince hızlı olmadığı anlaşılmış ve bu konu şurada izlenmeye başlamış:

http://d.puremagic.com/issues/show_bug.cgi?id=8448

Senin yapman gereken oraya girip o bug'ı vote etmek. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 12, 2013

Öncelikle bu sorulara cevap vermediğim için özür dilerim. Biz tartışmaya şurada devam etmiştik:

http://ddili.org/forum/thread/1057

Ancak an itibariyle yeni açtığım başlıkta işine yarayabilecek bilgiler edindiğimi düşünüyorum:

http://ddili.org/forum/post/8503

Özetle ve bildiğim kadarıyla D ile inline assembly yaparak rodata segment'ini oluşturabiliyosun. İşte biz bu sayede ve sadece repn ve scasb komutlarını kullanarak müthiş bir dallanma icrası gerçeleştirebiliriz...:)

Tek sorun, çalışmalarını look-up table uyumlu yapmak. Ama hiç endişelenme çünkü dallanma yapılacak adresi elde ediyoruz ve buraya dilediğin kadar kod yerleştirebiliyorsun. Sanırım frame sıkıntısı yaşamayacağız. Çünkü önemli olan ilgili bellek adresi olacak.

Kolay gelsin...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2 3
Next ›   Last »