Difference between revisions of "LU-MOP-b14"

From DiLab
Jump to: navigation, search
(24.03.2014.)
(MD2)
Line 213: Line 213:


==MD2==
==MD2==
===MD2===

==== Matricu reizināšana ====

Jums jāizstrādā asemblera procedūra '''matmul(...)''', kas reizina divas 2D matricas, un rezultātu ieliek trešajā.
Jūsu asemblera programma tiks izsaukta no C valodā rakstītas, tātad parametriem jābūt atbilstošiem.

Zemāk dots programmas izsaukuma piemērs no komadu rindas.
Ievaddati tiek padoti ar < operatoru no faila infile.txt uz ''stdin''. Līdzīgi rezultāts no ''stdout'' tiek saglabāts izvada failā outfile.txt.

$> md2 < infile.txt > outfile.txt

Jāizstrādā un jāiesniedz sekojoši faili (visi papildus faili tiks ignorēti):
# '''Makefile''' - fails, kas ļauj kompilēt jūsu programmu
# '''md2.h''' - pirmkoda fails ar funkcijas prototipu, ko iekļaus gan C gan asemblera faili.
# '''md2.s''' - programmu asemblerā, kas aprēķina matricu reizinājumu.
# '''md2_main.c''' - programmu C valodā, kas izsauc asamblera programmu un padod tai matricas, saņem rezultātu, ko izdrukā uz ekrāna.

==== Matricu ievads ====

Testējot, matricas jāievada no komandu rindas.
Matricas tiek padotas caur ''stdin'', piemēram, no komandu rindas straumējot no teksta faila.
Rezultējošā matrica tiek izvadīta uz ''stdout'', ko arī var straumēt uz teksta failu.
Arī rezultējošā matrica jāizvada tādā pat formātā kā ievaddati (skat. zemāk).

Matricas teksta failā tiek definētas kā skaitļu virkne. Tātad, jums jānodrošina matricu ievads un izvads sekojošā formātā:
# skaitlis H, kas norāda rindu skaitu matricā (augstumu)
# skaitlis W, kas norāda kolonu skaitu matricā (platumu)
# H*W skaitļi, kas aizpilda matricu, sākot no pirmās rindas.
# Pēc tam var sekot nākamā matrica tieši tādā pašā formātā.

Piemēram, 2x3 matrica:
1 2 3
4 5 6

teksta failā var tikt definēta šādi:

2 3
1 2 3
4 5 6

Vai arī šādi, viss vienā rindā. Pārejas uz jaunu rindu nav nepieciešamas un tiek ignorētas, bet tās var saglabāt lasāmības dēļ:
2 3 1 2 3 4 5 6

Skaitļu ievadam C programmā iespējams izmantot funkciju ''scanf()'', piemēram šādi:

<source lang="c">

#include <stdlib.h>
#include <stdio.h>
...
int w,h;
int *matrix,
int *p;
...
scanf("%d", &h);
scanf("%d", &w);
/* Buferu alokācija un cikls pa visiem matricas elementiem */
matrix = (int*) malloc( w * h * sizeof(int));
p = matrix;
for(...)
{
scanf("%d", p++);
}
...
</source>

Lūdzu ņemiet vērā, ka augšminētais piemērs jāpapildina ar pārbaudēm, lai, piemēram, nekorekti ievaddati nerakstītu ārpus bufera.

==== Procedūras ''matmul(...)'' prototips ====
int matmul( int h1, int w1, int *m1, int h2, int w2, int *m2, int *m3 );

* Procedūras parametri: ''h1'' un ''h2'' ir matricas augstums un ''w1'' un ''w2'' ir platums attiecīgi pirmajai un otrajai matricām ''m1'' un ''m2''.
* Trešās matricas ''m3'' dimensijas nosaka matricu reizinājuma operācija.
* Procedūra atgriež skaitli int: 0 = veiksmīga izpilde, 1 = problēma, piemēram, nesaderīgas matricas. Šādā gadījumā C programmai arī jābeidz darbs ar kodu 1: exit(1);
* Visus nepieciešamos datu buferus nodrošina (izveido) izsaucošā C programma, tai skaita arī trešajai, rezultāta matricai. Tas nozīmē, ka arī C programmai jānosaka, cik liela būs rezultāta matrica, lai tai rezervētu pietiekoši daudz atmiņas.

Matricu elementi atmiņā glabājas kā divdimensiju masīvs: Int elementi. Piemēram, 2x3 matrica
1 2 3
4 5 6
atmiņā glabājas lineāri, kā 6 ''int'' elementi, katrs izmērā 4 baiti: { 1, 2, 3, 4, 5, 6 }

