;Implementacija QuickSort-a. AsmStart ;Umetnuti Assembler pocinje ovako, a zavrsava sa "AsmEnd". ispisPoruka=1 ;Ovako se rade pretprocesorski definesovi u FlatAssembleru. debug=0 macro staviIntNaSistemskiStog x ;Da, ima on mocan pretprocesor. { sub esp,4 fld dword [x] fistp dword [esp] } macro staviPokazivacNaSistemskiStog x { sub esp,4 lea ebx,[x] mov [esp],ebx } macro staviStringNaSistemskiStog x { sub esp,4 mov dword [esp],x } format PE console ; 'PE' je 32-bitna '.EXE' datoteka za Windows. 'PE64' je 64-bitna '.EXE' za Windows. 'MZ' je '.EXE' za DOS. 'ELF' je izvrsna datoteka za 32-bitni Linux, a 'ELF64' za 64-bitni. entry start include 'win32a.inc' ; Naredbe za komunikaciju s DLL-ovima. section '.text' code executable start: if ispisPoruka=1 ; 'if' je ovdje assemblerska pretprocesorska naredba. 'If', s velikim 'i', je naredba grananja u AEC-u. jmp velicinaUnosa$ velicinaUnosa db "Unesite koliko cete brojeva unijeti.",10,0 velicinaUnosa$: staviStringNaSistemskiStog velicinaUnosa call [printf] end if staviPokazivacNaSistemskiStog n jmp znakZaFloat$ znakZaFloat db "%f",0 znakZaFloat$: staviStringNaSistemskiStog znakZaFloat call [scanf] if ispisPoruka=1 jmp pitajZaUnos$ pitajZaUnos db "Unesite te brojeve:",10,0 pitajZaUnos$: staviStringNaSistemskiStog pitajZaUnos call [printf] end if AsmEnd i:=0 brojac:=0 vrhStoga:=0 While i0 gornjaGranica:=stogSGornjimGranicama(vrhStoga) donjaGranica:=stogSDonjimGranicama(vrhStoga) vrhStoga:=vrhStoga-1 gdjeJePivot:=donjaGranica i:=donjaGranica+1 While idonjaGranica+1 vrhStoga:=vrhStoga+1 stogSDonjimGranicama(vrhStoga):=donjaGranica stogSGornjimGranicama(vrhStoga):=gdjeJePivot EndIf testZaPreljev:=brojac+najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac ;Potrebna je posebna varijabla za to jer FPU interno radi s 80-bitnim brojevima, a CPU s 32-bitnim. If not(testZaPreljev>brojac) najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac:=najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac*2 AsmStart if ispisPoruka=1 jmp izvjesceOpreljevu$ izvjesceOpreljevu db "Upozorenje: Brojac mozda nece sadrzavati tocan rezultat, dogodio se preljev na %d. iteraciji." db " Najveca ocekivana pogreska za ovaj preljev je %d krivo prebrojanih izvrsavanja unutarnje petlje.",10,0 izvjesceOpreljevu$: fld dword [n] fld dword [najmanjiCijeliBrojKojiSeMozeDodatiNaBrojac] fsubp fabs fistp dword [esp+4] fld dword [brojac] fistp dword [esp] invoke printf,izvjesceOpreljevu end if AsmEnd EndIf EndWhile AsmStart call [clock] sub eax,[procesorskoVrijeme] mov [procesorskoVrijeme],eax if ispisPoruka=1 jmp sortiraniNizJe$ sortiraniNizJe db "Sortirani niz je:",10,0 sortiraniNizJe$: staviStringNaSistemskiStog sortiraniNizJe call [printf] end if AsmEnd i:=0 While i