Gå til innhold

Anbefalte innlegg

Skrevet (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? :hmm:

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! :w00t:

Endret av v3g4rd
Videoannonse
Annonse

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...