3.2. Utfordringer middels
Jeg gjorde middels-utfordringer for kontroll-13
, som er et custom språk som minner om assembly, med eget instruksjonssett. Programmet må “bygges” (kompileres), og består av et data-segment som definerer variabler, og et instruksjons-segment som er selve instruksjonene. Disse er skilt med en linje av =
, hvor den øverste delen er data-segmentet, og det nederste er instruksjons-segmentet.
3.2.1.01_rtfm
1
| Skriv et program som skriver ut teksten "Hello, world!" (ett ord per tegn).
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| :tekst .DATA 0x48 0x65 0x6c 0x6c 0x6f 0x2c 0x20 0x77 0x6f
.DATA 0x72 0x6c 0x64 0x21 0x00 ; "Hello, world!"
==========================================================
.ALIAS neste 0xff
FINNE tekst
:løkke
LASTE neste
FORBI /NULL 0
HOPPE ferdig
UT neste
HOPPE løkke
:ferdig
STOPPE 0
|
3.2.1.02_sum-of-all-fears
1
| Skriv et program som leser inn to tallverdier og skriver ut summen av dem (1 ord på 13 bit).
|
1
2
3
4
5
6
7
8
9
10
11
12
| :a .DATA 0
:b .DATA 0
=================
INN a
INN b
:løkke
PLUSSE a b
UT a
:ferdig
STOPPE 0
|
3.2.1.03_it-compares
1
| Skriv et program som leser inn to tallverdier A og B og skriver ut enten tallverdien 1 hvis A er større enn B, eller 0 i alle andre tilfeller.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| :null .DATA 0
:en .DATA 1
:a .DATA 0
:b .DATA 0
======================
INN a
INN b
:løkke
MINUSE b a
FORBI /MENTE 0
HOPPE astor
HOPPE bstor
:astor
UT en
HOPPE ferdig
:bstor
UT null
HOPPE ferdig
:ferdig
STOPPE 0
|
3.2.1.04_encryption
1
| Skriv et program som leser inn en nullterminert ASCII-streng (1 ord per tegn), tar ENTEN (XOR) av hvert tegn med 0x1b39 og skriver ut resultatet.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| :key .DATA 0x1b39
:tekst
=========================
:løkke
INN tekst
FORBI /NULL 0
HOPPE ferdig
ENTEN tekst key
UT tekst
HOPPE løkke
:ferdig
STOPPE 0
|
3.2.1.05_decryption
1
2
3
4
| Skriv et program som leser inn:
1. Mengden data som skal dekrypteres (1 ord), deretter
2. Selve de krypterte dataene.
Programmet skal ta ENTEN (XOR) av dataene med 4919 og skrive ut resultatet.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| :key .DATA 4919
:en .DATA 1
:lengde .DATA 0
:tekst
=========================
INN lengde
:løkke
FORBI /NULL 0
STOPPE 0
INN tekst
ENTEN tekst key
UT tekst
MINUSE lengde en
HOPPE løkke
|
3.2.1.06_calculator + 3.2.1.07_fastulator
Disse oppgavene har samme løsningen. Hver instruksjon tar èn syklus.
3.2.1.06_calculator
1
2
3
4
5
6
7
8
| Skriv et program som evaluerer et regnestykke og skriver resultatet til utstrømmen.
- Regnestykket er på formen 10 + 5 - 3 * 4 / 2 =, hvor hvert ord i inputen er enten et tall eller en operator.
- Operatorene er ASCII-tegn.
- Regnestykket skal evalueres fra venstre mot høyre, slik at svaret på regnestykket i eksemplet skal bli 24.
- Operatorene er +, -, *, / og =.
- Programmet skal skrive ut resultatet når operatoren er = og så stoppe med feilkode 0.
- Hvis man forsøker å dele på 0 skal programmet stoppe med feilkode 1 uten å skrive ut noe.
- Hvis operatoren er ugyldig skal programmet stoppe med feilkode 2 uten å skrive ut noe.
|
3.2.1.07_fastulator
1
2
3
| Skriv en optimalisert utgave av programmet fra forrige oppgave ("calculator").
For å bestå denne oppgaven må programmet ditt være effektivt nok til å løse alle testene på det tilmålte antallet sykluser. For øvrig er kravene de samme som i forrige oppgave.
|
Løsningen
Løsningen er basert på at vi sjekker èn og èn operasjon, og hvis den første operasjonen vi sjekker for ikke stemmer, så går vi videre til neste.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| :tall .DATA 0
:operator .DATA 0
:res .DATA 0
=====================================
INN res
HOPPE løkke
:ikke_pluss
FORBI /RESULTAT 0x2a
HOPPE ikke_pluss_gange
INN tall
GANGE res tall
:løkke
INN operator
FORBI /RESULTAT 0x2b
HOPPE ikke_pluss
INN tall
PLUSSE res tall
HOPPE løkke
:ikke_pluss_gange
FORBI /RESULTAT 0x2d
HOPPE ikke_pluss_gange_minus
INN tall
MINUSE res tall
HOPPE løkke
:ikke_pluss_gange_minus
FORBI /RESULTAT 0x2f
HOPPE ikke_pluss_gange_minus_dele
INN tall
FORBI /NULL 0
STOPPE 1
DELE res tall
HOPPE løkke
:ikke_pluss_gange_minus_dele
FORBI /RESULTAT 0x3d
STOPPE 2
UT res
STOPPE 0
|