; Fibonacci-Zahlen
; x86 Maschinensprache (mit Kommentar)
; Wolfgang.Urban@schule.at
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Algorithmus 1 binär:
die Punkte werden beim Laden des Programms durch die Startadresse
dieses Unterprogramms ersetzt (Relokation)
Das folgende Bitmuster findet also der Prozessor im Speicher vor.
Dank seiner Erzeugerfirma, weiß er, was er bei jedem dieser Bitmuster
zu tun hat.
01010110 10001011 01110100 00100100 00001000 10000011 11111110 00000010
01111111 00000111 10111000 00000001 00000000 00000000 00000000 01011110
11000011 10001101 01000110 11111110 01010111 01010000 11101000 ........
........ ........ ........ 01001110 10001011 11111000 01010110 11101000
........ ........ ........ ........ 10000011 11000100 00001000 00000011
11000111 01011111 01011110 11000011
Algorithmus 3 binär:
10011011 11011001 11101110 10011011 11011001 11101000 10001011 11001000
10011011 11011001 11000000 10011011 11011000 11000010 10011011 11011101
11000010 11100010 11110101 10011011 11011101 11011000 11001011
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
alternativ hexadezimal:
Algorithmus 1 (nichtrelozierte Adresse in Klammern)
56 8b 74 24 08 83 fe 02 7f 07 b8 01 00 00 00 5e
c3 8d 46 fe 57 50 e8<00 00 00 00>4e 8b f8 56 e8
<00 00 00 00>83 c4 08 03 c7 5f 5e c3
Algorithmus 3
9B D9 EE 9B D9 E8 8B C8 9B D9 C0 9B D8 C2 9B DD
C2 E2 F5 9B DD D8 CB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
und letztlich die Ausgabe des Assemblers durch den Quelltext kommentiert.
Format: (nichtrel.) Adresse____OpCodes____Assemblertext
--------------
Algorithmus 1:
--------------
fib1 PROC NEAR
00000 56 push ESI
00001 8b 74 24 08 mov ESI, DWORD PTR 8[ESP]
00005 83 fe 02 cmp ESI, 2
00008 7f 07 jg mehr
0000a b8 01 00 00 00 mov EAX,1
0000f 5e pop ESI
00010 c3 ret 0
mehr:
00011 8d 46 fe lea EAX,DWORD PTR [ESI-2]
00014 57 push EDI
00015 50 push EAX
00016 e8 00 00 00 00 call fib1
0001b 4e dec ESI
0001c 8b f8 mov EDI,EAX
0001e 56 push ESI
0001f e8 00 00 00 00 call fib1
00024 83 c4 08 add ESP,8
00027 03 c7 add EAX,EDI
00029 5f pop EDI
0002a 5e pop ESI
0002b c3 ret 0
fib1 ENDP
--------------
Algorithmus 3:
--------------
0000 Fibo3 PROC FAR
0000 9B D9 EE FLDZ
0003 9B D9 E8 FLD1
0006 8B C8 mov CX,AX
0008 goon:
0008 9B D9 C0 FLD ST(0)
000B 9B D8 C2 FADD ST,ST(2)
000E 9B DD C2 FFREE ST(2)
0011 E2 F5 loop goon
0013 9B DD D8 FSTP ST(0)
0016 CB ret 0
0017 Fibo3 ENDP
0017 CODE ENDS
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Fußnote1: falls man die Bytefolge des Algorithmus 1 wirklich
im Speicher suchen möchte:
Angenommen, die Startadresse der Routine ist Hexadezimal
abcd1234.
Ein Intel-Prozessor legt diese Adresse in 4 Bytes ab, die
von niedrig- zu höchstwertig gehen. In diesem Fall also
34 12 cd ab
(Motorola-Prozessoren erwarten die Daten in üblicher Form!)
Fußnote2: so, wie Intel-Prozessoren irgenwie 'verkehrt rum'
arbeiten, muss man auch den Assembler lesen.
MOV AX,abcdh
speichert den Hex-Wert abcd nach AX
(Motorola ist wieder freundlich:
Move $abcd,D7
speichert den Hexwert abcd ins siebte Datenregister
Fußnote3: die Intel-FPU ist als Stack mit 8 Registern
ausfgelegt. ST(2) im Listing bedeutet also den dritten
Wert von oben (0-1-2)