View
5
Download
0
Category
Preview:
Citation preview
Podstawowe algorytmy w asemblerze
Szymon Jagieła
Bartłomiej Rupik
Plan prezentacji
1. Wstęp
2. Proste algorytmy
1. Dane i tablice
2. Instrukcja if
3. Instrukcja while
3. Zaawansowane algorytmy
1. Linked-list
2. Algorytmy sortowania
4. Podsumowanie
Wstęp
Głównym celem prezentacji jest przedstawienie
algorytmów, które mogę przyspieszyć działanie programu.
Zostaną porównane rozwiązania z C przedstawione w
kodzie assemblerowym, takie jak pętle, instrukcje
warunkowe oraz bardziej zaawansowane algorytmy, jak
lista oraz różne rodzaje sortowania
Deklaracja
zmiennych
b – typ 8 bitowej zmiennej
w – typ 16 bitowej
zmiennej
Przykład 1:
C:
int x;
char y, z[100];
Asm (NASM):
x dw 1 dup (?)
y db 1 dup (?)
z db 100 dup (?)
Operowanie na
tablicach
Offset x – zwraca
przesunięcie danej, której
nazwę podamy w nawiasach
Przykład 2 :
C:
y = x[i];
Asm:
mov bx,offset x
add bx,i
mov ax,[bx]
mov y,ax
Instrukcje
warunkowe
cop – wszelkie operacje
warunkowe
s1,s2 – dowolny kod do
wykonania w instrukcji
warunkowej
Przykład 3 :
C:
if(a cop b) {
//s1…
} else {
//s2…
}
Asm:
mov ax,a
cmp ax,b
cop l1
s1…
jmp l2
l1:
s2…
l2:
Tabela operacji warunkowych dostępnych w
asemblerze
Mnemonik Znaczenie Warunek skoku
JC / JNC Jump if Carry / if Not Carry CF=1 / CF=0
JZ / JNZ Jumf if Zero / if Not Zero ZF=1 / ZF=0
JG Jump if Greater (A>B) ZF=0 oraz SF=OF
JE Jump if Equal (A=B) ZF=1
JGE Jump if Greater or Equal (A>=B) SF=OF
JL Jump if Less (A<B) SF<>OF
JLE Jump if Less or Equal (A<=B) ZF=1 lub SF<>OF
JA Jump if Above CF=0 oraz ZF=0
JAE Jump if Above or Equal CF=0
JB Jump if Below CF=1
JBE Jump if Below or Equal CF=1 lub ZF=1
Pętla while
cop – wszelkie operacje
warunkowe
s1 – dowolny kod do
wykonania w pętli
Przykład 4 :
C:
while(a cop b) { //s1… Asm:
l1: mov ax,a cmp ax,b cop l2 s1…
jmp l1 l2:
Algorytmy sortowania
Insertion Sort – sortowanie przez wstawienie
Quick Sort
Insertion Sort + & -
Najprostszy algorytm sortowania
Złożoność czasowa n^2
Wydajny dla wstępnie posortowanych
Wydajny dla niewielkich zbiorów
Stabilny
Pseudokod
0. Insert_sort(A, n)
1. for i=2 to n :
2. klucz = A[i]
3. j = i - 1
4. while j>0 and A[j]>klucz:
5. A[j + 1] = A[j]
6. j = j - 1
7. A[j+1] = klucz
Insertion Sort
DEMO TIME
Insertion Sort
Quick Sort
Popularny algorytm sortowania działający na zasadzie
dziel i zwyciężaj
Złożoność obliczeniowa n logn
Quick Sort - pseudokod
Quick Sort – How To
DEMO TIME
Quick Sort
Porównanie algorytmów sortowania
Insertion Sort w asm Insertion Sort w C/C++
Czas wykonania 1.203s Czas wykonania 1.03s
Porównanie algorytmów sortowania
Quick Sort w asm Quick Sort w C/C++
Czas wykonania 0.015s Korzystamy z funkcji
qsort()
Czas wykonania: 0.047s
Std:sort() wykonywał się
ponad 0.109s
Porównanie algorytmów sortowania
Quick Sort, a Insert Sort dla tablicy składającej się z 20000 elementów (liczby typu int)
algorytm QuickSort jest znacznie szybszym rozwiązaniem.
Czas wykonania dla algorytmu przez wstawianie to ponad 1s!
Quick Sort tę samą tablicę sortuje w czasie 0.015s
Lista jednokierunkowa
Struktura danych służąca do reprezentacji zbiorów
dynamicznych.
Kolejne składniki struktury posiadają sekcję danych oraz
wskaźnik, przechowujący położenie początku kolejnej sekcji
danych w pamięci
Cecha charakterystyczna – bezpośredni dostęp posiadamy
tylko do pierwszego elementu
LAST DEMO TIME
Lista jednokierunkowa
Podsumowanie
W niniejszej przezentacji przedstawione zostały
podstawowe oraz popularne algorytmy
Dokonano ich porównania pomiędzy językami wysokiego
oraz językami poziomu maszynowego
W większości przypadków algorytmy napisane w
asemblerze wykonywały się działać szybciej niż ich
odpowiedniki w językach wyższego poziomu
Dziękujemy za uwagę
Recommended