ICT Infrastructuren/Opdracht 1

Uit Werkplaats
Ga naar: navigatie, zoeken


ICT Infrastructuren

Categorie Comment for ICTI is niet gevonden

Opgaventekst van opdracht 1

De bestanden die bij opgave 1 horen

Let op de deadline: maandag 9 december 2013 voor het hoorcollege. Graag inleveren per e-mail aan mij.

X86-assembly

Je zult vooral de volgende instructies nodig hebben:

  • mov dest, src – kopieert src naar dest.
  • add dest, src – telt src bij dest op (en zet de vlaggen).
  • sub dest, src – trekt src van dest af (en zet de vlaggen).
  • cmp dest, src – trekt src van dest af, maar vergeet het resultaat. Wel worden de vlaggen gezet; dat is handig als je twee getallen wilt vergelijken.
  • imul dest, src, const – vermenigvuldigt src met const en slaat het resultaat op in dest.
  • sar dest, src – verschuift dest om src bits naar rechts, ofwel deelt dest door 2src.
  • je label – spring naar label als het resultaat van de laatste berekening (volgens de vlaggen) gelijk aan 0 was
en op dezelfde wijze werken jne (jump if not equal to 0), jg (jump if greater than 0), jl (jump if less than 0), jge (jump if greater than or equal to 0), jle (jump if less than or equal to 0).

Als src en dest kun je telkens opgeven:

  • een constante, b.v. 3
  • een register, b.v. ecx (Zie de tekst van de opgave voor alle registernamen. ebp en esp zijn al bezet.)
  • een geheugenadres. Dat kan zijn:
    • een label
    • een register tussen [ ] plus/min een constante, b.v. [ebp + 8]
    • de som van twee registers tussen [ ] plus/min een constante, b.v. [eax + edi - 4]
    • Bij een adres met register(s) kun je één register met 2, 4 of 8 vermenigvuldigen, b.v. [ecx + ebx*4 + 8]

Je mag maximaal één geheugenadres per instructie opgeven; dat is gedaan om ervoor te zorgen dat de CPU niet al te inefficiënt wordt: nu hoeft hij maximaal één keer per instructie uit het geheugen te lezen of ernaar te schrijven.

Voor meer informatie over de instructies die je kunt gebruiken: Er zijn veel x86 assembly tutorials, b.v. [1]. We gebruiken de Intel-syntax, dus mov eax,edx betekent dat register edx naar eax gekopiëerd wordt.

Voor meer informatie over opties van de Gnu Assembler (die door gcc wordt gebruikt): [2]

Software installeren

Als je thuis je programma wilt assembleren en testen, moet je de volgende programma's installeren: gcc, Gnu Assembler en Gnu make. De laatste twee programma's zijn onderdeel van de Gnu binutils.

Windows

Een versie voor Windows van deze programma's die we vorig jaar met succes gebruikt hebben is MinGW. (Let op: onder MinGW heeft het programma make niet precies dezelfde naam.) In deze map staat de automatische installer; het is een bestand met de naam mingw-get-inst-datum.exe.

Marijn van der Zaag heeft me meegedeeld hoe hij de boel werkend kreeg onder Windows XP en Windows 7:

  1. Installeer MinGW met de installer die hierboven genoemd wordt.
  2. Tijdens de installatie wordt gevraagd welke andere utilities je wilt mee-installeren. Het is voldoende de C-compiler (is al aangevinkt) en MSYS te installeren. (In MSYS zit o.a. make.)
  3. Volg deze instructie (gekopieerd van [3]): “Add C:\MinGW\bin; to the PATH environment variable by opening the System control panel, going to the Advanced tab, and clicking the Environment Variables button.”
  4. Pas my_comb_sort.s aan in Notepad++ (Notepad werkt niet handig):
    • Verander "my_comb_sort" naar "_my_comb_sort" (underscore ervoor)
  5. Open de MinGW Shell en navigeer naar de map waar je de opdrachtbestanden in hebt staan, door zoiets als cd "D:/documents/studiestuff/ICT-infrastructuren/opgave1" in te typen
  6. Typ make
  7. Open het nieuwe bestand my_comb_sort.exe door die naam in te typen in de Shell

Nu kun je in Notepad++ de assemblycode veranderen van my_comb_sort.s en het programma steeds compileren en runnen door de opdrachten in de laatste twee stappen.

Problemen en oplossingen

  • Voor degenen die MinGW gebruiken: MinGW installeert de programma’s in de map C:\MinGW\bin\ en noemt ze mingw32-gcc en mingw32-make. De MinGW Shell die Marijn hierboven noemt doet alles automatisch, maar als je cmd wilt gebruiken moet je zelf hiervoor zorgen:
    • In het cmd-venster moet je mingw32-make intypen in plaats van make.
    • In het bestand Makefile wordt aan make verteld hoe de C-compiler heet. Verander gcc in mingw32-gcc.
    • Als Windows de programma’s niet kan vinden, moet je de map waarin ze staan aan de environment-variabele PATH toevoegen (als ik me goed herinner: Computer > contextmenu-punt Properties > button Environment variables...).
  • Als je na het intypen van make een foutmelding krijgt in de trant van “Undefined symbol: my_comb_sort”, probeer dan in het bestand my_comb_sort.s de label my_comb_sort: te vervangen door _my_comb_sort:. (Veel versies van C plaatsen automatisch een _ aan het begin van elke functienaam, maar de assembler doet dat niet.)
  • Bij sommige versies van de Assembler worden commentaren (regels die met # beginnen) niet goed herkend. Vervang dan de commentaren door commentaren in C-formaat (begin een commentaar met /* en eindig het met */).
  • Op Mac OSX is er een fout in de assembler: sprong-instructies werken soms niet goed. In het bestand macros.s staan macrodefinities die deze fout corrigeren. Je kunt dit bestand aan je programma toevoegen door aan het begin een regel met de tekst op te nemen:
.include "macros.s"