Skip to main content

2018 oefeningen hoofdstuk 3 rijen oplossingen

RIJEN


Hoger of lager of gemiddeld?
----------------------------

Schrijf een programma dat 6 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
gemiddelde: resd 1
groterdangemiddelde: resd 1
kleinerdangemiddelde: resd 1
getal: resd 6
een: dd 1
zes: dd 6
inleiding
mov eax, 0
mov ecx, [zes]
mov edi, 0

hoger:
cmp ecx, 0
jle verder

inv [getal + edi]
add eax, [getal + edi]
add edi, 4
sub ecx, 1
jmp hoger

verder:
imul dword [een]
idiv dword [zes]
mov [gemiddelde], eax

mov edi, 0
mov ebx, 0
mov edx, 0
mov ecx, [zes]

lus:
cmp ecx, 0
jle einde

mov eax, [getal + edi]
add edi, 4
sub ecx, 1

cmp eax, [gemiddelde]
jl kleinerdan
jg groterdan
je lus

kleinerdan:
add ebx, 1
jmp lus

groterdan:
add edx, 1
jmp lus

einde:
mov [kleinerdangemiddelde], ebx
mov [groterdangemiddelde], edx
uit [gemiddelde]
uit [groterdangemiddelde]
uit [kleinerdangemiddelde]

slot





Sorteren
--------

Schrijf een programma dat 7 getallen inleest en deze gesorteerd van klein naar groot afdrukt. Om te sorteren kan men als volgt te werk gaan:

doe 6 maal:
  { i = 0;
    doe 6 maal
      { vergelijk element(i) met element(i+1);
        if (element(i) > element(i+1) {
          verwissel;
        }
        i = i + 1;
      }
  }


%include "gt.asm"
covar
getal: resd 7
inleiding
mov ecx, 7
mov edi, 0

invoer:
    jle ordenen
    inv [getal + edi]
    add edi, 4
    loop invoer

ordenen:
    mov eax, 6
    
grotelus:
    cmp eax, 0
    jle uitvoer

lus:
    mov ecx, 6
    mov edi, 0

grootstnaarachteren:
    cmp ecx, 0
    jle volgendelus
    
    mov edx, [getal + edi]
    add edi, 4
    
    cmp edx, [getal + edi]
    jle grootstnaarachteren

mov ebx, [getal + edi]
mov [getal + edi], edx
sub edi, 4
mov [getal + edi], ebx
add edi, 4
sub ecx, 1
jmp grootstnaarachteren

volgendelus:
sub eax, 1
jmp grotelus


uitvoer:
    mov edi, 0
    mov ecx, 7

lustwee:
    cmp ecx, 0
    jle einde
    
    uit [getal + edi]
    add edi, 4
    sub ecx, 1
    jmp lustwee

einde:
slot





MOVSB/STOSB

   1
-------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: 19 1B 1E ?? ?? 1C ?? 26 ??
PROGRAMMA

De volgende instructies worden uitgevoerd.

std
mov edi, a+6
mov eax, Dh
mov ecx, 2
rep stosb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: 19 1B 1E ?? ?? 0D 0D 26 ??




   2
-------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: ?? 23 ?? 20 ?? 1D 27 ?? ?? ?? 22
PROGRAMMA

De volgende instructies worden uitgevoerd.

std
mov edi, a+7
mov eax, 18h
mov ecx, 7
rep stosb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: ?? 18 18 18 18 18 18 18 ?? ?? 22






   3
-------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: 1C 21 ?? 1A 15 25 ?? 1D 1F 1B 1F
PROGRAMMA

De volgende instructies worden uitgevoerd.

std
mov edi, a+9
mov eax, 10h
mov ecx, 10
rep stosb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: 10 10 10 10 10 10 10 10 10 10 1F





   4
--------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: ?? 1D 27 ?? 1F ?? ?? ??
PROGRAMMA

De volgende instructies worden uitgevoerd.

cld
mov edi, a+4
mov eax, 1Dh
mov ecx, 4
rep stosb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: ?? 1D 27 ?? 1D 1D 1D 1D




   5
--------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: 25 ?? ?? 26 16 1F 26 26 ?? ?? ??
PROGRAMMA

De volgende instructies worden uitgevoerd.

std
mov edi, a+9
mov eax, Fh
mov ecx, 3
rep stosb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: 25 ?? ?? 26 16 1F 26 0F 0F 0F ??




   6
--------

Wat staat er in het geheugen als achtereenvolgens onderstaande instructies worden uitgevoerd?
GEHEUGENINHOUD (initieel, hexadecimaal)

Initieel is de inhoud van het geheugen:

a: 26 20 22 21 23 25 20 ?? ?? 16 14

b: 18 1D 23 14 1A 23 1B 1B
PROGRAMMA

De volgende instructies worden uitgevoerd.

cld
mov edi, a+5
mov esi, b+2
mov ecx, 5
rep movsb

GEHEUGENINHOUD (na uitvoering, hexadecimaal)

Vul aan:

a: 26 20 22 21 23 23 14 1A 23 1B 14

b: 18 1D 23 14 1A 23 1B 1B





STRINGS

Karakterstrings
----------------

Schrijf een programma dat afdrukt:

WHO IS MY TAILOR?
MY TAILOR IS CHRISTIAN DIOR
MY TAILOR IS RICH
IS MY TAILOR RICH?

Definieer zo weinig mogelijk karakterstrings, bvb.:

'MY TAILOR?'
'IS RICH'
'WHO'
'CHRISTIAN DIOR'


%include "gt.asm"
covar
outarea: times 70 db (' ')
        db 0Dh, 0Ah
mytailor: db 'MY TAILOR?'
isrich: db 'IS RICH'
who: db 'WHO'
christiandior: db 'CHRISTIAN DIOR'
lchristiandior: EQU $-christiandior
inleiding
openuit
cld
mov ecx, 70
mov al, ' '
mov edi, outarea
rep stosb


mov ecx, 3
mov esi, who
mov edi, outarea
rep movsb

mov ecx, 2
mov esi, isrich
mov edi, outarea+4
rep movsb

mov ecx, 10
mov esi, mytailor
mov edi, outarea+7
rep movsb
schrijf


mov ecx, 17
mov al, ' '
mov edi, outarea
rep stosb

mov ecx, 9
mov esi, mytailor
mov edi, outarea
rep movsb

mov ecx, 2
mov esi, isrich
mov edi, outarea+10
rep movsb

mov ecx, lchristiandior
mov esi, christiandior
mov edi, outarea+13
rep movsb
schrijf


mov ecx, 17
mov al, ' '
mov edi, outarea+10
rep stosb

mov ecx, 7
mov esi, isrich
mov edi, outarea+10
rep movsb
schrijf


mov ecx, 24
mov al, ' '
mov edi, outarea
rep stosb

mov ecx, 2
mov esi, isrich
mov edi, outarea
rep movsb

mov ecx, 9
mov esi, mytailor
mov edi, outarea+3
rep movsb

mov ecx, 4
mov esi, isrich+3
mov edi, outarea+13
rep movsb

mov ecx, 1
mov esi, mytailor+9
mov edi, outarea+17
rep movsb
schrijf
slot




BESTANDEN

Letters zoeken...
-----------------

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
hulpd: resd 1
inleiding
openin
lees
cld
mov eax, 0
mov ebx, 0

mov ecx, 70
mov edi, 0
mov al, 'a'

lus:
cmp al, [inarea + edi]
jne verder
add ebx, 1

verder:
add edi, 1
loop lus

mov [hulpd], ebx
uit [hulpd]
slot





Klinkers zoeken
---------------

Herschrijf de vorige oefening om alle klinkers (a,e,i,o,u) te tellen.


%include "gt.asm"
covar
inarea: resb 70
hulpd: resd 1
inleiding
openin
lees
cld
mov eax, 0
mov ebx, 0
mov ecx, 70
mov edi, 0

lus:
mov al, 'a'
cmp al, [inarea + edi]
je gelijk

mov al, 'e'
cmp al, [inarea + edi]
je gelijk

mov al, 'i'
cmp al, [inarea + edi]
je gelijk

mov al, 'o'
cmp al, [inarea + edi]
je gelijk

mov al, 'u'
cmp al, [inarea + edi]
je gelijk
jmp verder

gelijk:
add ebx, 1

verder:
add edi, 1
loop lus

mov [hulpd], ebx
uit [hulpd]
slot





Woorden zoeken
--------------

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
woord: resb 70
aantal: dd 1
een: dd 1
zeventig: dd 70
inleiding
openin
mov ebx, 0

lees
cld
mov ecx, 70
mov esi, inarea
mov edi, woord
rep movsb

lezen:
lees
cmp eax, 0
je einde

mov ecx, 70
mov esi, 0

lus:
    mov al, [woord + esi]
    cmp al, [inarea + esi]
    jne lezen
    add esi, 1
    loop lus
add ebx, 1
jmp lezen

einde:
mov [aantal], ebx
uit [aantal]
slot






STRINGS IN BESTANDEN

Tel op
------

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
outarea: resb 70
        db 0Dh, 0Ah
getal1: resd 1
getal2: resd 1
som: resd 1
tekstgetal1: db 'HET EERSTE GETAL IS:'
tekstgetal2: db 'HET TWEEDE GETAL IS:'
tekstsom: db 'DE SOM IS:'
inleiding
openuit
inv [getal1]
inv [getal2]

; som
mov eax, [getal1]
add eax, [getal2]
mov [som], eax

; eerste getal
cld
call legelijn

mov ecx, 20
mov esi, tekstgetal1
mov edi, outarea
rep movsb

mov eax, [getal1]
call omzetascii
schrijf

; tweede getal
call legelijn

mov ecx, 20
mov esi, tekstgetal2
mov edi, outarea
rep movsb

mov eax, [getal2]
call omzetascii
schrijf

; lijn
call legelijn

mov ecx, 27
mov al, '='
mov edi, outarea
rep stosb
schrijf

; som twee getallen
call legelijn

mov ecx, 10
mov esi, tekstsom
mov edi, outarea
rep movsb

mov eax, [som]
call omzetascii
schrijf
slot

legelijn:
mov ecx, 70
mov al, ' '
mov edi, outarea
rep stosb
ret

omzetascii:
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

cld
ret






BTW-berekening
--------------

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
inarea: resb 70
outarea: resb 70
        db 0Dh, 0Ah
een: dd 1
tien: dd 10
twintig: dd 20
veertig: dd 40
honderd: dd 100
inleiding
openin
openuit

invoerbestand:
lees
cmp eax, 0
je einde

; uitvoer leeg maken
cld
mov ecx, 70
mov al, ' '
mov edi, outarea
rep stosb

; naam en inkomen kopiëren
mov ecx, 40
mov esi, inarea
mov edi, outarea
rep movsb

; inkomen (string naar integer)
mov ecx, 10
mov esi, inarea + 30
tekstbin

; belasting berekenen
cmp eax, 2500
jle eerste
cmp eax, 5000
jle tweede
cmp eax, 10000
jle derde
jmp vierde

eerste:
mov eax, 0
jmp verder

tweede:
sub eax, 2500
imul dword [tien]
idiv dword [honderd]
jmp verder

derde:
sub eax, 5000
imul dword [twintig]
idiv dword [honderd]
add eax, 250
jmp verder

vierde:
sub eax, 10000
imul dword [veertig]
idiv dword [honderd]
add eax, 1250

; belasting (integer naar string)
verder:
mov edi, outarea + 49

lus:
std
mov edx, 0
idiv dword [tien]
add dl, 30h
xchg al, dl
stosb
xchg al, dl

cmp eax, 0
jne lus

schrijf
jmp invoerbestand

einde:
slot






Loonberekening
--------------

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
inarea: resb 70
outarea: resb 70
        db 0Dh, 0Ah
hulp: resd 1
brutoloon: resd 1
afhouding: resd 1
tien: dd 10
veertig: dd 40
honderd: dd 100
inleiding
openin
openuit

; nog invoer?
invoerbestand:
lees
cmp eax, 0
je einde

; uitvoer leeg
cld
call leeg

; copy invoer to uitvoer
mov ecx, 35
mov esi, inarea
mov edi, outarea
rep movsb

; aantal dagen to integer
mov ecx, 5
mov esi, inarea + 20
tekstbin
mov [hulp], eax

; dagloon to integer
mov ecx, 5
mov esi, inarea + 30
tekstbin

; brutoloon berekenen
imul dword [hulp]
mov [hulp], eax
mov ebx, [brutoloon]
add ebx, eax
mov [brutoloon], ebx

; brutoloon afdrukken
mov edi, outarea + 49
call omzetascii

; afhouding berekenen
mov eax, [hulp]
imul dword [veertig]
idiv dword [honderd]
mov ebx, [afhouding]
add ebx, eax
mov [afhouding], ebx

; afhouding afdrukken
mov edi, outarea + 59
call omzetascii

schrijf
jmp invoerbestand

einde:
; blanco lijn
call leeg
schrijf

; totaal brutoloon afdrukken
mov eax, [brutoloon]
mov edi, outarea + 49
call omzetascii

; totaal afhouding afdrukken
mov eax, [afhouding]
mov edi, outarea + 59
call omzetascii

schrijf
slot

leeg:
mov ecx, 70
mov al, ' '
mov edi, outarea
rep stosb
ret


omzetascii:
std

lus:
mov edx, 0
idiv dword [tien]
add dl, 30h
xchg al, dl
stosb
xchg al, dl

cmp eax, 0
jne lus
cld
ret