Visi datu izmēri (atsevišķie skaitļi) saiet ''int'' reģistrā, tātad nepārsniedz 4 baitu garumu. Visi skaitļi ir veseli.

==== Testēšana un iesniegšana ====

Risinājumam jābūt testētam, un jādarbojās uz ''asm1.linux.edu.lv'' servera, lietojot ARM emulatoru qemu-arm.
Bez tam, tas, ka risinājums darbojas uz ''asm1'' servera, nenozīmē, ka tajā nav kļūdas un ka par to automātiski pienāktos maksimālais vērtējums. Pieredze rāda, ka reizēm "paveicas", un risinājums darbojas, lai arī tajā ir kļūdas. Testējot vai lietojot to nākamreiz vai uz citas aparatūras tas var nestrādāt. Tāpēc lūdzu pieiet savam kodam kritiski. Piemēram, vai esat saglabājuši un atjaunojuši visus izmantotos reģistrus, sākot no R4 un uz augšu? Šī ir tipiska kļūda, kas var reizēm nostrādāt un reizēm nē.

Risinājumu jāiesūta elektroniski.
Risinājumam ar visiem failiem jābūt uz servera <code>asm1.linux.edu.lv</code> jūsu konta direktorijā md2:

~/md2/

Uzskaitītie faili tiks izkopēti no minētas direktorijas MD termiņa beigās.

Jautājumus un neskaidrības par MD lūdzu iesūtīt kursa google-grupā.


==KP==
==KP==

Revision as of 16:46, 12 March 2014

Mašīnorientētā programmēšana (MOP)

LU DF bakalaura studiju kurss DatZ4017, meklēt eStudijās.


  • Pasniedzējs: Leo Seļāvo (epasts: vards.uzvards @ gmail.com)

Kursa mērķis

Kursa mērķis ir iepazīstināt ar zema līmeņa programmēšanu Asemblerā, ņemot ARM platformu kā konkrētu izstrādes mērķi. Asemblera instrukcijas ir aparatūrai tuvākās procesora izpildes komandas, līdz ar to kursā tiek stāstīts arī par to, kā darbojas procesors, kādi ir tā resursi, un kā to ietekmēt ar Asemblera programmām. Tiek apskatīts arī kā veidot saskarni starp Asembleru un augstāka līmeņa programmām, tai skaitā C.

Šis ir nopiens kurss ar būtisku slodzi. Piemēram, varat iepazīties ar to, ko iepriekšējie studenti rakstīja pēc šī kursa: MOP-m kursa atsauksmes 2013. Veiksmi šajā gadā.

Vērtējums

Gala vērtējums kursā veidosies no sekojošiem faktoriem:

  • Dalība klasē, jautājumi, atbildes, diskusijas
  • MK (1,2,3)
  • MD (1,2)
  • KD1
  • Eksāmens

Kalendārs

Datums, nedēļa Kursa saturs Uzdevumi

03.02.2014.

Ievads kursā. Kursa mērķi. Iegultās un mazo procesoru sistēmas. ARM arhitektūra. Mācību izstrādes vide.

10.02.2014.

Sešpadsmitnieku un citas skaitīšatas sistēmas datoriem. Pārveidojumi starp dažādām sistēmām, aritmētiskās darbības. Biti, baiti, vārdi, nibbles.

17.02.2014.

Skaitļu attēlošana papildkodā.

MK1 kontroldarbs

24.02.2014.

Procesora uzbūve. Operatīvā atmiņa. Procesora un atmiņas sadarbība. Adreses. Reģistri. Procesora režīmi.

03.03.2014.

Programmu izstrādes vide.

"asm1" serveris praktiskajiem darbiem.

MK2 kontroldarbs

10.03.2014.

Komandu pieraksts, aritmētiskās un bitu operācijas.

17.03.2014.

Vadības maiņas komandas, testi, bitu operācijas.

Pasludināts MD1.

24.03.2014.

Adresācijas režīmi, darbs ar atmiņu.

MK3 kontroldarbs

31.03.2014.

Apakašprogrammu izsaukumi, saskarne ar "C".

07.04.2014.

Simboliskie dati, kodu tabulas.

MD1 termiņš.

Uzdots MD2.

14.04.2014. - 21.04.2014.

Lieldienu brīvdienas

28.04.2014.

Izteiksmes un makro valoda.

Iekļautais asemblers.

Pasludināts kursa projekts KP.

05.05.2014.

Lielais kontroldarbs KD1

12.05.2014.

Programmatūras izstrādē lietoto rīku darbības principi.

MD2 termiņš

19.05.2014.

