1 / 100

Les 5: controletransfer-instructies en optimalisatie

Les 5: controletransfer-instructies en optimalisatie. Software gets slower faster than hardware gets faster (Niklaus Wirth). i1 i2 i3 i4 i5 i6 i7 i8 i9 i10. Controletransferinstructies. Instructies die een nieuwe waarde toekennen aan de instructiewijzer. Overzicht. Sprongen

varana
Download Presentation

Les 5: controletransfer-instructies en optimalisatie

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Les 5: controletransfer-instructies en optimalisatie Software gets slower faster than hardware gets faster (Niklaus Wirth)

  2. i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 Controletransferinstructies Instructies die een nieuwe waarde toekennen aan de instructiewijzer

  3. Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie

  4. Sprongen • Onvoorwaardelijke sprongen • Voorwaardelijke sprongen • Berekende sprongen

  5. Onvoorwaardelijke sprongen 10 i1 jmp 30 i3 i4 i5 i6 i7 i8 jmp 26 i10 14 jmp adres 18 22 reg[eip] = adres 26 30 34 38 42 46 Sprong: onvoorwaardelijke Instructie: jmp

  6. Voorwaardelijke sprongen i1 jle 30 10 i1 jle 30 i3 i4 jmp 38 i6 i7 i8 i9 i10 14 18 22 i3 i4 jmp 38 i6 i7 26 30 34 38 i8 i9 i10 42 Basis-blokken 46 Sprong: voorwaardelijke

  7. Sprong: condities Sprongcondities (1) instructie sprong jz jump if zero jc jump if carry jo jump if overflow jp jump if parity js jump if sign jnz jump if not zero jnc jump if not carry jno jump if not overflow jnp jump if not parity jns jump if not sign

  8. Sprongcondities (2) instructie sprong jg jnle jump if greater jge jnl jump if greater or equal jl jnge jump if less jle jng jump if less or equal je jump if equal jne jump if not equal ja jnbe jump if above jae jnb jump if above or equal jb jnae jump if below jbe jna jump if below or equal 2-complement binair

  9. Statisch vs. berekend adres mov ebx,100 jmp ebx jmp 100 reg[eip] = 100 reg[eip] = reg[ebx] Sprong: berekende

  10. Switch: implementatie 1 mov ebx,a mov edx,b cmp ebx,0 jne $23 add edx,3 jmp $20 $23: cmp ebx,2 jne $24 sub edx,4 jmp $20 $24: cmp ebx,3 jne $25 sub edx,3 jmp $20 $25: add edx,7 $20: mov b, edx if (a == 0) b += 3; else if (a == 2) b -= 4; else if (a == 3) b -= 3; else b += 7; switch (a) { case 0: b += 3; break; case 2: b -= 4; break; case 3: b -= 3; break; default: b += 7; }

  11. Switch: implementatie 1 mov ebx,a mov edx,b cmp ebx,0 jne $23 add edx,3 jmp $20 $23: cmp ebx,2 jne $24 sub edx,4 jmp $20 $24: cmp ebx,3 jne $25 sub edx,3 jmp $20 $25: add edx,7 $20: mov b, edx

  12. Switch: implementatie 2 if (a < 0) b += 7; else if (a > 3) b += 7; else switch (a) { case 0: b += 3; break; case 1: b += 7; break; case 2: b -= 4; break; case 3: b -= 3; break; } mov ebx,a mov edx,b cmp ebx,0 jl $25 cmp ebx,3 jg $25 mov eax,[tabel+ebx*4] jmp eax $22: add edx,3 jmp $20 $23: sub edx,4 jmp $20 $24: sub edx,3 jmp $20 $25: add edx,7 $20: mov b, edx tabel: .long $22 .long $25 .long $23 .long $24

  13. Switch: implementatie 2 mov ebx,a mov edx,b cmp ebx,0 jl $25 cmp ebx,3 jg $25 mov eax,[tabel+ebx*4] jmp eax $25: add edx,7 $22: add edx,3 jmp $20 $23: sub edx,4 jmp $20 $24: sub edx,3 jmp $20 $20: mov b, edx

  14. Switch: implementatie 3 int tabel[4] = {3,7,-4,-3}; if (a < 0) b += 7; else if (a > 3) b += 7; else b += tabel[a]; mov ebx,a mov edx,b cmp ebx,0 jl $25 cmp ebx,3 jg $25 add edx,[tabel+ebx*4] jmp $20 $25: add edx,7 $20: mov b, edx tabel: .long 3 .long 7 .long -4 .long -3

  15. Switch: implementatie 3 mov ebx,a mov edx,b cmp ebx,0 jl $25 cmp ebx,3 jg $25 $25: add edx,7 add edx,[tabel+ebx*4] jmp $20 $20: mov b, edx

  16. Absoluut vs. Relatief adres 10 i1 jmp 30 i3 i4 i5 i6 i7 i8 jmp eip-20 i10 14 • Absoluut spring naar adres n • Relatief spring n bytes verder/terug 18 22 26 30 34 38 42 reg[eip] = reg[eip] + n 46

  17. 38 Positie-onafhankelijke code 10 10 i1 jmp 30 i3 i4 i5 i6 i7 i8 jmp eip-20 i10 14 14 18 18 i1 jmp 30 i3 i4 i5 i6 i7 i8 jmp eip-20 i10 22 22 26 26 30 30 34 34 38 38 42 42 46 46 50 54

  18. Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie

  19. lus Lusinstructie 10 loop adres i1 i2 mov ecx,5 i4 i5 i6 i7 i8 loop 22 i10 14 Decrementeer reg[ecx] Spring naar adres indien reg[ecx] != 0 18 22 26 30 34 38 42 46 Instructie: loop

  20. lus Geprogrammeerde lus 10 i1 i2 mov ecx,5 i4 i5 i6 i7 i8 sub ecx,1 jnz 22 14 18 22 26 30 34 38 42 46

  21. lusimplementaties while/for do-while do-while while/for 1 jmp 1 jmp cmp cmp 1 n jz jz cmp cmp n-1 jnz jnz jmp jmp n-1 n-1 1

  22. Overzicht • Sprongen • Lussen • Procedure-oproep en –terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie

  23. Functieoproep call adres 10 i1 14 reg[esp] = reg[esp]-4 mem[reg[esp]] = reg[eip] reg[eip] = adres i2 18 call 34 22 i4 26 i5 30 i6 ret 34 i7 38 i8 reg[eip] = mem[reg[esp]]; reg[esp] = reg[esp] + 4 42 i9 46 i10 50 ret

  24. Controleverloopgraaf van functie-oproep 10 i1 i1 i2 call 34 14 i2 18 call 34 i7 i8 i9 i10 ret 22 i4 26 i5 30 i6 34 i7 38 i4 i5 i6 i8 42 i9 46 i10 50 ret

  25. Functie-oproep call r,adres bal r, adres 10 i1 reg[r] = reg[eip] reg[eip] = adres 14 i2 18 call r,34 22 i4 26 i5 jmp r 30 i6 34 i7 reg[eip] = reg[r] 38 i8 42 i9 46 i10 Instructie: call 50 jmp r Instructie: ret Instructie: bal

  26. Functie-oproep en -terugkeer int vijfvoud(int n) { if (n > 0) return n * 5; else return 0; } int g; main() { g = vijfvoud(6); }

  27. Code s=? z=? vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax ???????? 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx ???????? edx ???????? esp 00000108 eip 00000315 ???????? 100 controlestapel ???????? 104 ???????? 108

  28. Code s=? z=? vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000006 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx ???????? edx ???????? esp 00000108 eip 00000320 push 325 jmp 300 ???????? 100 ???????? 104 ???????? 108

  29. Code s=? z=? vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000006 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx ???????? edx ???????? esp 00000104 eip 00000300 ???????? 100 00000325 104 ???????? 108

  30. Code s=0 z=0 vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000006 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx ???????? edx ???????? esp 00000104 eip 00000302 ???????? 100 00000325 104 ???????? 108

  31. Code s=0 z=0 vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000006 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx ???????? edx ???????? esp 00000104 eip 00000307 ???????? 100 00000325 104 ???????? 108

  32. Code s=0 z=0 vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000006 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx 00000005 edx ???????? esp 00000104 eip 00000312 ???????? 100 00000325 104 ???????? 108

  33. Code s=0 z=0 vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000030 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx 00000005 edx 00000000 esp 00000104 eip 00000314 ???????? 100 00000325 104 ???????? 108

  34. Code s=0 z=0 vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000030 300: 302: 304: 306: 307: 312: 314: 315: 320: 325: ebx 00000005 edx 00000000 esp 00000108 eip 00000325 ???????? 100 00000325 104 ???????? 108

  35. Bewaren registers s=0 z=0 vijfvoud: push edx cmp eax,0 jg positief xor eax, eax pop edx ret positief: mov ebx, 5 imul ebx pop edx ret main: mov eax, 6 call vijfvoud mov g, eax eax 00000030 300: 301: 303: 305: 307: 308 309: 314: 316: 317: 318: 323: 328: ebx 00000005 edx ???????? esp 00000108 ???????? 96 edx 100 00000328 104 ???????? 108 Registers: bewaren

  36. Bewaren registers vijfvoud: push edx push ebx cmp eax,0 jg positief xor eax, eax pop ebx pop edx ret positief: mov ebx, 5 imul ebx pop ebx pop edx ret main: mov eax, 6 call vijfvoud mov g, eax s=0 z=0 eax 00000030 ebx ???????? edx ???????? ???????? 092 ebx 096 edx 100 t.k. adres 104 ???????? 108

  37. Controleverloopgraaf mov eax,6 call vijfvoud vijfvoud: push edx push ebx cmp eax,0 jg positief xor eax, eax pop ebx pop edx ret positief: mov ebx, 5 imul ebx pop ebx pop edx ret mov g, eax

  38. Controleverloopgraaf mov eax,6 call vijfvoud vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: push edx push ebx mov ebx, 5 imul ebx pop ebx pop edx ret mov g, eax

  39. Controleverloopgraaf mov eax,6 call vijfvoud vijfvoud: cmp eax,0 jg positief xor eax, eax ret positief: push edx mov edx, 5 imul edx pop edx ret mov g, eax

  40. Parameterdoorgave via stapel 1 vijfvoud: mov eax,[esp+4] cmp eax,0 jg positief xor eax, eax ret positief: mov ebx, 5 imul ebx ret main: push 6 call vijfvoud add esp,4 mov g, eax Parameterdoorgave ???????? 096 esp t.k. adres 100 00000006 104 ???????? 108

  41. Parameterdoorgave via stapel 2 vijfvoud: mov eax,[esp+4] cmp eax,0 jg positief xor eax, eax ret 4 positief: mov ebx, 5 imul ebx ret 4 main: push 6 call vijfvoud add esp,4 mov g, eax ???????? 096 esp t.k. adres 100 00000006 104 ???????? 108

  42. Lokale veranderlijken int vijfvoud(int n) { int resultaat; if (n > 0) resultaat = n * 5; else resultaat = 0; return resultaat; } int g; main() { g = vijfvoud(6); }

  43. Lokale veranderlijken vijfvoud: sub esp,4 cmp eax,0 jg positief xor eax,eax mov [esp], eax jmp einde positief: mov ebx, 5 imul ebx mov [esp], eax einde: mov eax,[esp] add esp,4 ret programma: mov eax, 6 call vijfvoud mov g, eax ???????? 096 esp ???????? 100 t.k. adres 104 ???????? 108

  44. Controleverloopgraaf mov eax,6 call vijfvoud vijfvoud: sub esp,4 cmp eax,0 jg positief positief: mov ebx, 5 imul ebx mov [esp],eax xor eax, eax mov [esp],eax jmp end end: mov eax,[esp] add esp,4 ret mov g, eax

  45. Compleet beeld vijfvoud: sub esp,4 push ebx push edx mov eax, [esp+16] cmp eax,0 jg positief xor eax,eax mov [esp+8], eax jmp einde positief: mov ebx, 5 imul ebx mov [esp+8], eax einde: mov eax,[esp+8] pop edx pop ebx add esp, 4 ret programma: push 6 call vijfvoud add esp,4 mov g, eax stack frame esp edx esp+4 ebx esp+8 resultaat esp+12 t.k. adres esp+16 00000006

  46. Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie

  47. Onderbrekingen • Sprong naar een routine via een nummer i.p.v. via een adres • Adressen van routines opgeslagen in een tabel van adressen (vectortabel) • Gebruikt voor het opvangen van fouten, of als interface naar het besturingssysteem

  48. i1 i2 i3 i4 int 3 i5 i1 i6 i2 i7 i3 i8 i4 int 2 i5 i10 i6 i11 Onderbrekings-routine 3 t Onderbreking vectortabel 0 1 2 3 4

  49. Systeemoperaties • Controle van de machine: manipulatie van de processortoestand • onderbrekingen aan/uit • veranderen van privilegeniveau • halt-instructie • omschakeling big-endian naar little-endian • geheugenbeheer (caches, virtueel geheugen, enz.)

  50. Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie

More Related