; 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)