Instrukciju izpildes laiki.

Sistēmas sāknēšana, priviliģētās operācijas.

Termiņš eksāmena formas izvēlei KD/KP.

26.05.2014.

Kursa vielas pārskats.

xx.06.2014.

xx:xx Eksāmens

 

Kontroldarbi

MK1

Skaitļu formāti un pārvediošana: decimālā, heksadecimālā, oktālā, binārā.

MK2

Skaitļi ar zīmi, divnieka papildkodā, to pārveidošana.

MK3

Asemblera pirmkoda lasīšana un izpratne. Sekot neliela koda fragmentam un noteikt reģistru vērtības pēc tā izpildes.


MD1

Izveidot programmiņu asemblerā, kas aprēķina aritmētiskās progresijas summu no 1 līdz n ar soli 1.

Skaitlis n tiek padots kā parametrs. Jāizstrādā un jāiesniedz:

  1. Makefile - fails, kas ļauj kompilēt jūsu programmu
  2. md1.h - pirmkoda fails ar funkcijas prototipu, ko iekļaus gan C gan asemblera faili.
  3. md1.s - programmu asemblerā, kas aprēķina aritmētiskās progresijas summu.
  4. md1_main.c - programmu C valodā, kas izsauc asamblera programmu un padod tai parametru n un saņem rezultātu, ko izdrukā uz ekrāna.

Testējot, parametrs n jāpadod no komandu rindas, līdzīgi kā praktisko darbu piemēros.

Tātad, jums būs jāizveido md1_main.c programma, kas saņem parametru caur argv[1], pārveido to par "int", un šis veselais skaitlis jāpadod kā parametrs funkcijai asum(), kas realizēta asemblera kodā, failā md1.s

Rezultāts jāsaņem atpakaļ C programmā un jāizdrukā, piemēram, ar printf() funkciju. Jāizdrukā tikai skaitlis un rindas beigu simbols '\n'.

Piemērs izsaukumam (tam, kā jūsu programma tiks testēta, tikai ar citiem skaitļiem):

leo@asm1:~/work/md1$>  qemu-arm  ./md1 10
55

Risinājums nedrīkst izmantot reizināšanas instrukcijas!

Risinājumam jābūt testētam, un jādarbojās uz asm1.linux.edu.lv servera (arm platformai, emulācijas režīmā).

Risinājumu jāiesūta elektroniski. Risinājumam ar visiem failiem jābūt uz servera asm1.linux.edu.lv jūsu konta direktorijā md1:

~/md1/ 

Uzskaitītie faili tiks izkopēti no minētas direktorijas MD termiņa beigās.

Jautājumus un neskaidrības par MD lūdzu iesūtīt kursa google grupā.

MD2

MD2

Matricu reizināšana

Jums jāizstrādā asemblera procedūra matmul(...), kas reizina divas 2D matricas, un rezultātu ieliek trešajā. Jūsu asemblera programma tiks izsaukta no C valodā rakstītas, tātad parametriem jābūt atbilstošiem.

Zemāk dots programmas izsaukuma piemērs no komadu rindas. Ievaddati tiek padoti ar < operatoru no faila infile.txt uz stdin. Līdzīgi rezultāts no stdout tiek saglabāts izvada failā outfile.txt.

$> md2 < infile.txt > outfile.txt

Jāizstrādā un jāiesniedz sekojoši faili (visi papildus faili tiks ignorēti):

  1. Makefile - fails, kas ļauj kompilēt jūsu programmu
  2. md2.h - pirmkoda fails ar funkcijas prototipu, ko iekļaus gan C gan asemblera faili.
  3. md2.s - programmu asemblerā, kas aprēķina matricu reizinājumu.
  4. md2_main.c - programmu C valodā, kas izsauc asamblera programmu un padod tai matricas, saņem rezultātu, ko izdrukā uz ekrāna.

Matricu ievads

Testējot, matricas jāievada no komandu rindas. Matricas tiek padotas caur stdin, piemēram, no komandu rindas straumējot no teksta faila. Rezultējošā matrica tiek izvadīta uz stdout, ko arī var straumēt uz teksta failu. Arī rezultējošā matrica jāizvada tādā pat formātā kā ievaddati (skat. zemāk).

Matricas teksta failā tiek definētas kā skaitļu virkne. Tātad, jums jānodrošina matricu ievads un izvads sekojošā formātā:

  1. skaitlis H, kas norāda rindu skaitu matricā (augstumu)
  2. skaitlis W, kas norāda kolonu skaitu matricā (platumu)
  3. H*W skaitļi, kas aizpilda matricu, sākot no pirmās rindas.
  4. Pēc tam var sekot nākamā matrica tieši tādā pašā formātā.

