PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Relevanta dokument
PC-teknik, 5 p LABORATION FILHANTERING

CE_O3. Nios II. Inför lab nios2time

CPU. Carry/Borrow IX. Programräknare

Planering Programmering grundkurs HI1024 HT 2014

Enchipsdatorer med tillämpningar LABORATION 7, ROBOT

Planering Programmering grundkurs HI1024 HT TIDAA

Dataminne I/O Stack 0x005D 0x3D SP low byte 0x005E 0x3E SP high byte

Tentamen PC-teknik 5 p

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Styrteknik: MELSEC FX och numeriska värden

Planering Programmering grundkurs HI1024 HT data

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Lathund. Pacific C för MS-DOS

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Tentamen PC-teknik 5 p Lösningar och kommentarer

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Föreläsning 10. Pekare (Pointers)

Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok.

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

Enkla datatyper minne

Tentamen. Datorteknik Y, TSEA28

[] Arrayer = Indexerad variabel

c a OP b Digitalteknik och Datorarkitektur 5hp ALU Design Principle 1 - Simplicity favors regularity add $15, $8, $11

Tentamen PC-teknik 5 p

Tentamen PC-teknik 5 p

Grunderna i stegkodsprogrammering

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

HI1024 Programmering, grundkurs TEN

Föreläsning 2. Operativsystem och programmering

General Purpose registers ALU I T H S V N Z C SREG. Antag att vi behöver skriva in talet 25 till register R18

Besvara de elektroniska frågorna (se kurshemsidan). Läs kapitel i kursbok

Digital- och datorteknik

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Laboration 1 Introduktion till Visual Basic 6.0

Uppgift 1 - programmet, Uppg6.m, visade jag på föreläsning 1. Luftmotståndet på ett objekt som färdas genom luft ges av formeln

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Övningsuppgifter till föreläsning 2 Variabler och uttryck

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

HI1024 Programmering, grundkurs TEN

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

F2: Motorola Arkitektur. Assembler vs. Maskinkod Exekvering av instruktioner i Instruktionsformat MOVE instruktionen

Att använda pekare i. C-kod

Lösningar till tentamen i EIT070 Datorteknik

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Enchipsdatorer med tillämpningar LABORATION 6, ROBOT

Styrenheten styrsignalsekvenser programflödeskontroll

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

En kort text om programmering i C.

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Assemblerprogrammering del 1

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Introduktion C-programmering

Systemkonstruktion SERIEKOMMUNIKATION

Introduktion till programmering och Python Grundkurs i programmering med Python

Datorteknik. Föreläsning 3. Assembler, stack och subrutiner, programmeringskonventionen. Institutionen för elektro- och informationsteknologi, LTH

Institutionen för elektro- och informationsteknologi, LTH

Instruktion för laboration 1

Tentamen PC-teknik 5 p Lösningar och kommentarer

Föreläsning 6 pekare och pekare tillsammans med arrayer

Tentamen den 12 januari 2017 Datorarkitektur med operativsystem, EDT621

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

HI1024 Programmering, grundkurs TEN

Extrauppgifter för CPU12

Arduinokurs. Kurstillfälle 4

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

Objektorienterad programmering Föreläsning 2

Lösningar till tentamen i EIT070 Datorteknik

Uppgift 1 ( Betyg 3 uppgift )

TDP005 Projekt: Objektorienterat system

Instruktion för laboration 1

Laboration 2 i Datorteknik- Assemblerprogrammering II

Repetition C-programmering

Frekvenstabell över tärningskast med C#

Laboration 6 Formulär och stränghantering övningar/uppgifter

LABORATION. Datorkonstruktion D

Tentamen. Datorteknik Y, TSEA28

Programmeringsteknik med C och Matlab

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Kontrollskrivning Mikrodatorteknik CDT S2-704

Linköpings Tekniska Högskola Instutitionen för Datavetenskap (IDA) Torbjörn Jonsson, Erik Nilsson Lab 2: Underprogram

LEU240 Mikrodatorsystem

Introduktion till användning av linux-servern sledge och några övningsuppgifter

TUTORIAL: SAMLING & KONSOLL

COBOL. från grunden. monitors. Peter Sterwe. training people

Planering av ett större program, del 2 - for och listor. Linda Mannila

Övning från förra gången: readword

Lathund för spel med karta

Tentamen. Datorteknik Y, TSEA28

MMA132: Laboration 2 Matriser i MATLAB

Datorteknik TSIU02 Lab 2 Morsesändare v0.7

4 Sammansatta datatyper

Grundläggande datavetenskap, 4p

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Uppgifter till praktiska tentan, del A. (7 / 27)

Transkript:

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION Laborationsansvarig: Anders Arvidsson Utskriftsdatum: 2005-08-31 Laborant(er):

