ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium

Transkrypt

ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium
ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium – składnia Intel/Borland)
Spis programów
1. Obliczenie warto ci bezwzgldnej 64-bitowej liczby całkowitej spod adresu ZMIENNA (dwie wersje). ...................... 2
2. (2A) Obliczanie NWP 32-b liczb naturalnych ZA i ZB wg wzoru Euklidesa (NWP(a,b)=NWP(b, a mod b))............ 2
3. Szacowanie √ z 64-b liczby naturalnej spod adresu ZMIENNA wg.zaleno ci 1+3+5+…+(2n–1) = n2 .................... 2
4. Obliczenie wariacji V(n,k)=n!/(n–k)! (silnia , gdy k=1), n – w ecx, k – w esi, V(n,k) w eax ........................................ 2
5. Obliczenie kombinacji C(n,k) = n!/[k!(n–k)!], : n – liczba z rejestru ecx, k – liczba z rejestru esi, wynik w eax
algorytm: C(n,k) = {[...{[(n*(n–1)/2]*(n–2)/3}*(n–3)/4 .... ]*(n–k+1)/(k–1)}*(n–k+1)/k ......................................... 3
6. Wyszukiwanie najwikszej całkowitej z liczb 64-bitowych umieszczonych w tablicy LICZBY (big endian): ........... 3
7. Obliczenie N-tej liczby Fibonacciego........................................................................................................................... 3
8. Szyfr Cezara: tekst w buforze TEKST, ostatni znak NULL (kod 0), klucz w cl, szyfrogram w buforze CEZAR ............... 4
9. Obliczenie warto ci liczby wprowadzanej jako sekwencja cyfr ASCII (z bufora LICZBA)........................................... 4
10. Mnoenie 64-b liczb naturalnych (opcja: całkowitych w U2) danych pod adresami MNONA i MNONIK.......... 4
11. Generowanie liczb pierwszych <232 wg.algorytmu „sito Eratostenesa” (usuwanie z listy wielokrotno ci liczby p). . 5
12. Mnoenie 64-b liczb naturalnych (opcja: całkowitych w U2) danych pod adresami MNONA i MNONIK.......... 5
IA-32 – główne rónice składni asemblera Intel / Borland [MS DOS / Windows] oraz AT&T [UNIX / Linux]
(UWAGA: jeden operand musi by rejestrem, chyba e src jest stał)
IA-32
Intel/Borland [Windows]
AT&T [UNIX / Linux]
lista argumentów w zapisie działania "op"
dst:= dst (op) src
op dst, src
opl src, dst
opb src(b), dst(b)
nazwa rejestru
(32b) eax, ebx, …
(16b) ax, bx, …
( 8b) al, ah, bl, bh
(32b) %eax, %ebx, …
(16b) ––– (brak)
( 8b) %al, %ah, %bl, %bh,…
stałe: dziesitne
szesnastkowe
binarne
symboliczne (CONST, STALA, )
1654, –27531, 1011d
1234h, 0ABCh, 101h
0100b, 101111b
SCONST, STALA
1654, –27531, 1011, 0d–1012
0x1234, 0xABC, 0x101, 0x–ABC
0b0100, 0b101111
$CONST, $STALA
atrybuty zmiennej:
seg ZMIENNA
offset ZMIENNA
(brak, model liniowy pamici)
$ZMIENNA
ZMIENNA
ZMIENNA
warto
nr segmentu
offset (adres)
warto typ (jedn. liczba bajtów)
rozmiar
elementu zmiennej ideksowanej
spod wskazanego adresu
(zapis trybu adresowania)
programiki.doc
(w deklaracji: DB, DW, DD,…) (w deklaracji: .byte, .long, .ascii)
size ZMIENNA
(SIZE_ZM =. – ZMIENNA)
(w jednostkach rozmiaru)
(w bajtach, . – wskanik lokacji,
wyraenie musi by tu po deklaracji
ZMIENNA[ebx,
edx*4]
[ebx, edx*4]
[edx*4],
ZMIENNA[edx*4]
[ebx],
ZMIENNA[ebx],
ZMIENNA+5
13 czerwca 2009
ZMIENNA(%ebx,%edi,4)
(%ebx,%edi,4)
(,%edi,4),
ZMIENNA(,%edi,4)
(%edi),
ZMIENNA
ZMIENNA+5
©Janusz Biernat
ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium – składnia Intel/Borland)
1. Obliczenie warto ci bezwzgldnej 64-bitowej liczby całkowitej spod adresu ZMIENNA (dwie wersje).
(etykieta)
rozkaz
komentarz
(copy:)
mov eax, ZMIENNA
mov ABS-ZM, eax
mov eax, ZMIENNA+4
mov ABS-ZM+4, eax
or eax, eax
jns wynik
xor eax, eax
sub eax, ABS-ZM
mov ABS-ZM, eax
mov eax, 0
sbb eax, ABS-ZM +4
mov ABS-ZM+4, eax
not ABS-ZM
not ABS-ZM +4
mov eax, 1
add ABS-ZM, eax
adc ABS-ZM+4, eax
(into)
; przekopiowanie, je li wynik ma by w innej zmiennej
a)
albo
b)
wynik:
; poniej dwa warianty algorytmu
; czy ZMIENNA jest dodatnia?
; zero (przygotowanie działania 0 – ZMIENNA)
; odejmowanie i zapis ABS-ZM = 0 – ZMIENNA
; wynik w ABS-ZM
; negowanie niszych bitów
; negowanie wyszych bitów
;
; dodanie “1”
; wynik w ABS-ZM
; niewykonalne je li ZMIENNA = 8000 0000 0000 0000
2. (2A) Obliczanie NWP 32-b liczb naturalnych ZA i ZB wg wzoru Euklidesa (NWP(a,b)=NWP(b, a mod b)).
(etykieta)
licz:
rozkaz
komentarz
mov ebx, ZB
mov eax, ZA
mov edx, 0
div ebx
xchg ebx, eax
xchg ebx, edx
and ebx, ebx
jnz licz
; ecx:ebx= mniejsza =ZBB (je li nie, bd przestawione)
; edx:eax= wiksza =ZAA
; dzielna (a) w eax, dzielnik (b) w ebx
; reszta (a mod b) w edx, zbdny iloraz w eax
; teraz dzielnik (b) bdzie dzieln w eax
; reszta (a mod b) bdzie dzielnikiem w ebx, … zbdny iloraz w edx
; czy reszta=0, je li tak, to NWP jest w eax, reszta jest teraz w ebx
; licz dopóki reszta ≠0, je li =0, to wynik: NWP(a,b) jest w eax
3. Szacowanie √ z 64-b liczby naturalnej spod adresu ZMIENNA wg.zaleno ci 1+3+5+…+(2n–1) = n2
(etykieta)
cykl:
9
rozkaz
komentarz
mov eax, –1
mov edx, –1
mov ecx, –1
add eax, 2
adc edx, 0
inc ecx
sub ZMIENNA, eax
sbb ZMIENNA+4, edx
jge cykl
(...(((ZMIENNA–1)|[?<0] –3) |[?<0] –5)|[?<0] –...) – (2ND–1)|[!<0]
; ND = (edx:eax=) –1 – kolejna nieparzysta
; SQRT = –1 (ZMIENNA<264→ SQRT<232)
; ND = ND+2 (nastpna nieparzysta)
; SQRT = SQRT+1 (liczba składników sumy nieparzystych)
; wynik SQRT (ZMIENNA) w ecx, korekta zbdna
4. Obliczenie wariacji V(n,k)=n!/(n–k)! (silnia , gdy k=1), n – w ecx, k – w esi, V(n,k) w eax
(etykieta)
licz:
(check:)
rozkaz
komentarz
mov eax, ecx
and eax, eax
jz end
sub esi, ecx
neg esi
mov eax, 1
mul ecx
dec ecx
cmp ecx, esi
jgt licz
and edx, edx
jnz error
; n w ecx, k w esi, kopia ecx do eax
;
; sprawdzenie, czy n=0, wtedy V(0,k) = df 0
; (k–n) do esi
; n–k w esi [–(k–n)]
; pocztkowy iloczyn (i=n)
; mnoenie przez biecy czynnik i
; kolejny czynnik (i–1)
; czy ostatni mnonik
; je li i>n–k licz dalej, je li i=n–k zako cz liczenie
; sprawd, czy iloczyn jest 32-b (w eax – edx:eax = 0:eax)
; przekroczony zakres, wynik >232
;
end:
programiki.doc
13 czerwca 2009
©Janusz Biernat
ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium – składnia Intel/Borland)
5. Obliczenie kombinacji C(n,k) = n!/[k!(n–k)!], : n – liczba z rejestru ecx, k – liczba z rejestru esi, wynik w eax
algorytm: C(n,k) = {[...{[(n*(n–1)/2]*(n–2)/3}*(n–3)/4 .... ]*(n–k+1)/(k–1)}*(n–k+1)/k
(etykieta)
rozkaz
komentarz
(prep:)
mov ebx, esi
add ebx, ebx
sub ebx, ecx
jle hop
sub esi, ebx
mov eax, 0
jlt end
mov eax, 1
and esi, esi
jz end
mov edx, 0
mov ebx, 1
mov eax, ecx
dec ecx
mul ecx
inc ebx
div ebx
and edx, edx
jnz error
cmp ebx, esi
jlt comb
; argument k do ebx
; oblicz 2k
; oblicz 2k–n
; je li k≤n/2 przeskocz
; zastp k przez k–(2k–n) = n–k
; C(n,k) = 0 gdy k>n
; koniec gdy k>n
; C(n,k) = 1 gdy k=0 lub n–k=0
hop:
comb:
(check:)
end:
; n jest w ecx, k lub n–k jest w esi
;
; n do eax
; kolejny czynnik (n–i) iloczynu
;
; kolejny dzielnik i+1
; C(n,i+1) = C(n,i)*(n–i))/(i+1)
; sprawd, czy iloczyn jest w eax (edx:eax = 0:eax)
; przekroczony zakres, wynik >232
; je li i+1<k, kontynuuj
; wynik w eax
6. Wyszukiwanie najwikszej całkowitej z liczb 64-bitowych umieszczonych w tablicy LICZBY (big endian):
(etykieta)
pocz:
dalej:
cykl:
rozkaz
komentarz
mov edx, [LICZBY]
mov eax, [LICZBY+4]
mov esi, 2
mov ecx, ILE–1
jcxz koniec
inc esi
mov ebx, [LICZBY+4*esi]
mov ebp, [LICZBY+4+4*esi]
cmp edx,ebx
jgt cykl
jne dalej
cmp eax,ebp
jge cykl
mov edx, ebx
mov eax, ebp
inc esi
loop pocz
; edx = max-liczbaH
; eax = max-liczbaL
; ebx = kolejnaH
; ecx = kolejnaL
; powtórz gdy max-liczba > kolejna
; czy kolejna jest wieksza?
; kolejna nie wiksza od max-liczby
; kolejna jest wieksza od max-liczby, wic przestaw
;
; powtórz je li nie przeszukano całego zbioru, max w edx:eax
7. Obliczenie N-tej liczby Fibonacciego
(etykieta)
fibonac:
rozkaz
komentarz
mov ecx, N
mov eax, 0
mov ebx, 1
cmp ebx, N
je out
add eax, ebx
xchg ebx, eax
loop fibonac
; N – liczba naturalna (>0)
; warto pocztkowa F(0)=0
; F(1)=1
; czy N=1
out:
programiki.doc
; akumulacja: F(i–1) w eax, F(i) w ebx, F(i+1) do eax
; zamie F(i+1) z F(i)
; zmniejsz licznik i sprawd, czy ostatnia
; F(N) w ebx za F(N–1) w eax
13 czerwca 2009
©Janusz Biernat
ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium – składnia Intel/Borland)
8. Szyfr Cezara: tekst w buforze TEKST, ostatni znak NULL (kod 0), klucz w cl, szyfrogram w buforze CEZAR
(etykieta)
pocz:
omijaj:
end:
rozkaz
komentarz
mov esi, offset TEKST
mov edi, offset CEZAR
mov al, [esi]
inc esi
cmp al, 0
jeq end
or al, 20h
cmp al, ‘ ’
jeq pocz
add al, cl
cmp al, ‘z’
jle omijaj
sub al, 1Ah
mov [edi], al
inc edi
jmp pocz
mov [edi], al
; usuwanie spacji (0x20 = ‘ ‘ = SP)
;
;
;
;
;
; wszystkie cyfry małe (maska 0010 0000)
; usuwanie spacji
;
;
;
;
; (1Ah=26 liter w alfabecie)
;
;
;
; znak ko ca (NULL) do bufora szyfrogramu
9. Obliczenie warto ci liczby wprowadzanej jako sekwencja cyfr ASCII (z bufora LICZBA)
(etykieta)
pocz:
rozkaz
komentarz
mov ebx, 10
mov eax, 0
mov esi, 0
mov cl, LICZBA [esi]
and ecx, 0Fh
add eax, ecx
mul ebx
inc esi
cmp esi, SIZE
jlt pocz
; max 9 cyfr, SIZE – rozmiar liczby, max. 9 cyfr
;
;
;
;
;
;
;
;
;
10. Mnoenie 64-b liczb naturalnych (opcja: całkowitych w U2) danych pod adresami MNONA i MNONIK.
(etykieta)
23
rozkaz
mov eax, MNO NA
mul MNO NIK
mov ILOCZYN, eax
mov ebx, edx
mov eax, MNO NA+4
mul MNO NIK
add ebx, eax
adc edx, 0
mov ecx, edx
mov eax, MNO NA
mul MNO NIK+4
add ebx, eax
adc ecx, edx
mov ILOCZYN+4, ebx
mov ebx, 0
adc ebx, 0
mov eax, MNO NA+4
mul MNO NIK+4
add eax, ecx
adc adx, ebx
mov ILOCZYN+8, eax
mov ILOCZYN+12, edx
programiki.doc
komentarz
; całkowite: A⋅M=(A+–263)⋅(M+–263)= A+⋅M+ – 263 (A++M+) –2126
; A⋅M = AL⋅ML+232(AH⋅ML+AL⋅MH)+ 264(AH⋅MH)
; edx:eax =(AL⋅ML)H:(AL⋅ML)L
; ILOCZYNLL = eax = (AL⋅ML)L (gotowe (A⋅M)LL)
; ebx: = (AL⋅ML)H (do dalszego przetwarzania)
; edx:eax =(AH⋅ML)H:(AH⋅ML)L
; ebx: = [(AL⋅ML)H+(AH⋅ML)L] mod 232
; (bez przekroczenia zakresu, bo iloczyn ≤(232–1)2=264–233+1)
; ecx = skorygowany (AH⋅ML)H
; edx:eax =(AL⋅MH)H:(AL⋅MH)L
; ebx: = [[(AL⋅ML)H+(AH⋅ML)L] mod 232 +(AL⋅MH)L] mod 232
; ecx = [skorygowany (AH⋅ML)H + (AL⋅MH)H+ CY] mod 232
; ILOCZYNLH=ebx=(AL⋅ML)H+(AH⋅ML)L+(AL⋅MH)L (gotowe (A⋅M)LH)
; przeniesienie na ILOCZYNHL
; edx:eax =(Ah⋅MH)H:(AH⋅MH)L
; ILOCZYNHL
; ILOCZYNHH
13 czerwca 2009
©Janusz Biernat
ARCHITEKTURA KOMPUTERÓW – proste algorytmy (x86/Pentium – składnia Intel/Borland)
11. Generowanie liczb pierwszych <232 wg.algorytmu „sito Eratostenesa” (usuwanie z listy wielokrotno ci liczby p).
(etykieta)
pocz:
pet:
hop:
cykl:
25
rozkaz
komentarz
cld
mov eax, –1
mov edi, offset ERAT
mov ecx, HK
rep stosd
mov esi, 0
mov edx, 1
mov ebx, edx
add ebx, ebx
add ebx, 1
cmp edx, SQK
jgt hop
mov eax, edx
add eax, ebx
mov [ERAT +4*eax], 0
cmp eax, HK
jlt pet
inc esi
mov [ERAT +4*esi], ebx
inc edx
cmp [ERAT +4*edx], 0
jz cykl
cmp edx, HK
jlt pocz:
mov ERAT, 2
; k–zakres, HK=k/2, SQK=sqrt(k), ERAT– tablica
; edx – indeks wyszukiwania, eax – indeks biecy, esi – nr liczby
; wypełnienie tablicy ERAT stał „–1” (stała moe by dowolna)
; esi – indeks liczby pierwszej
; edx – indeks biecy
; ebx = 2*edx+1
; indeksy komórek z wielokrotno ciami l.p.
; zerowanie
; kolejna liczba pierwsza do kolejnej komórki ERAT (lub innej tab)
12. Mnoenie 64-b liczb naturalnych (opcja: całkowitych w U2) danych pod adresami MNONA i MNONIK.
(etykieta)
23
rozkaz
mov eax, MNO NA
mul MNO NIK
mov ILOCZYN, eax
mov ebx, edx
mov eax, MNO NA+4
mul MNO NIK
add ebx, eax
adc edx, 0
mov ecx, edx
mov eax, MNO NA
mul MNO NIK+4
add ebx, eax
adc ecx, edx
mov ILOCZYN+4, ebx
mov ebx, 0
adc ebx, 0
mov eax, MNO NA+4
mul MNO NIK+4
add eax, ecx
adc adx, ebx
mov ILOCZYN+8, eax
mov ILOCZYN+12, edx
programiki.doc
komentarz
; całkowite: A⋅M=(A+–263)⋅(M+–263)= A+⋅M+ – 263 (A++M+) –2126
; A⋅M = AL⋅ML+232(AH⋅ML+AL⋅MH)+ 264(AH⋅MH)
; edx:eax =(AL⋅ML)H:(AL⋅ML)L
; ILOCZYNLL = eax = (AL⋅ML)L (gotowe (A⋅M)LL)
; ebx: = (AL⋅ML)H (do dalszego przetwarzania)
; edx:eax =(AH⋅ML)H:(AH⋅ML)L
; ebx: = [(AL⋅ML)H+(AH⋅ML)L] mod 232
; (bez przekroczenia zakresu, bo iloczyn ≤(232–1)2=264–233+1)
; ecx = skorygowany (AH⋅ML)H
; edx:eax =(AL⋅MH)H:(AL⋅MH)L
; ebx: = [[(AL⋅ML)H+(AH⋅ML)L] mod 232 +(AL⋅MH)L] mod 232
; ecx = [skorygowany (AH⋅ML)H + (AL⋅MH)H+ CY] mod 232
; ILOCZYNLH=ebx=(AL⋅ML)H+(AH⋅ML)L+(AL⋅MH)L (gotowe (A⋅M)LH)
; przeniesienie na ILOCZYNHL
; edx:eax =(Ah⋅MH)H:(AH⋅MH)L
; ILOCZYNHL
; ILOCZYNHH
13 czerwca 2009
©Janusz Biernat