FAKULTÄT FÜR INFORMATIK
Transcrição
FAKULTÄT FÜR INFORMATIK
FAKULTÄT FÜR INFORMATIK TECHNISCHE UNIVERSITÄT MÜNCHEN Lehrstuhl für Rechnertechnik und Rechnerorganisation Dr. rer. nat. Georg Acher Einführung in die Technische Informatik (ETI) Wintersemester 2008/2009 Tutorübung 6 1.-5.12.2008 1a) mov ebx,eax shr ebx,3 and ebx,0xf 1b) push eax and eax,0x7 shl eax,5 and ebx,0xffffff1f or ebx,eax pop eax 1c) and eax,0x7800 cmp eax,0x4800 je irgendwohin 1d) sar eax,4 1e) and eax,63 1f) mov mov shl not and cl,bl ebx,1 ebx,cl ebx eax,ebx 2a) Bytes pro Zeile: 1024/8=128 Basis: [display start] Speicheradresse = Basis + 128*y + x/8 Bitnummer = 7 - (x modulo 8) = 7 - (x AND 7) = (NOT x) AND 7 1 (Wer die Umformung nicht glaubt sollte es mal mit ein paar Beispielen machen und/oder sich anhand der Definition des Zweierkomplements überlegen) 2b) set_pixel: cmp eax,0 jl out_of_display cmp eax,1024 jge out_of_display ; Könnte man auch mit einem JAE ; (unsigned) machen (war nicht dran) cmp ebx,0 jl out_of_display cmp ebx,768 jge out_of_display mov ecx,eax not ecx and ecx,7 shr shl add add eax,3 ebx,7 eax,ebx eax,[display_start] mov bl,1 shl bl,cl or [eax],bl ; ecx: bitnummer ; eax=x/(2^3)=x/8 ; ebx=y*(2^7)=y*128 ; eax jetzt: Byteadresse ; Bitmaske mit 2^bitnummer erzeugen ; Dynamisch geht nur cl! ; Maske über Byte "odern" out_of_display: ret 3) (Klausuraufgabe WS05) Mustersuche FIND_MARKER: cmp edx,3 jl not_found cmp byte [esi],0 jne next_one cmp byte [esi+1],0 jne next_one cmp byte [esi+2],1 jne next_one mov eax,esi ret next_one: inc esi dec edx jmp FIND_MARKER not_found: mov eax,-1 ret 4a) mov ebx,[ebx+12] 4b) FIND: 2 cmp ebx,0 je not_found cmp [ebx],ecx je found jl linker_baum mov ebx,[ebx+12] jmp FIND linker_baum: mov ebx,[ebx+8] jmp FIND not_found: mov eax,0 ret found: mov eax,[ebx+4] ret 5) (Klausuraufgabe WS05) Bitspielerei ror shr shl rol ret eax,cl eax,1 eax,1 eax,cl 6) (Klausuraufgabe WS 96) Skalarprodukt SMUL: push ebx push ecx mov edx,0 cmp ecx,0 jeq leer loop_start: mov esi,[eax] imul esi,[ebx] add edx,esi add eax,4 add ebx,4 dec ecx jne loop_start leer: mov eax,edx pop ecx pop ebx ret 7a) push_value: mov [esi],eax sub esi,4 ret 7b) 3 pop_value: add esi,4 mov eax,[esi] ret 7c) add_values: call pop_value mov ebx,eax call pop_value add eax,ebx call push_value ret 7d) atoi: push ebx mov eax,0 atoi_loop: cmp byte [edi],48 jl atoi_ende cmp byte [edi],57 jg atoi_ende mov ebx,0 mov bl,[edi] inc edi sub ebx,48 imul eax,10 add eax,ebx jmp atoi_loop atoi_ende: pop ebx ret 7e) parse: cmp byte [edi],46 ; Ende der Eingabe? je end_parse ; Ja cmp byte [edi],32 ; Leerzeichen? je next_char ; Ja cmp byte [edi],43 ; Additionszeichen? jne number ; jetzt kann es nur noch eine Ziffer sein call add_values next_char: inc edi jmp parse ; Werte addieren ; Ein Zeichen weiterschalten ; Nächstes Zeichen lesen no_add: call atoi call push_value jmp parse end_parse: ; Ziffern in Zahl umwandeln ; Auf den Stack geben 4