1 Syfte Laborationen ska ge studenten möjlighet att genom assemblerinlägg i C öva grunderna i assembler, främst olika adresseringssätt. 2 Genomförande Laborationen genomförs individuellt eller i grupper om två studenter. Som hjälp används föreläsningsanteckningarna, Art of Assembler och Lathund Pacific C samt Lathund Lucifer. I PingPong finns en fil, asmintro.c, som är lämplig att utgå ifrån när du löser uppgifterna. Filen ger en struktur, samt innehåller några deklarerade variabler som gör det enkelt att avlusa koden även utan debugger. Det står dig fritt att modifiera filen, men det är ofta praktiskt att ha ett antal variabler som skrivs ut och som du kan dumpa register mm i vid behov. Ibland är det praktiskt att justera printf() för hexadecimal presentation (genom att byta %d mot %x). Enklast är att hela tiden arbeta i samma fil, men spara undan delresultat genom att kopiera den till nytt namn i Windows. (Vissa uppgifter kan läggas som bortkommenterad kod i slutet av filen.) Redovisa delresultat för labhandledaren, som markerar detta med en signatur i ditt lab-pm. Det kan t ex vara lämpligt att redovisa vid varje rubriknivå 2. Redovisning av hela laborationen bör ske senast en vecka efter laborationstillfället. 2

3 Assembleruppgifter Uppgifterna löses i Pacific C. Anges inget annat så ska uppgiften lösas med assembler inom #asm - #endasm. Utgå från asmintro.c (som finns i PingPong). Testa att kompilera koden och köra programmet, så du vet att allt fungerar före ändringar. Läs kommentarerna i koden och studera utskriften så får du en snabb introduktion till de vanligaste adresseringsmodena. 3.1 Kodanalys Analysera assemblerprogrammet nedan och besvara frågorna. mov al,#2 inc al ;Vad har AL för värde efter detta? mov dh,#1 mov dl,#5 ;Vad har DX (16 bit) för värde efter detta? or al,dl ;Vad har AL för värde efter detta? mov ah,dh ;Vad har AX (16 bit) för värde efter detta? Skriv in assemblerprogrammet på angivet ställe i C-koden. (Öppna C-filen i Notepad om du vill kopiera texten till den.) Lägg till instruktioner (på raderna efter frågorna) som lägger lämpliga register i lämpliga variabler så att utskriften med printf() i slutet av programmet ger svar på om du besvarat frågorna rätt. Anteckna med en kommentar efter frågorna vilken variabel som håller svaret. Kompilera och kör programmet. Lägg till kommentarer i programmet, ovanför varje instruktion, som berättar exakt vad denna gör. 3.2 Adresseringsmodena Direct, Register och Immediate När du testar lösningarna av nedanstående uppgifter kan du behöva deklarera eller initiera några variabler, utöver vad som anges i uppgiften. Lägg gärna ett par scanf() tidigt i programmet som läser in data till ett par variabler. Dessa funktioner kan lätt bortkommenteras när de inte används och variablerna behåller då initieringsvärdet istället. (Vissa lösningar verifieras enklast om ingen kompilering behövs mellan varje test.) 3.2.1 Direct och Register Skriv några rader assembler som laddar AL med värdet i variablen a8, sedan ökar AL med 1 och sparar tillbaka värdet i variabeln a8. Kommentera koden likt nedan. (All asm-kod bör kommenteras, i senare uppgifter med fördel blockvis.) ; Laddar AL med värdet i variablen a8 ; Öka AL med 1 ; Sparar tillbaka värdet i variabeln a8 3

3.2.2 Direct Skriv ett assemblerinlägg efter #endasm som återställer a8 (från föregående uppgift) genom att minska värdet med 1. Detta ska göras med en instruktion i ett asm-inlägg i C-koden enligt asm( );. Skriv också ett inlägg som ökar a16 med 1. 3.2.3 Immediate Skriv ett program som lägger in talet 55 i variabeln b8, via AL registret. ; Ladda AL med talet 55 ; Spara AL i variabeln b8 Lägg till en rad som lägger talet 55 i variabeln c8, utan att mellanlagra i något register. 3.2.4 Register Skriv ett program som byter plats på hög respektive låg byte i AX (så AL = AH och AH = tidigare AL). Testa programmet genom att först ladda AX med talet AA55 16 och sist i asm-inlägget kopiera AX till en variabel som i printf() skrivs ut hexadecimalt. 3.2.5 Direct, Register och Immediate För att ytterligare öva in de olika sätten att adressera ska du skriva ett assemblerinlägg som beräknar värdet av x enligt formeln nedan. x = 2y+3z +5 y och z läses in med scanf() före asm-inlägget. Multiplikationerna får göras med upprepade additioner (se ref till AoA nedan). Programmet ska ge rätt resultat för alla positiva värden på y och z som är mindre än 1000. Läs om instruktionen ADD i Art of Assembly, avsnitt 6.5.1.1. Observera att syntaxen skiljer sig något mellan AoA och Pacific. I Pacific avser ett tal en adress (direct) medan ett tal skrivs som #tal (immediate). I AoA avser ett tal ett tal, medan adresser skrivs som [tal], se Art of Assembly 3.3.6. 3.3 Lucifer Hittills har koden varit så liten att eventuella fel hittats genom användning av debugvariabler. Framöver kan det vara nödvändigt att simulera instruktionerna en och en samt undersöka registerinnehåll för att finna ett fel (t ex att man glömt # och råkar läsa en adress istället för ett tal). 3.3.1 Översikt Lucifer är ett enklare avlusningsverktyg som medföljer Pacific C. Hämta lathunden för Lucifer på PingPong och kör igenom exemplet som finns i denna (fram till nop). Läs sedan igenom de vanligaste kommandona i slutet av Lathunden så du hittar bland dem vid behov. 4

