v3g4rd Skrevet 25. februar 2007 Skrevet 25. februar 2007 (endret) [LØST] Hei! Jeg har en prosjektoppgave på skolen hvor vi skal lage en enkel assemblyparser i java.. Jeg har klart å få programmet mitt til å gjenkjenne kodeinstruksjonene, men jeg vet ikke helt hva som er adresser og verdier.. Eks. IN 200 IN 201 Hva betyr tallene - og hvilke betegnes som adresse og/eller verdi? Takk for alle svar! 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. Edit Om dere kan poste svarene deres på den originale posten min ville jeg satt stor pris på det, slik at alle svar og kommentarer blir holdt samlet på en plass. På forhånd, takk! Endret 28. februar 2007 av v3g4rd
v3g4rd Skrevet 28. februar 2007 Forfatter Skrevet 28. februar 2007 Da var oppgaven løst. Takk for alle bidrag!
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å