v3g4rd Skrevet 18. februar 2007 Del Skrevet 18. februar 2007 (endret) Kan noen av dere hjelpe med med å tolke denne prosjektoppgaven? Link til prosjektoppgaven. Slik jeg forstår det, skal vi lage en Assembly-parser i JAVA, som kan tolke koden som er inkludert i den .pdf fila, men i utgangspunktet har ingen vi ikke fått noe opplæring i assembly slik at jeg ikke helt vet hvordan jeg skal begynne.. Jeg har googla litt på nettet etter informasjon om temaet, men fant ikke noe spesielt relevant.. Er det noen av dere som har vært ute for noe lignende? Takker for alle svar! Endret 28. februar 2007 av v3g4rd Lenke til kommentar
v3g4rd Skrevet 21. februar 2007 Forfatter Del Skrevet 21. februar 2007 Er det virkelig ikke noen som har erfaring med dette? Lenke til kommentar
Patton Skrevet 21. februar 2007 Del Skrevet 21. februar 2007 Har problemer med aa laste ned pdf-fila: "The server at v3gard.com is taking too long to respond" Lenke til kommentar
JAPCU Skrevet 21. februar 2007 Del Skrevet 21. februar 2007 For de som ikke får lastet ned pdf her er teksten: Klikk for å se/fjerne innholdet nedenfor DAT101 Prosjekt A 2007 Oppgaven har vekt 6 og teller til eksamen. Fristen for innlevering og evaluering er fristen i fronter. Du har ansvaret selv for å avtale tid – send mail. Oppgaven godkjennes med inntil 100% etter en muntlig individuell evaluering som avtales med hver enkelt- Assembler Dere skal forsøke å lage et program som leser inn et program i assemblerkode ( et begrenset instruksjonsset ) , bygger opp en passende datastruktur og som deretter kjører assemblerprogrammet. Innlesningen skal foregå fra en tekst fil. Det kan være dere må spesifisere noen flere instruksjoner for å forenkle arbeidet med påskedagsalgoritmen. Innholdet av alle registre, hukommelsen, skal være et ord à 2 int slik at hvis det første heltallet er 0 så er det andre heltallet data og hvis det er første tallet er ulik 0 så står tallet for en instruksjon (se KODE= nedenfor ). Senere kommer en utvidelse som også skal gjøres. Maskinen har et register A, kalt rA og en hukommelse på 256 ord nummerert fra 0 til 255. I det følgende betyr H(ADRESSE) innholdet (2 INTEGER) av adresse nr ADRESSE i hukommelsen. Syntaksen for en instruksjon er OP ADRESSE LDA (load A) : KODE=1 kopierer H(ADRESSE) til register A. STA (store A) : KODE=2 innholdet av register A blir flyttet til ADRESSE n ADD : KODE=3 adderer innholdet i register A med H(ADRESSE) og legger innholdet i rA SUB : KODE=4 subtraherer H(ADRESSE) fra innholdet i rA og legger resultatet i rA IN : KODE=5 leser tall fra terminal til H(ADRESSE), det første heltallet settes lik 0 for å indikere at det er data. OUT : KODE=6 Skriver det andre tallet i H(ADRESSE) ut på terminal med linjeskift CMPA (compare A) : KODE=7 et "mindre enn","lik" eller "større enn" merke settes hvis innholdet av rA er mindre, lik eller større enn H(ADRESSE) JM,JE,JS : KODE=8,9,10 Hopp til ADRESSE hvis hhv "mindre enn","lik" eller "større enn" merke er satt. JMP : KODE=11 Ubetinget hopp. MOD : KODE=12 Beregner rA MOD H(ADRESSE) og legger resultatet i rA DIV : KODE=13 Beregner rA DIV H(ADRESSE) og legger resultatet i rA MUL : KODE=14 Beregner rA * H(ADRESSE) og legger resultatet i rA HLT : kode=15 Programmet stopper (siste setning). Denne instruksjonen krever ingen ADRESSE. Du skal teste programmet på to ASSEMLER programmer. IN 200 IN 201 LDA 200 ADD 201 STA 202 OUT 202 HLT Det andre skal utføre følgende påskedagsalgoritme for årstall etter 1582! 1) Y er året du vil beregne dato for 1.påskedag (fra terminal) 2) La G := [ (Y)MOD(19)] +1 (det gyldne tall) 3) La C := [ (Y)DIV(100)] +1 (århundre) 4) La X := [ (3*C)/4] - 12 (antall år, 1900 uten skuddår) Z := [ (8*C+5)/25] -5 (synkronisering påske/månen) 5) La D := [ (5*Y)/4] - X - 10(finn søndag) 6) La E := ( 11*G + 20 + Z - X) MOD (30) Hvis (E=25 og G>11 ) eller (E=24) så øk E med 1. (fullmåne) 7) La N := 44 - E Hvis N <21 så la N:=N+30 (påske skal være første søndag etter første fullmåne etter 21.mars) 8) La N := N + 7 - [ (D+N) MOD (7) ] (flytt til søndag) 9) Hvis N>31 så er datoen (N-31) april ellers så er datoen N mars. I tillegg kan ASSEMBLER koden arbeide med symbolske navn på adresser. Da brukes instruksjonen EQU som blir lagt ned som 1 i første tall i adressen. Det symbolske navnet skal stå venstrejustert i de 10 første kolonnenen, instruksjonen skal stå venstrejustert i kolonne 11 til 20 og adressen skal stå venstrejustert i kolonne 21 til 30. Eksempel: 123456789012345678901234567890 Hukommelsen _______________________________ X EQU 5 -1 ? linje 1 IN 7 5 7 linje 2 IN X 5 5 linje 3 OUT 7 6 7 linje 4 HLT 15 ? linje 5 Du kan gjerne skrive koden slik at det ikke er nødvendig at teksten er nøyaktig plassert som vist, men det kan være greitt å skrive assemblerkoden slik for å være lettere å lese. Når ditt program leser inn ASSEMBLER-koden, så er EQU ikke en vanlig instruksjon, men en beskjed om at programmet må bygge opp en datastruktur som kan brukes til å slå opp i. I linje 1 i programmet over, så skal det symbolske navnet 'X' (med 1 tegn) legges inn i en Hashtable sammen med ADRESSEN 5. (Som du sikkert har skjønt , så medfører linje 1 en feil fordi både variabelen X og instruksjon HLT blir lagt i samme ADRESSE.) Når programmet leser inn linje 3, så må programmet slå opp i hashtabellen og finne at 'X' er data i adresse 5. HINT: Hukommelsen kan da lage som to heltallstabeller. For å starte testing av programmet tidlig, så kan du selvfølgelig lese assemblerkoden fra terminal til å begynne med. Ulempen med det siste er at det da tar mye tid å taste inn koden. Lenke til kommentar
v3g4rd Skrevet 21. februar 2007 Forfatter Del Skrevet 21. februar 2007 (endret) Linken skal fungere den. Ellers takk for at du postet koden på tråden JAPCU edit: Har funnet ut at assemblykoden skal legges i en tekstfil, som ser omtrent slik ut: IN 200 IN 201 LDA 200 ADD 201 STA 202 OUT 202 HLT Deretter bruker jeg klassen StringTokenizer for å lese hvert ledd av linjen. StringTokenizer har en metode (StringTokenizer.nextToken(); ) som skiller hver kommando med mellomrommet. Når programmet leser inn "IN", vet den hvordan den skal behandle det leddet som kommer etterpå. Denne koden settes da i en while-løkke som brytes når leddet "HLT" blir lest. Problemet nå er at jeg ikke helt forstår hvordan tallene (eller adressene) skal behandles.. Endret 21. februar 2007 av v3g4rd Lenke til kommentar
___ Skrevet 21. februar 2007 Del Skrevet 21. februar 2007 Kan noen av dere hjelpe med med å tolke denne prosjektoppgaven? Link til prosjektoppgaven. Slik jeg forstår det, skal vi lage en Assembly-parser i JAVA, som kan tolke koden som er inkludert i den .pdf fila, men i utgangspunktet har ingen vi ikke fått noe opplæring i assembly slik at jeg ikke helt vet hvordan jeg skal begynne.. Jeg har googla litt på nettet etter informasjon om temaet, men fant ikke noe spesielt relevant.. Er det noen av dere som har vært ute for noe lignende? Takker for alle svar! 7969708[/snapback] Litt av en oppgave. Sitter her og leker meg litt med den, og har fått ferdig parseren, og får "kjørt" det ene programmet. Holder på med påskeprogrammet nå. Mimre (har ikke holdt på med dette siden tidlig 90-tall) Hilsen Werner Lenke til kommentar
v3g4rd Skrevet 22. februar 2007 Forfatter Del Skrevet 22. februar 2007 (endret) Litt av en oppgave. Sitter her og leker meg litt med den, og har fått ferdig parseren, og får "kjørt" det ene programmet. Holder på med påskeprogrammet nå. 7995000[/snapback] Jeg har også fått programmet mitt til å gjenkjenne kommandoene, men jeg vet ikke helt hvordan adressene bak kommandoene skal behandles.. Kunne du prøvd å forklare meg? edit: Hvis vi tar kommandoene: IN 200 IN 201 Hva blir da betegnet som adressen, og hva er verdien? Har lest gjennom oppgaven flere ganger nå, men blir ikke klokere av den grunn. IN: KODE=5 leser tall fra terminal til H(ADRESSE), det første heltallet settes lik 0 for å indikere at det er data. Takk for svar! Endret 22. februar 2007 av v3g4rd Lenke til kommentar
v3g4rd Skrevet 26. februar 2007 Forfatter Del Skrevet 26. februar 2007 Update: Har nå fått første del av programmet til å virke. Løsningen viste seg å være at når kommandoen "IN ***" dukket opp, skal programmet spørre brukeren hvilken verdi han ønsker å legge på adresse ***. Når det var gjort, bruker jeg HashMaps til å lagre verdiene på. Grunnen til at jeg ikke bruker array er fordi jeg må definere hvor stort arrayet skal være. Dersom assemblyskriptet er på 1000 linjer, blir det derfor mye lettere å bruke HashMaps, da de kan være tilnærmet uendelige store. (Den eneste barrieren er mengden RAM). Nå er det kun påskealgoritmen som gjenstår, og innspill fra dere andre blir satt veldig stor pris på! Lenke til kommentar
blacktower Skrevet 27. februar 2007 Del Skrevet 27. februar 2007 Når det var gjort, bruker jeg HashMaps til å lagre verdiene på. Grunnen til at jeg ikke bruker array er fordi jeg må definere hvor stort arrayet skal være. Ikke for å være vrien, men hvis det og kun det var grunnen burde du kanskje titte på Vector / ArrayList med venner... Lenke til kommentar
v3g4rd Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 (endret) Hovedproblemet mitt var som sagt å forstå oppgaven, fordi jeg ikke skjønte hvordan tallene (som ble lest inn) skulle behandles. Jeg var heller ikke helt stø på alle de assemblykommandoene, men jeg forstår mer etterhvert som jeg jobber med oppgaven. Jeg var ikke klar over Vector/ArrayList, men takk for tipset! Endret 28. februar 2007 av v3g4rd Lenke til kommentar
v3g4rd Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 Da var oppgaven løst. Takk for alle bidrag! Lenke til kommentar
Jitsumi Skrevet 28. februar 2007 Del Skrevet 28. februar 2007 hmm.... Jeg er helt med på å dele opp koden ved hjelp av tokenizer, men hva gjør du så med koden? Holder på med samme oppgaven selv. Fatter ikke hvordan jeg skal få "kjørt" koden/programmet....Klarer ikke helt å se svaret ligge her i denne tråden heller... mvh Jitsumi Lenke til kommentar
blacktower Skrevet 1. mars 2007 Del Skrevet 1. mars 2007 Opprett variabler for minnet, registeret og flagget som er nevnt i oppgaven. I en loop leser du så en og en operasjon og utfører de handlinger på minnet / registeret, osv som er beskrevet. For eksempel: når du leser instruksjonen 3 (add) legger du til den angitte posisjonen i minnet til registeret. Deretter leser du neste instruksjon, osv, osv. Her er et løsningsforslag på simulatordelen: http://pastie.caboo.se/43813 (riktignok i Ruby ) Når jeg kjører det første programmet skjer følgende: >>Machine.new(Machine::Word.new(5,200), Machine::Word.new(5,201), Machine::Word.new(1,201), Machine::Word.new(3,200), Machine::Word.new(2,202), Machine::Word.new(6,202), Machine::Word.new(15,0)).run =>About to execute, state is: ip: 0, ci: #<struct Machine::Word op=5, data=200>, h: 0, a: 0, cmp: 0 7 =>About to execute, state is: ip: 1, ci: #<struct Machine::Word op=5, data=201>, h: 0, a: 0, cmp: 0 9 =>About to execute, state is: ip: 2, ci: #<struct Machine::Word op=1, data=201>, h: 9, a: 0, cmp: 0 =>About to execute, state is: ip: 3, ci: #<struct Machine::Word op=3, data=200>, h: 7, a: 9, cmp: 0 =>About to execute, state is: ip: 4, ci: #<struct Machine::Word op=2, data=202>, h: 0, a: 16, cmp: 0 =>About to execute, state is: ip: 5, ci: #<struct Machine::Word op=6, data=202>, h: 16, a: 16, cmp: 0 16 =>About to execute, state is: ip: 6, ci: #<struct Machine::Word op=15, data=0>, h: 200, a: 16, cmp: 0 (IP er instruction pointer, CI er current instruction, H er datadelen av instruksjonen som er på addressen i minnet anngitt av datadelen av CI, A er registeret, CMP er flagget som settes ved sammenligninger). Lenke til kommentar
Jitsumi Skrevet 1. mars 2007 Del Skrevet 1. mars 2007 Allright! Då får vi se hva det blir til her. Lenke til kommentar
v3g4rd Skrevet 1. mars 2007 Forfatter Del Skrevet 1. mars 2007 (endret) hmm.... Jeg er helt med på å dele opp koden ved hjelp av tokenizer, men hva gjør du så med koden? Holder på med samme oppgaven selv. Fatter ikke hvordan jeg skal få "kjørt" koden/programmet....Klarer ikke helt å se svaret ligge her i denne tråden heller... mvh Jitsumi 8048964[/snapback] Det jeg gjorde var å bruke if/else-setninger. Når du har lest inn den neste kodesnutten fra StringTokenizer, kan du kjøre en if-test for å sjekke innholdet av kodesnutten. eks. if (kodesnutt.equals("IN") { //koden for å behandle kommandoen } else if (kodesnutt.equals("ADD") { //koden for å behandle kommandoen } [...] Den koden over satt jeg inn i en while-løkke som ble kjørt gjennom for hver ny kommando programmet mitt oppdaget, og utførte kommandoene i rett rekkefølge. Endret 1. mars 2007 av v3g4rd Lenke til kommentar
Jitsumi Skrevet 2. mars 2007 Del Skrevet 2. mars 2007 Bra dere dytter meg i riktig retning Det jeg sliter med er vel //koden for å behandle kommandoen Tror jeg må lese litt om hvordan jeg skal jobbe mot minnet osv.. Jeg kan godt opprette en variabel som skal representere minnet, men å faktisk få den til å gjøre det..? hmm.. Det er helt utrolig at en ikke finner noe matnyttige websider på dette... Lenke til kommentar
................... Skrevet 3. mars 2007 Del Skrevet 3. mars 2007 (endret) ... Endret 10. juli 2010 av ................... Lenke til kommentar
v3g4rd Skrevet 3. mars 2007 Forfatter Del Skrevet 3. mars 2007 (endret) Du trenger ikke å gjøre det så vanskelig som å opprette et array på størrelse med minnet. Hvis du leser gjennom oppgaven, ser du at det står noe om HashMap. Tenk deg at du har gjenkjent kommandoen "IN" ved hjelp av StringTokenizer. IN er kommandoen for å lese tall fra terminal(eller brukeren) inn på virtuelle "minneadresser" i programmet ditt. Når du først har lest inn "IN", kjører du StringTokenizer igjen, og får tak i adressen som står bak: Eks. IN 200 Dette forteller programmet at assemblyskriptet vårt ønsker å spørre brukeren om en verdi som skal legges på adresse 200. Når du har lest inn hvilken adresse det er snakk om, er det ikke fullt så vanskelig å fortsette (så lenge du vet hva du gjør ). Eks. HashMap h = new HashMap(); Object adresse = StringTokenizer.nextToken(); Object lagreVerdi = JOptionPane.showInputDialog(null, "Skriv inn verdi." )); h.put(adresse, lagreVerdi); Enkelt og greit. Når du kommer til en LDA-kommando, som skal kopiere verdien fra adresse *** til regA, gjør du følgende. Les først inn adressen som står bak LDA ved hjelp av StringTokenizer og lagre verdien på int adresse. int regA = Integer.parseInt(h.get(adresse).toString); Jeg har ikke kvalitetssjekket koden for feil, men jeg tror den skulle fungere. Mulig jeg hjalp deg litt vel mye nå, men det er bedre det enn at du ikke forstår hva du skal gjøre.. Du kommer til å få mye større utfordringer når du kommer til påskealgoritme- og EQUdelen av oppgaven. Edit: Fikest skrviefiel:) Endret 4. mars 2007 av v3g4rd Lenke til kommentar
Jitsumi Skrevet 28. april 2007 Del Skrevet 28. april 2007 Ja då er jeg ferdig med denne oppgaven jeg og. Tror ikke jeg har gjort det på den letteste måten, men det fungerer, og det er jo det som er poenget. Det største problemet var jo å forstå hva foreleser mente. ikke tvil om det.... men....ferdig! Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå