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