Piemēram, 2x3 matrica:

1  2  3
4  5  6

teksta failā var tikt definēta šādi:

2 3
1 2 3
4 5 6

Vai arī šādi, viss vienā rindā. Pārejas uz jaunu rindu nav nepieciešamas un tiek ignorētas, bet tās var saglabāt lasāmības dēļ:

2 3  1 2 3  4 5 6

Skaitļu ievadam C programmā iespējams izmantot funkciju scanf(), piemēram šādi:

#include <stdlib.h>
#include <stdio.h>
 ...
    int  w,h;
    int *matrix, 
    int *p;
 ...
    scanf("%d", &h);
    scanf("%d", &w);
 
    /* Buferu alokācija un cikls pa visiem matricas elementiem */
    matrix = (int*) malloc( w * h * sizeof(int));
    p = matrix;
    for(...)
    {
        scanf("%d", p++);
    }
 ...

Lūdzu ņemiet vērā, ka augšminētais piemērs jāpapildina ar pārbaudēm, lai, piemēram, nekorekti ievaddati nerakstītu ārpus bufera.

Procedūras matmul(...) prototips

int matmul( int h1, int w1, int *m1, int h2, int w2, int *m2, int *m3 );
  • Procedūras parametri: h1 un h2 ir matricas augstums un w1 un w2 ir platums attiecīgi pirmajai un otrajai matricām m1 un m2.
  • Trešās matricas m3 dimensijas nosaka matricu reizinājuma operācija.
  • Procedūra atgriež skaitli int: 0 = veiksmīga izpilde, 1 = problēma, piemēram, nesaderīgas matricas. Šādā gadījumā C programmai arī jābeidz darbs ar kodu 1: exit(1);
  • Visus nepieciešamos datu buferus nodrošina (izveido) izsaucošā C programma, tai skaita arī trešajai, rezultāta matricai. Tas nozīmē, ka arī C programmai jānosaka, cik liela būs rezultāta matrica, lai tai rezervētu pietiekoši daudz atmiņas.

Matricu elementi atmiņā glabājas kā divdimensiju masīvs: Int elementi. Piemēram, 2x3 matrica

1  2  3
4  5  6

atmiņā glabājas lineāri, kā 6 int elementi, katrs izmērā 4 baiti: { 1, 2, 3, 4, 5, 6 }

Visi datu izmēri (atsevišķie skaitļi) saiet int reģistrā, tātad nepārsniedz 4 baitu garumu. Visi skaitļi ir veseli.

Testēšana un iesniegšana

Risinājumam jābūt testētam, un jādarbojās uz asm1.linux.edu.lv servera, lietojot ARM emulatoru qemu-arm. Bez tam, tas, ka risinājums darbojas uz asm1 servera, nenozīmē, ka tajā nav kļūdas un ka par to automātiski pienāktos maksimālais vērtējums. Pieredze rāda, ka reizēm "paveicas", un risinājums darbojas, lai arī tajā ir kļūdas. Testējot vai lietojot to nākamreiz vai uz citas aparatūras tas var nestrādāt. Tāpēc lūdzu pieiet savam kodam kritiski. Piemēram, vai esat saglabājuši un atjaunojuši visus izmantotos reģistrus, sākot no R4 un uz augšu? Šī ir tipiska kļūda, kas var reizēm nostrādāt un reizēm nē.

Risinājumu jāiesūta elektroniski. Risinājumam ar visiem failiem jābūt uz servera asm1.linux.edu.lv jūsu konta direktorijā md2:

~/md2/ 

Uzskaitītie faili tiks izkopēti no minētas direktorijas MD termiņa beigās.

Jautājumus un neskaidrības par MD lūdzu iesūtīt kursa google-grupā.

KP

Literatūra

Grāmatas un citi resursi

  • ARM Architecture Reference Manual, ARM DDI 0100I, ARM Limited, 2005.
  • Intel R XScaleTM Microarchitecture Assembly Language Quick Reference Card ARM Instruction Set, Intel Corporation, 2001
  • Intel XScale R Core Developer’s Manual, ON: 273473-002, Intel Corporation, 2004
  • Intel R IXP42X Product Line of Network Processors and IXC1100 Control Plane Processor Developer’s Manual, ON: 252480-006US, Intel Corporation, 2006
  • Patterson and Hennessy, Computer Organization and Design, 4th Edition (@Amazon)
  • "Building Embedded Linux Systems" O'Reilly Media, 2008, ISBN 0596529686

Pamācības

Saites

  • Linaro - Open source software for ARM SoCs.

Atziņas