Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Autor: Robert Warwas
- ;nasm
- [bits 32]
- extern _printf
- extern _scanf
- extern _puts
- extern _exit
- segment .data
- formatI: db "%i", 0
- formatD: db "%d",0xa, 0
- formatNL: db 0xa, 0
- formatHello: db "Hello", 0
- segment .text
- start:
- mov ebp,esp
- ; rezerwujemy pamięć na 3 elementy
- sub esp, 40
- lea eax, [ebp - 40] ;liczymy adres pierwszego elementu tablicy
- push eax ;wrzucamy adres poczatku tablicy 2 razy ponieważ jeden adres będzie słu ;żył do indeksowania elementów a jeden do przywrócenia indeksu na początek tablicy
- push eax
- ;[ptr A][ptr A][A][B][C][...][EBP]
- mov ecx, 10
- ;;;;;;;;;;;;wczytujemy dane do 3 elementów tablicy;;;;;;;;;;;;;;;
- wczytaj:
- push ecx
- mov eax, [ebp - 44] ; w elemencie A powinna się znalezc wartosc 4
- push eax
- push formatI
- call _scanf
- add esp, 8
- pop ecx
- add [ebp - 44], dword 4
- loop wczytaj
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;cofamy na początek indeks tablicy
- mov eax, [ebp - 48]
- mov [ebp - 44], eax
- push dword 10
- push dword [ebp - 44]
- call sort
- add esp , 8
- push formatNL
- call _puts
- add esp,4
- mov ecx, 10
- ;;;;;;;;wypisuje elementy tablicy;;;;;;;;;;;;;
- wypisz:
- push ecx
- mov eax, [ebp - 44]
- push dword [eax]
- push formatD
- call _printf
- add esp, 8
- pop ecx
- add [ebp - 44], dword 4
- loop wypisz
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- push formatI
- call _scanf
- add esp, 4
- push dword 0
- call _exit
- ; void sort(int * tab, int n) 1-->adres tablicy 2-->liczba elementów
- sort:
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- push ebp
- mov ebp, esp
- sub esp, 4 ;rezeruwjemy miejsce dla wskaźnika indeksującego --> [ebp - 4]
- sub esp, 8; rezerujwmy miejsce dla 2 elementow ktore beda porownywane
- ; pierwszy element porownywany -->[ebp - 12]
- ; drugi element porownywany --> [ebp - 8]
- sub esp ,4 ; zmienna okreslajaca czy w danym obiegu petli wystapila jakas zamiana ele ;tow --> [ebp - 16]
- ; inicjalizujemy indekser tablicy adresem jej początku
- mov eax, [ebp + 8]
- mov [ebp - 4], eax
- ;[ebp + 8] --> adres poczatku tablicy
- ;[ebp + 12] --> liczba elementow
- ; petla iterująca po wszystkich elementach wykona się n-1
- ; gdyz jesli iterowala by przez wszystkie indeksy tablicy
- ; odbylo by sie porownanie ze old_ebp
- petla_spr:
- mov eax, [ebp + 12]
- sub eax, 1
- mov ecx, eax
- mov [ebp - 16], dword 0
- petla_n_element:
- ;;;;;;;;inicjalizujemy pierwszy element porownywany wartościa wskaźnika indeksu;;
- mov eax, [ebp - 4]
- mov ebx, [eax]
- mov [ebp - 12], ebx
- ;;;;;;;;inicjalizujemy drugi element porownywany wartościa wskaźnika indeksu;;
- mov eax, [ebp - 4 ]
- add eax, 4
- mov ebx, [eax]
- mov [ebp - 8], ebx
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;teraz musimy porownac [ebp - 12] > [ebp - 8]
- mov eax, [ebp - 12]
- cmp eax, dword [ebp - 8]
- jg swap
- jmp skip_swap
- swap:
- mov [ebp - 16], dword 1
- ;teraz kopiujemy 2 element do pierwszego
- mov eax, [ebp - 8]
- mov ebx, [ebp - 4]
- mov [ebx], eax
- ;teraz kopiujemy 1 element do drugiego
- mov eax, [ebp - 4]
- add eax, 4
- mov ebx, [ebp - 12]
- mov [eax], ebx
- skip_swap:
- add [ebp - 4], dword 4 ;skaczemy na następny element
- loop petla_n_element
- mov eax, [ebp + 8]
- mov [ebp - 4], eax
- mov eax, [ebp -16]
- cmp eax, 0
- loopnz petla_spr
- leave
- ret
- ;int mediana(int *tab, int n) zwraca mediane podanej tablicy w eax
- mediana:
- push ebp
- mov ebp, esp
- lea eax, [ebp + 8]
- push eax
- ;[ebp - 4] -->indekser tablicy
- mov eax, [ebp + 12]
- mov ebx, 2
- div ebx
- cmp edi,0
- jz parzysta;jeśli parzysta
- jmp nieparzysta
- parzysta:
- mov ecx, eax
- mov eax, [ebp - 4]
- sub eax, 4
- add eax, ecx
- ;[eax] -->adres elementu najbardziej z lewej potrzebnego do wyliczenia
- ;mediany
- mov ebx, eax
- add ebx,4
- ;[ebx] -->adres elementu najbardziej z prawej potrzebnego do wyliczenia
- ;mediany
- ;push eax
- ;push ebx
- mov eax, [eax]
- mov ebx, [ebx]
- sub ebx, eax ;liczymy różnice tyche elementow
- push eax
- ;push eax
- mov eax, ebx
- mov esi,2
- div esi
- pop ebx ; [ebx] --> wartość elelemtnu najbardzierj z lewej
- ;add ebx, dq eax
- mov eax, ebx ;kopiujemy do rejestru wynikowego
- jmp skip_nieparzysta
- nieparzysta:
- skip_nieparzysta:
- leave
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement