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