2019 oplossingen oefeningen
Met dank aan de Github van Martijn
Bestanden:
Invoer: een bestand met 1 lijn tekst van 70 karakters, bvb.:
Het spaanse graan heeft de orkaan doorstaan...
Schrijf een programma dat telt hoeveel keer de letter 'a' voorkomt. Toon de uitvoer aan de gebruiker.
%include 'gt.asm'
covar
inarea: resb 70
uitvoer: resd 1
inleiding
openin
lees
cld
sub eax, eax
sub esi, esi
sub ebx, ebx
mov al, 'a'
mov ecx, 70
terug:
cmp al, [inarea + esi]
jne verder
add ebx, 1
verder:
add esi, 1
sub ecx, 1
cmp ecx, 0
je einde
jmp terug
einde:
mov [uitvoer], ebx
uit [uitvoer]
slot
Herschrijf de vorige oefening om alle klinkers (a,e,i,o,u) te tellen.
%include 'gt.asm'
covar
inarea: resb 70
uitvoer: resd 1
inleiding
openin
lees
cld
sub eax, eax
sub esi, esi
sub ebx, ebx
mov al, 'a'
mov ecx, 70
terug:
mov al, 'a'
cmp al, [inarea + esi]
je verder
mov al, 'e'
cmp al, [inarea + esi]
je verder
mov al, 'i'
cmp al, [inarea + esi]
je verder
mov al, 'o'
cmp al, [inarea + esi]
je verder
mov al, 'u'
cmp al, [inarea + esi]
je verder
jmp skip
verder:
add ebx, 1
skip:
add esi, 1
sub ecx, 1
cmp ecx, 0
je einde
jmp terug
einde:
mov [uitvoer], ebx
uit [uitvoer]
slot
Schrijf een programma dat een woord uitleest uit het invoerbestand. Het woord staat op de eerste lijn (die verder uit allemaal spaties bestaat). Lees dan het bestand verder uit, en tel hoe vaak het woord nog voorkomt in de rest van de tekst. Toon het resultaat aan de gebruiker. (Elke lijn bevat één woord gevolgd door spaties.)
%include 'gt.asm'
covar
inarea: resb 70
uitvoer: resd 1
inleiding
openin
lees
cld
sub eax, eax
sub esi, esi
sub ebx, ebx
sub edx, edx
mov al, 'a'
mov ecx, 10
terug:
mov al, [inarea + edi]
cmp al, [inarea + esi]
jne verder
add ebx, 1
verder:
add esi, 1
sub ecx, 1
cmp ecx, 0
je next
jmp terug
next:
add edi, 70
sub edx, 1
cmp edx, 0
je einde
einde:
mov [uitvoer], ebx
uit [uitvoer]
slot
Rijen:
Schrijf een programma dat 9 getallen inleest en de volgende getallen berekent en toont:
Het gemiddelde
Hoeveel getallen groter zijn dan het gemiddelde
Hoeveel getallen kleiner zijn dan het gemiddelde
%include "gt.asm"
covar
getal: resd 9
ding: resd 1
meer: resd 1
minder: resd 1
negen: dd 9
een: dd 1
inleiding
sub ecx, ecx
sub eax, eax
sub edi, edi
mov ecx, 9
hoger:
cmp ecx, 0
jle verder
inv[getal + edi]
add eax, [getal + edi]
add edi, 4
sub ecx, 1
jmp hoger
verder:
mov [ding], eax
imul dword [een]
idiv dword [negen]
mov [ding], eax
mov ecx, 9
sub edi, edi
terug:
mov eax, [ding]
cmp eax, [getal + edi]
jl nogverder
je natel
sub eax, eax
add eax, 1
add [meer], eax
add edi, 4
jmp na
nogverder:
mov eax, [ding]
cmp eax, [getal + edi]
sub eax, eax
add eax, 1
add [minder], eax
natel:
add edi, 4
na:
loop terug
uit [ding]
uit [minder]
uit [meer]
slot
Schrijf een programma dat 6 getallen inleest en deze gesorteerd van klein naar groot afdrukt. Om te sorteren kan men als volgt te werk gaan:
doe 5 maal:
{ i = 0;
doe 5 maal
{ vergelijk element(i) met element(i+1);
if (element(i) > element(i+1) {
verwissel;
}
i = i + 1;
}
}
%include "gt.asm"
covar
getal: resd 6
nul: dd 0
hulp1: resd 1
hulp2: resd 2
teller: resd 1
inleiding
sub esi, esi
sub ecx, ecx
inv [getal]
inv [getal + 4]
inv [getal + 8]
inv [getal + 12]
inv [getal + 16]
inv [getal + 20]
begin:
sub ecx, ecx
sub esi, esi
vergelijk:
cmp ecx, 5
je verder
mov eax, [getal + esi]
mov edx, [getal + esi + 4]
cmp eax, edx
jle skip
mov [getal + esi + 4], eax
mov [getal + esi], edx
skip:
add ecx, 1
add esi, 4
jmp vergelijk
verder:
sub ecx, ecx
mov ecx, [teller]
add ecx, 1
mov [teller], ecx
cmp ecx, 5
jle begin
uit [getal]
uit [getal + 4]
uit [getal + 8]
uit [getal + 12]
uit [getal + 16]
uit [getal + 20]
slot
Strings in bestanden:
Schrijf een programma dat 2 getallen leest via inv en de som afdrukt in het uitvoerbestand. De getallen bestaan uit niet meer dan 5 cijfers. Als uitvoer willen we:
HET EERSTE GETAL IS: 39
HET TWEEDE GETAL IS: 40
===========================
DE SOM IS: 79
%include "gt.asm"
covar
hulp: resd 1
getal1: resd 1
getal2: resd 2
inarea: resb 70
outarea: resb 70
db 13,10
vb1: dd "HET EERSTE GETAL IS:"
vb2: dd "HET TWEEDE GETAL IS:"
vb3: dd "DE SOM IS: "
spatie: dd " "
lijn: dd "==========================="
som: dd "DE SOM IS:"
inleiding
openuit
inv[getal1]
inv[getal2]
# EERSTE GETAL
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
mov ecx, 20
mov esi, vb1
mov edi, outarea
rep movsb
mov eax, [getal1]
mov edi, outarea + 27
std
mov ebx, 10
lus: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lus
schrijf
# TWEEDE GETAL
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
mov ecx, 20
mov esi, vb2
mov edi, outarea
rep movsb
mov eax, [getal2]
mov edi, outarea + 27
std
mov ebx, 10
lus1: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lus1
schrijf
# STREEP
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
cld
mov ecx, 27
mov al, "="
mov edi, outarea
rep stosb
schrijf
# SOM
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
mov ecx, 20
mov esi, vb3
mov edi, outarea
rep movsb
mov eax, [getal1]
add eax, [getal2]
mov edi, outarea + 27
std
mov ebx, 10
lus2: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lus2
schrijf
slot
;BELASTING BEREKENEN
Invoer (meerdere lijnen):
kol 1-20: naam
kol 31-40: inkomen
Uitvoer (voor ieder invoerrecord):
kol 1-20: naam (idem als invoer)
kol 31-40: inkomen (idem als invoer)
kol 42-50: belasting
Deze belasting wordt als volgt berekent:
Als inkomen <= 2500, dan is belasting = 0
Als inkomen > 2500 en <= 5000, dan is belasting = (inkomen - 2500) * 10%
Als inkomen > 5000 en <= 10000, dan is belasting = (inkomen - 5000) * 20% + 250
Als inkomen > 10000, dan is belasting = (inkomen - 10000) * 40% + 1250
%include "gt.asm"
covar
hulp: resd 1
inarea: resb 70
outarea: resb 70
db 13,10
spatie: dd " "
tien: dd 10
vijf: dd 5
twee: dd 2
een: dd 1
inleiding
sub esi, esi
openuit
openin
lus:
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
lees
cmp eax, 0
je einde
cld
mov ecx, 70
mov esi, inarea
mov edi, outarea
rep movsb
mov esi, inarea + 30
mov ecx, 10
tekstbin
mov [hulp], eax
uit [hulp]
imul dword [een]
cmp eax, 2500
jg next
sub eax, eax
jmp past
next:
cmp eax, 5000
jg next1
sub eax, 2500
idiv dword [tien]
jmp past
next1:
cmp eax, 10000
jg next2
sub eax, 5000
idiv dword [vijf]
add eax, 250
jmp past
next2
sub eax, 10000
imul eax, 2
idiv dword [vijf]
add eax, 1250
past:
mov edi, outarea + 49
std
mov ebx, 10
luss: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne luss
schrijf
jmp lus
einde:
slot
Maak een invoerbestand met meerdere lijnen als volgt:
kol 1-20: naam
kol 21-25: aantal dagen
kol 31-35: dagloon
1) Schrijf een programma dat de eerste record van dit invoerbestand leest en afdrukt. De uitvoer wordt dus:
kol 1-35: idem als op invoerrecord
kol 36-70: blanco
2) Wijzig uw programma zodat nu het invoerbestand record per record afgedrukt wordt.
3) Voeg volgende functie toe aan uw programma: voor ieder invoerrecord wordt nu ook het brutoloon (= aantal-dagen * dagloon) berekend en afgedrukt in kol 42-50.
4) Voeg volgende functie toe aan uw programma: voor ieder invoerrecord wordt nu ook de afhouding (= brutoloon * 40%) berekend en afgedrukt in kol 52-60.
5) Voeg volgende functie toe aan uw programma: nadat de gegevens van het laatste invoerrecord verwerkt (en afgedrukt) zijn, wordt er: (a) een blanco lijn gedrukt, en (b) het totaal van de kolommen brutoloon en afhouding afgedrukt.
Het is verboden de bevelen voor een volgend punt in te typen zonder dat men er zich van vergewist heeft dat de voorgaande punten perfect opgelost zijn!
%include "gt.asm"
covar
hulp: resd 1
hulp1: resd 1
inarea: resb 70
outarea: resb 70
db 13,10
spatie: dd " "
tien: dd 10
vijf: dd 5
twee: dd 2
een: dd 1
totaalbruto: resd 1
totaalafhouding: resd 1
inleiding
sub esi, esi
openuit
openin
lus:
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
lees
cmp eax, 0
je einde
cld
mov ecx, 36
mov esi, inarea
mov edi, outarea
rep movsb
cld
mov esi, inarea + 21
mov ecx, 4
tekstbin
mov [hulp], eax
uit [hulp]
cld
mov esi, inarea + 31
mov ecx, 4
tekstbin
mov [hulp1], eax
uit [hulp1]
imul dword [hulp]
mov [hulp], eax
add [totaalbruto], eax
mov edi, outarea + 48
std
mov ebx, 10
luss: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne luss
mov eax, [hulp]
imul dword [een]
imul dword [twee]
idiv dword [vijf]
add [totaalafhouding], eax
mov edi, outarea + 58
std
mov ebx, 10
lus2: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lus2
schrijf
jmp lus
einde:
cld
mov ecx, 70
mov al, " "
mov edi, outarea
rep stosb
schrijf
mov eax, [totaalbruto]
mov edi, outarea + 48
std
mov ebx, 10
lusbruto: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lusbruto
mov eax, [totaalafhouding]
mov edi, outarea + 58
std
mov ebx, 10
lusafhouding: mov edx, 0
idiv ebx
add dl, 30h
xchg al, dl
stosb
xchg al, dl
cmp eax, 0
jne lusafhouding
schrijf
slot
Strings:
Schrijf een programma dat afdrukt:
WHO IS MY TAILOR?
MY TAILOR IS CHRISTIAN DIOR
MY TAILOR IS RICH
IS MY TAILOR RICH?
%include "gt.asm"
covar
outarea: resb 70
db 0Dh, 0Ah
vb1: db 'WHO IS MY TAILOR?'
vb2: db 'MY TAILOR IS CHRISTIAN DIOR'
vb3: db 'MY TAILOR IS RICH'
vb4: db 'IS MY TAILOR RICH?'
spatie: db ' '
inleiding
openuit
mov ecx, 70
mov esi, spatie
mov edi, outarea
rep movsb
mov ecx, 17
mov esi, vb1
mov edi, outarea
rep movsb
schrijf
mov ecx, 70
mov esi, spatie
mov edi, outarea
rep movsb
sub esi, esi
mov ecx, 27
mov esi, vb2
mov edi, outarea
rep movsb
schrijf
mov ecx, 70
mov esi, spatie
mov edi, outarea
rep movsb
sub esi, esi
mov ecx, 17
mov esi, vb3
mov edi, outarea
rep movsb
schrijf
mov ecx, 70
mov esi, spatie
mov edi, outarea
rep movsb
sub esi, esi
mov ecx, 18
mov esi, vb4
mov edi, outarea
rep movsb
schrijf
slot