Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 20:01:20 Předmět: |
|
|
tak to je skoro to sami jako udelat
kód: |
class OpCode
{
public string Name;
public Action<Assembler> AssembleMethod;
public void Assemble(Assembler assembler)
{
this.AssembleMethod.Invoke(assembler);
}
}
a tohle nacpat do nejake staticke tridy
static class OpCodes
{
public static readonly OpCode Nop = new OpCode { Name = "Nop", AssembleMethod = (asm) => asm.AssembleNop() };
}
|
|
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 17. leden 2009, 20:07:17 Předmět: |
|
|
Takže máš hafo instrukcí a dva možný výstupy? A co teda udělat abstraktní třídu Assembler s abstraktníma metodama pro výpis každé instrukce a potom dvě implementace této třídy MASM, NASM? Nepopírám, že mi něco uniklo _________________ Mám strach |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 20:09:48 Předmět: |
|
|
Quiark napsal: |
Takže máš hafo instrukcí a dva možný výstupy? A co teda udělat abstraktní třídu Assembler s abstraktníma metodama pro výpis každé instrukce a potom dvě implementace této třídy MASM, NASM? Nepopírám, že mi něco uniklo |
no ano to je to co sem tu nahore psal, nemuzu ovsem udelat tridu
kód: |
Assembler
void Assemble(Nop opCode)
void Assemble(Call opCode)
void Assemble(Stloc opCode) |
ale musim
kód: |
Assembler
void AssembleNop(Nop opCode)
void AssembleCall(Call opCode)
void AssembleStloc(Stloc opCode) |
a tudiz nekde rozlisit to volani (z toho duvodu kterej sem psal nekde nazacatku ze Assemble((OpCode)opCode) se rozhoduje podle typu za compiletime a ne za runtime) |
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
Zaslal: 17. leden 2009, 20:27:04 Předmět: |
|
|
Zahodime reseni problemu cos navrhl, zkusime vyresit problem tvuj, jo
Ja nejak nechapu napriklad proc Nop, Call a StdAlloc jsou tridy. Oni poskytuji nejakou funkcnost? Proc dedi OpCode? Musi to tak byt? Netusim co je to OpCode, ale jestli to chapu tak chces jen prelozit abecedu (opcodu) do jiny abecedy (asm) |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 17. leden 2009, 20:29:26 Předmět: |
|
|
Hmm, hmm, asi bych vyuzil toho, ze to pises v C#. Pokud vis, ze se bude prevadet jen do MASM nebo NASM, tak bych si vytvoril atribut reprezentujici prepis do MASM a druhy pro prepis do NASM a pred kazdym OpCodem napsal, jak se dany OpCode ma prepsat prave pomoci tech atributu. V tridach, ktere se o prepis do assembleru staraji, bys jen pouzil reflexi. Vyhodu by to melo taky tu, ze kdybys chtel pridat dalsi instrukci, nemusis do techto trid vubec zasahovat.
dostal byses klasicky k:
kód: |
OpCode {
public void Assemble(Assembler assembler)
{
assembler.Assemble(this);
}
}
[MASM("nop"), NASM("nop")]
class NopCode: OpCode { }
|
Dalsi otazka je, jestli vubec ma smysl psat vlastni tridy pro reprezentaci OpCodu (ty uz nekde v .NETu jsou), a nepouzit radeji ty .NETi s tim ze by se cele assemblovani delalo pomoci tech ifu (kterym ses chtel vyhnout). - Ve skutecnosti by to slo i treba i bez ifu (tim, ze by sis naplnil treba Dictionary<string, string> dvojcemi "jmeno.typu", "prepis"). Pouziti Mostu nebo Visitora mi prijde docela jako reseni pres ruku.
EDIT: Ono je pres ruku docela i pouziti tech atributu... proc by to nemohlo byt takto?)
kód: |
class OpCode {
public void Assemble(Assembler assembler)
{
assembler.Assemble(this);
}
public virtual string GetMASM();
public virtual string GetNASM();
}
class NopCode: OpCode {
public override string GetMASM() { return "nop"; }
...
}
|
Naposledy upravil posila dne 17. leden 2009, 20:52:05, celkově upraveno 3 krát |
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
Zaslal: 17. leden 2009, 20:36:32 Předmět: |
|
|
Posila: ja souhlasim s tim slovnikem. Tohle je rozumny reseni. Jak ja to chapu tak nop, call, stdalloc nejsou tridy. Kdyby to tak bylo tak by je navic vsechny musela znat i trida nasm nebo tasm. Co kdyz pak nejakou pridas? Tak ses v riti a musis to cely prepsat a prelezit. Nedej boze aby to chtel takhle pouzit nekdo treti. Diky tomu slovniku se tomu vyhnes, jen ho naplnis treba z textovyho souboru. |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 20:46:26 Předmět: |
|
|
no ja mam Nop:OpCode jako tridu kvuli tomu ze v soucasnosti v tom mam tu metodu Assemble() a prepisuju to jen do MASM
ano kdyz se to bude prepisovat primo v te trida Assembler, uz to jako jednotlivy tridy byt nemusi
2posila: ten prepis je nekdy moc slozitej na to aby sel definovat takhle staticky
mas pravdu v Reflection.Emit uz opkody definovany sou, ale jak sem psal potreboval sem tam pridat tu metodu Assemble(), kera ted uz asi nebude potreba...
sice to nejsou tridy, ale ta trida Assembler je skutecne musi vsechny znat, jinak logicky nejdou prelozit a ten vyslednej program nemuze fungovat
k tomu editu, neco podobnyho me uz taky napadlo udelat nejakej interface
IMASMAble s metodou Assemble(MASM assembler) a pak na kazdym opkodu zvlast implementovat jako assembler.Write("nop") trebas |
|
Návrat nahoru |
|
|
Ondras
Založen: 12. 09. 2007 Příspěvky: 66
|
Zaslal: 17. leden 2009, 20:52:12 Předmět: |
|
|
Nemel bys tam cpat to Assemble ani kdyby jsi to prepisoval jen do toho jednoho. Presne z toho duvodu jak jsi popsal, ze se to zmeni. Nad tim by mela pracovat jina trida, ktera se o tohle stara specializovana presne na to kam se to prepisuje. Ta to vi a umi to. To jsou presne ty tve nasm a masm.
Jeste trochu jinej pohled. "class OpCode extends Assembler". A ty jen mezi temi tremi "assemblery" prevadis.
No nic valim na pivo. Cus |
|
Návrat nahoru |
|
|
Sosarian
Založen: 07. 11. 2007 Příspěvky: 51
|
Zaslal: 17. leden 2009, 20:57:13 Předmět: |
|
|
Ondras napsal: |
Nemel bys tam cpat to Assemble ani kdyby jsi to prepisoval jen do toho jednoho. Presne z toho duvodu jak jsi popsal, ze se to zmeni. Nad tim by mela pracovat jina trida, ktera se o tohle stara specializovana presne na to kam se to prepisuje. Ta to vi a umi to. To jsou presne ty tve nasm a masm.
Jeste trochu jinej pohled. "class OpCode extends Assembler". A ty jen mezi temi tremi "assemblery" prevadis.
No nic valim na pivo. Cus |
ano vim ze OpCode, by nemel delat nic s assemblerem (stejne jako Model by se nemel sam vykreslovat) proto se tu ptam jak se to resi |
|
Návrat nahoru |
|
|
|