1k likes | 1.15k Views
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
E N D
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 • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie
Sprongen • Onvoorwaardelijke sprongen • Voorwaardelijke sprongen • Berekende sprongen
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
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
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
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
Statisch vs. berekend adres mov ebx,100 jmp ebx jmp 100 reg[eip] = 100 reg[eip] = reg[ebx] Sprong: berekende
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; }
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
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
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
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
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
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
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
Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie
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
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
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
Overzicht • Sprongen • Lussen • Procedure-oproep en –terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie
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
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
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
Functie-oproep en -terugkeer int vijfvoud(int n) { if (n > 0) return n * 5; else return 0; } int g; main() { g = vijfvoud(6); }
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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); }
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
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
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
Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie
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
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
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.)
Overzicht • Sprongen • Lussen • Procedure-oproep en -terugkeer • Onderbrekingen • Instructiecodering • Compilers, linkers, en laders • Codeoptimalisatie