Ff een heel lang stukje tekst... prepare
(Over java)
Het is me in me bol geslagen... ik wil proberen een x86 simulator te makenen. Ik wil het voorlopig laten bij een simpel programmaatje dat een 8086 kan simuleren en waarbij je alleen het geheugen en de registers kan bekijken en/of bewerken. Geen andere vorm van I/O.
Op school heb ik al een soortgelijk programma gemaakt, maar ik vindt dat het beter kan. Nu zit ik al een tijdje na te denken over hoe ik het geheugen zal implementeren. In ieder geval maak ik een klasse Memory, dat is duidelijk. De interne werking heb ik nog niet helemaal duidelijk voor mezelf. Ik heb twee alternatieven bedacht:
1. Als een .asm file wordt ingeladen, worden de instructies omgezet naar echte machinetaal, zoals die er ook uitziet voor een 8086. Als de processor een instructie wil uitvoeren, haalt hij het uit het geheugen en zet de machinecode om in een instructie.
Het voordeel van deze aanpak is dat het zo dicht mogelijk bij de werkelijkheid komt. Ook is het mogelijk voor programma's zelf machinecode te laden. Ik denk dat dat laatste best belangrijk zal zijn als ik het programma wil uitbreiden.
Nadeel is volgends mij dat het traag is. Elke keer moet de processor een rij getallen omzetten in een instructie.
2. Het geheugen opdelen in twee delen. Instructie geheugen en datageheugen. Vanaf de buitenkant lijkt het alsof de instructies en data in de zelfde gegevensstructuur staan, maar intern werkt het anders. Voor de data is er gewoon een flinke array van integers of zo. Voor instructies is er een array met verwijzingen naar instacties van de klasse Instructie. De klasse Memory krijgt apparte methoden voor instructies en data, dus:
- setInstruction(Adres a, Instruction i)
- setData(Adres a, Data d)
en natuurlijk ook de getters. Als je een instructie van adres 000F:0101 ofzo wilt hebben, wordt dat adres eerst gewoon in de array voor data opgezocht. Het nummer wat daarin staat geeft aan welk element van de array voor instructies naar de instructie wijst. (Volgen jullie het nog
)
Voordeel hiervan is dus dat al het werk om instructies te 'begrijpen' wordt gedaan tijdens het laden. Sneller dus. Nadeel is dat programma's geen code kunnen laden.
Ik weet absoluut niet welke ik moet kiezen. Ik wil wel rekening houden met evt. uibreidingen in de toekomst, bijvoorbeeld BIOS service routines, etc. Hoe zouden jullie het aanpakken? Of hebben jullie andere alternatieven?
Het is me in me bol geslagen... ik wil proberen een x86 simulator te makenen. Ik wil het voorlopig laten bij een simpel programmaatje dat een 8086 kan simuleren en waarbij je alleen het geheugen en de registers kan bekijken en/of bewerken. Geen andere vorm van I/O.
Op school heb ik al een soortgelijk programma gemaakt, maar ik vindt dat het beter kan. Nu zit ik al een tijdje na te denken over hoe ik het geheugen zal implementeren. In ieder geval maak ik een klasse Memory, dat is duidelijk. De interne werking heb ik nog niet helemaal duidelijk voor mezelf. Ik heb twee alternatieven bedacht:
1. Als een .asm file wordt ingeladen, worden de instructies omgezet naar echte machinetaal, zoals die er ook uitziet voor een 8086. Als de processor een instructie wil uitvoeren, haalt hij het uit het geheugen en zet de machinecode om in een instructie.
Het voordeel van deze aanpak is dat het zo dicht mogelijk bij de werkelijkheid komt. Ook is het mogelijk voor programma's zelf machinecode te laden. Ik denk dat dat laatste best belangrijk zal zijn als ik het programma wil uitbreiden.
Nadeel is volgends mij dat het traag is. Elke keer moet de processor een rij getallen omzetten in een instructie.
2. Het geheugen opdelen in twee delen. Instructie geheugen en datageheugen. Vanaf de buitenkant lijkt het alsof de instructies en data in de zelfde gegevensstructuur staan, maar intern werkt het anders. Voor de data is er gewoon een flinke array van integers of zo. Voor instructies is er een array met verwijzingen naar instacties van de klasse Instructie. De klasse Memory krijgt apparte methoden voor instructies en data, dus:
- setInstruction(Adres a, Instruction i)
- setData(Adres a, Data d)
en natuurlijk ook de getters. Als je een instructie van adres 000F:0101 ofzo wilt hebben, wordt dat adres eerst gewoon in de array voor data opgezocht. Het nummer wat daarin staat geeft aan welk element van de array voor instructies naar de instructie wijst. (Volgen jullie het nog
Voordeel hiervan is dus dat al het werk om instructies te 'begrijpen' wordt gedaan tijdens het laden. Sneller dus. Nadeel is dat programma's geen code kunnen laden.
Ik weet absoluut niet welke ik moet kiezen. Ik wil wel rekening houden met evt. uibreidingen in de toekomst, bijvoorbeeld BIOS service routines, etc. Hoe zouden jullie het aanpakken? Of hebben jullie andere alternatieven?