3.3.2 Avlusning LABORATION Assemblerintroduktion Studera asm-koden i exemplet i Lathunden. Starta om simulatorn och använd denna för att analysera koden och skriv kommentarer vid varje instruktion som förklarar exakt vad denna uträttar och vad påverkade register får för värde. (Öppna en kopia av koden i en texteditor där kommentarer skrivs.) I fortsättningen får du själv avgöra när Lucifer behöver användas. Printf() bör räcka långt för att konstatera om programmet fungerar eller inte, men lär du dig Lucifer ordentligt kommer det spara en hel del tid på sikt när programmen växer i omfattning. 3.4 Villkorliga programhopp Assemblerinstruktionerna som används nedan hittas vid behov i Art of Assembly, kapitel 6. 3.4.1 Compare Deklarera ytterligare en variabel i asmintro.c.: int jfr = 0; Skriv ett program som kontrollerar om variabeln d16 > 10, och sätt i så fall jfr till ett. Skriv ytterligare en printf() som skriver ut jfr. Läs in d16 med en scanf() (före asm-blocket). Skriv om programmet så det jämför två tal, d16 och e16. om d16 = e16 så sätt jfr = 0 om d16 > e16 så sätt jfr = 1 om d16 < e16 så sätt jfr = 2 3.4.2 Loop Skriv ett program som adderar två tal genom metoden nedan: Spara ena talet i AX. Öka AX (med inc) så många gånger som motsvarar det andra talet (i en loop). Spara AX i en variabel (t ex summa). Se i föreläsningsanteckningarna hur du kan loopa ett visst antal gånger. (Här behövs dock inte indexerad adressering.) Modifiera programmet ovan så du kan välja mellan att addera eller subtrahera två tal. Om variabeln val = 1 så ska talen adderas, annars ska de subtraheras. (Bygg på ovanstående program med en jämförelse som väljer metod, och en subtraktionsloop.) 5

3.5 Indexerad adressering Det kan vara lämpligt att skapa ytterligare en printf() som också skriver ut a8 e8 som ASCII. 3.5.1 Pekare (Register indirect) Låt BX peka på variabeln d8, och använd pekaren för att kopiera innehållet i d8 till e8. 3.5.2 Indexering Skriv ett program som läser ut element nummer a8 ur strängen text, m h a BX-registret, och sparar detta i b8. D v s om variabeln a8 innehåller talet 2 så ska ett j sparas i variabeln b8. 3.5.3 Indexering, maskning, loop Strängarna som refereras till nedan finns deklarerade i asmintro.c. Den som känner sig osäker kan börja med att kopiera strängen text till strängen text2 enligt föreläsningsanteckningarna. Det ger en grundstruktur till uppgiften. Skriv ett program som gör om gemener i strängen text till versaler och versaler till gemener. 1. Studera ASCII-tabellen för att se vilken/vilka bit(ar) som ska justeras. 2. Använd bitvisa operation(er) (t ex AND, OR eller XOR) för att ettställa/nollställa lämplig(a) bit(ar) i de tal som representerar texten i strängen text. (Du förutsätts ha repeterat maskning och logiska operationer i Talbaser_Övningar pdf.) 3. Använd indexerad adressering för att bearbeta tecken efter tecken i en loop. Tips: Du kan testa steg 2 på ett tecken innan indexering och loop läggs till. 3.5.4 Mer indexering Kasta om tecknen i text så att texten skrivs ut baklänges. Lägg först över texten i text2, och läs sedan tillbaks dem i omvänd ordning. Använd två pekare, en som räknas upp och en som räknas ner, i en loop, vid omkastningen. 3.5.5 Indexering tills du spyr Sortera text så att texten skrivs ut i bokstavsordning. Här krävs lite tankearbete innan kodning med diverse pekare börjar. Uppgiften är mycket nyttig, men kan ses som en överkursuppgift. 3.5.6 C-övning Testa gärna att lösa de två senaste uppgifterna i ren C-kod, för att öva på bitvisa operationer i C, samt repetera indexering (eller pekare). Denna uppgift behöver ej redovisas, men försäkra dig om att du hittar bitvisa operationer i lathunden till tentan. 6