Talha Zekeriya Durmuş ile birlikte geliştirdiğimiz Rhodeus Script için yaptığım VM çalışmalarından biri fakat anlayamadığım bir sebepten dolayı EAX 0 oluyor ve EAX ı adres olarak alıp değerini okumaya çalıştığında hata veriyor. Disassembly ile bakmama rağmen EAX ı 0 yapan yani
xor EAX,EAX;
komutu sadece Malloc içinde veriliyor. Ve Disassembly de kodları gösterirken bir gariplik var ?? olarak gösteriyor bazı kusımları başta Malloc neden oluyor sandım fakat parça parça bunlar ve kodların arasında bu yüzden bunun nedenide belli değil. Büyük ihtimalle kodda birçok hata vardır hala D ye alışamadım ama koda bir el ararsanız çok iyi olur :D
module main;
import std.stdio;
import core.memory;
import std.datetime;
int main(string[] argv)
{
int CMPt;
OP[] App =
[
new OP("op_ISYS"),
new OP("op_CMP"),
new OP(0),
new OP(1000000),
new OP("op_INC"),
new OP(2),
new OP("op_JNE"),
new OP(1),
new OP("op_HLT")
];
void *pc;
void*[string] Lbls;
asm{ call l_ISYS;};Lbls["op_ISYS"] = pc + 0x4;
asm{ call l_CMP ;};Lbls["op_CMP" ] = pc + 0x4;
asm{ call l_INC ;};Lbls["op_INC" ] = pc + 0x4;
asm{ call l_JNE ;};Lbls["op_JNE" ] = pc + 0x4;
asm{ call l_HLT ;};Lbls["op_HLT" ] = pc + 0x4;
int* point = cast(int*)GC.malloc(40);
int* memorigin = point;
foreach(OP v; App)
{
if(v.name in Lbls)
{
*point = cast(int)Lbls[v.name];
}
else
{
*point = v.val;
}
writeln(*point);
point++;
}
point = memorigin;
goto runOP;
runOP:
pc = cast(void*)*point;
asm
{
jmp pc[EBP];
}
l_ISYS:
asm{ call adresal; ret;}
auto c1 = Clock.currTime();
point++;
goto runOP;
l_CMP:
asm{ call adresal; ret;}
point++;
int p1 = *point;
point++;
int p2 = *point;
CMPt = p1 - p2;
point++;
goto runOP;
l_INC:
asm{ call adresal; ret;}
point++;
(*(memorigin+(*point)))++;
point++;
goto runOP;
l_JNE:
asm{ call adresal; ret;}
point++;
if(CMPt != 0) point = memorigin+(*point);
else point++;
goto runOP;
l_HLT:
asm{ call adresal; ret;}
auto c2 = Clock.currTime();
writeln(c2-c1);
while(1){}
return 0;
adresal:
asm
{
pop EBX;
mov pc[EBP],EBX;
ret;
}
}
class OP
{
int val;
string name;
this(int Val)
{
val = Val;
name = "P";
}
this(string comm)
{
name = comm;
val = -1;
}
}
Kaan İNEL
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]