WriteMem() ဆိုတဲ့ function က memory array ေပၚမွာ data သြားေရးတာပါ။ Address ကေတာ့ ကိုယ္ေရးခ်င္တဲ့ address ေပါ့။ ဥပမာ၊ ပထမ integer value တခုသြားေရးခ်င္ရင္၊ program.WriteMem(0, 101, 4); ေပါ့။
ဒုတိယ integer တခုသြားေရးခ်င္ရင္ address 4 မွာေရးရပါမယ္ (ပထမ integer က address 0 ကေန 3 ထိေနရာယူထားတယ္ေလ)။
program.WriteMem(4, 456, 4); ေပါ့။
ReadMem ကေတာ့ WriteMem ရဲ႕ေျပာင္းျပန္ memory ကေနျပန္ဖတ္တဲ့ function ပါ။ Program() constructor ထဲမွာ ကၽြန္ေတာ္တို႔ရဲ႕ memory ကို ေဆာက္ေပးဖို႔လိုပါလိမ့္မယ္။ ခုကၽြန္ေတာ္တို႕ memory size ကို 10KB ေပးထားပါတယ္။ ဒီေတာ့ ကၽြန္ေတာ္တို႕ language မွာ 10KB ထက္ပိုၿပီး သိမ္းလို႔မရဘူးေပါ့ဗ်ာ။ ဒီထက္ပိုသိမ္းခ်င္ရင္ memory size ကိုျပင္ေပးရပါလိမ့္မယ္။ Destructor ထဲမွာ memory ကို delete လုပ္ခဲ့ဖို႔လဲ မေမ့ပါနဲ႔။
ဒီေနရာမွာ အားသာခ်က္တခုက global memory ကို 0 ေတြတခါတည္း initialize လုပ္ထားလို႔ရတာပါဘဲ (constructor ထဲမွာ “ZeroMemory(pMemory, 10240);” လို႔ေရးထားတယ္ေလ)။ C++ မွာဆို memory ကအစမွာ ေျဗာက္ေသာက္ျဖစ္ေနတာမို႕ variable ေၾကညာတိုင္းအၿမဲ initialize လုပ္ေပးရပါတယ္။ ဒါက Java လို Virtual Machine မွာ run တဲ့ programming language ေတြရဲ႕အားသာခ်က္တခုပါ။
ခုကၽြန္ေတာ္တို႔ဆီမွာ global memory ရွိၿပီမို႔ memory ကို access လုပ္တဲ့ Op-code တခ်ိဳ႕ေရးဖို႕ဘဲက်န္ပါေတာ့တယ္။ ဒီအတြက္ memory ကိုထဲကိုသြားသိမ္းမဲ့ OP_PUT_MEM ဆိုတဲ့ Op-code ကိုထည့္လိုက္ပါ။
Code
enum OpCode {
.......
OP_PUT_MEM, // write operand to global memory
.......
};
ေနာက္ၿပီးရင္ VirtualMachine::Run() function ထဲမွာ OP_PUT_MEM အတြက္သြားေရးပါ။
Code
Instruction inst = program.Next();
switch (inst.code)
{
......
case OP_PUT_MEM:
program.WriteMem(inst.operand[0], (void*)&(inst.operand[1]), 4);
break;
......
}
ဒီေနရာမွာ Instruction ရဲ႕ ပထမ operand ကကိုယ္ေရးခ်င္တဲ့ memory address ျဖစ္ၿပီး ဒုတိယ operand ကကိုယ္သိမ္းခ်င္တဲ့ data ျဖစ္ပါတယ္။ သိမ္းတဲ့ data က integer မို႔ size ကေတာ့ 4 ပါ။ ၿပီးရင္ NUM ဆိုတဲ့ Op-code ကို operand ကို print လုပ္မဲ့အစား memory ထဲက data ကို print လုပ္တဲ့ function ေျပာင္းေရးၾကည့္ရေအာင္။
[/code]
...........
case OP_NUM:
{
int data;
program.ReadMem(inst.operand[0], (void*) &data, 4);
printf("Current Number: %d", data);
}
break;
...........
...........
ဒီေနရာမွာ operand 0 က data မဟုတ္ေတာ့ဘဲ print ထုတ္မဲ့ memory ရဲ႕ address ျဖစ္သြားပါတယ္။ ကဲ ခုကၽြန္ေတာ္တို႕ရဲ႕ code ကို testing လုပ္ၾကည့္ရေအာင္။ main() function ကိုေအာက္ကအတိုင္းျပင္ပါမယ္။
Code
void main() {
Program MyProgram;
// my script <img src="http://s102.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile">
MyProgram.Add(Instruction(OP_TALK, 0, 0));
MyProgram.Add(Instruction(OP_PUT_MEM, 0, 101));
MyProgram.Add(Instruction(OP_PUT_MEM, 4, 456));
MyProgram.Add(Instruction(OP_NUM, 0, 0));
MyProgram.Add(Instruction(OP_NUM, 4, 0));
MyProgram.Add(Instruction(OP_END, 0, 0));
vm.Run(MyProgram);
};
ဒါဆိုရင္ ေအာက္ကအတုိင္း output ရပါမယ္။ Output မွာသိပ္အေျပာင္းအလဲ မရွိေပမဲ့ ခုဆိုကၽြန္ေတာ္တို႕ရဲ႕ language ေလးက data ေတြကို memory မွာသြားသိမ္းလို႔ရေနပါၿပီ Smile