Biraz kafa dinleyip label adresi almaya tekrar bakınca sonunda adres alma işlemini yaptım :)
Yapmışken sizinle de paylaşayım dedim :)
Ama burada adresleri aldıktan sonra
opcodes[i]
yi bir değişkene eşitleyip altta bir asm kodu olarak call yapıyorum. Burdaki gereksiz kodları silip sadece asm kodu olmasını yapamadım bir türlü.
Ve bir soru soracağım şimdi ben burada call pc yapıyorum ama call pc yapmak yerine jmp pc şeklinde bir kullanım yapsam daha hızlı olur mu?
Sanki burada call kullanımı sistemi yavaşlatıyor gibi geldi
module main;
import std.stdio;
void main(){
void *pc;
void*[] opcodes;
//Labelleri diziye atalım :)
asm{ call op_inc;};pc += 0x4;opcodes ~= pc;
asm{ call op_var;};pc += 0x4;opcodes ~= pc;
asm{ call op_cmp;};pc += 0x4;opcodes ~= pc;
asm{ call op_jne;};pc += 0x4;opcodes ~= pc;
asm{ call op_hlt;};pc += 0x4;opcodes ~= pc;
for(int i=0; i<opcodes.length; i++){
pc = opcodes[i];
asm { call pc;}
}
writeln("işlemler tamam");
while(1){}
return;
/*
Labeller
*/
op_inc:
asm{
call adresal;
mov pc[EBP], EAX;
ret;
}
writeln("inc");
asm{ret;}
op_var:
asm{
call adresal;
mov pc[EBP], EAX;
ret;
}
writeln("var");
asm{ ret;}
op_cmp:
asm{
call adresal;
mov pc[EBP], EAX;
ret;
}
writeln("cmp");
asm{ret;}
op_jne:
asm{
call adresal;
mov pc[EBP], EAX;
ret;
}
writeln("jne");
asm{ ret;}
op_hlt:
asm{
call adresal;
mov pc[EBP], EAX;
ret;
}
writeln("hlt");
asm{ ret;}
//Adres almak için
asm{adresal: pop EBX ; mov EAX,EBX; push EBX; ret;}
}
Zekeriya
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]