Asembler - Sztuka Program Ow Ani A - Randall Hyde

986
  

Transcript of Asembler - Sztuka Program Ow Ani A - Randall Hyde

Spis treciRozdzia 1. Wstp do jzyka asemblerowego...................................................... 131.1. Wprowadzenie........................................................................................................ 13 1.2. Anatomia programu HLA....................................................................................... 13 1.3. Uruchamianie pierwszego programu HLA ............................................................. 16 1.4. Podstawowe deklaracje danych programu HLA..................................................... 17 1.5. Wartoci logiczne ................................................................................................... 19 1.6. Wartoci znakowe................................................................................................... 20 1.7. Rodzina procesorw 80x86 firmy Intel .................................................................. 21 1.7.1. Podsystem obsugi pamici........................................................................... 24 1.8. Podstawowe instrukcje maszynowe........................................................................ 26 1.9. Podstawowe struktury sterujce wykonaniem programu HLA............................... 30 1.9.1. Wyra enia logiczne w instrukcjach HLA ..................................................... 31 1.9.2. Instrukcje if..then..elseif..else..endif jzyka HLA ......................................... 33 1.9.3. Iloczyn, suma i negacja w wyra eniach logicznych...................................... 35 1.9.4. Instrukcja while ............................................................................................ 37 1.9.5. Instrukcja for................................................................................................. 38 1.9.6. Instrukcja repeat............................................................................................ 39 1.9.7. Instrukcje break oraz breakif......................................................................... 40 1.9.8. Instrukcja forever.......................................................................................... 40 1.9.9. Instrukcje try, exception oraz endtry............................................................. 41 1.10. Biblioteka standardowa jzyka HLA wprowadzenie ......................................... 44 1.10.1. Stae predefiniowane w module stdio ........................................................... 46 1.10.2. Standardowe wejcie i wyjcie programu ..................................................... 46 1.10.3. Procedura stdout.newln................................................................................. 47 1.10.4. Procedury stdout.putiN ................................................................................. 47 1.10.5. Procedury stdout.putiNSize .......................................................................... 48 1.10.6. Procedura stdout.put ..................................................................................... 49 1.10.7. Procedura stdin.getc...................................................................................... 51 1.10.8. Procedury stdin.getiN ................................................................................... 52 1.10.9. Procedury stdin.readLn i stdin.flushInput..................................................... 53 1.10.10. Procedura stdin.get ....................................................................................... 54 1.11. Jeszcze o ochronie wykonania kodu w bloku try..endtry........................................ 55 1.11.1. Zagnie d one bloki try..endtry ..................................................................... 56 1.11.2. Klauzula unprotected bloku try..endtry......................................................... 58 1.11.3. Klauzula anyexception bloku try..endtry ...................................................... 61 1.11.4. Instrukcja try..endtry i rejestry...................................................................... 61 1.12. Jzyk asemblerowy a jzyk HLA ........................................................................... 63 1.13. rda informacji dodatkowych.............................................................................. 64

4

Asembler. Sztuka programowania

Rozdzia 2. Reprezentacja danych ...................................................................... 652.1. Wprowadzenie........................................................................................................ 65 2.2. Systemy liczbowe ................................................................................................... 66 2.2.1. System dziesitny przypomnienie............................................................ 66 2.2.2. System dwjkowy......................................................................................... 66 2.2.3. Formaty liczb dwjkowych........................................................................... 68 2.3. System szesnastkowy.............................................................................................. 69 2.4. Organizacja danych ................................................................................................ 72 2.4.1. Bity ............................................................................................................... 72 2.4.2. Pbajty......................................................................................................... 73 2.4.3. Bajty ............................................................................................................. 73 2.4.4. Sowa ............................................................................................................ 75 2.4.5. Podwjne sowa ............................................................................................ 76 2.4.6. Sowa poczwrne i dugie............................................................................. 77 2.5. Operacje arytmetyczne na liczbach dwjkowych i szesnastkowych....................... 77 2.6. Jeszcze o liczbach i ich reprezentacji...................................................................... 78 2.7. Operacje logiczne na bitach.................................................................................... 81 2.8. Operacje logiczne na liczbach dwjkowych i cigach bitw.................................. 84 2.9. Liczby ze znakiem i bez znaku ............................................................................... 86 2.10. Rozszerzanie znakiem, rozszerzanie zerem, skracanie, przycinanie....................... 91 2.11. Przesunicia i obroty .............................................................................................. 95 2.12. Pola bitowe i dane spakowane................................................................................ 99 2.13. Wprowadzenie do arytmetyki zmiennoprzecinkowej ........................................... 104 2.13.1. Formaty zmiennoprzecinkowe przyjte przez IEEE ................................... 108 2.13.2. Obsuga liczb zmiennoprzecinkowych w jzyku HLA ............................... 112 2.14. Reprezentacja liczb BCD ..................................................................................... 115 2.15. Znaki .................................................................................................................... 117 2.15.1. Zestaw znakw ASCII................................................................................ 117 2.15.2. Obsuga znakw ASCII w jzyku HLA...................................................... 121 2.16. Zestaw znakw Unicode....................................................................................... 125 2.17. rda informacji dodatkowych............................................................................ 126

Rozdzia 3. Dostp do pamici i jej organizacja ................................................ 1273.1. Wprowadzenie...................................................................................................... 127 3.2. Tryby adresowania procesorw 80x86 ................................................................. 127 3.2.1. Adresowanie przez rejestr........................................................................... 128 3.2.2. 32-bitowe tryby adresowania procesora 80x86........................................... 129 3.3. Organizacja pamici fazy wykonania ................................................................... 135 3.3.1. Obszar kodu................................................................................................ 137 3.3.2. Obszar zmiennych statycznych................................................................... 139 3.3.3. Obszar niemodyfikowalny .......................................................................... 140 3.3.4. Obszar danych niezainicjalizowanych ........................................................ 141 3.3.5. Atrybut @nostorage.................................................................................... 141 3.3.6. Sekcja deklaracji var ................................................................................... 142 3.3.7. Rozmieszczenie sekcji deklaracji danych w programie HLA ..................... 143 3.4. Przydzia pamici dla zmiennych w programach HLA......................................... 144 3.5. Wyrwnanie danych w programach HLA ............................................................ 146 3.6. Wyra enia adresowe............................................................................................. 149 3.7. Koercja typw ...................................................................................................... 151 3.8. Koercja typu rejestru ............................................................................................ 154 3.9. Pami obszaru stosu oraz instrukcje push i pop .................................................. 155 3.9.1. Podstawowa posta instrukcji push............................................................. 155 3.9.2. Podstawowa posta instrukcji pop .............................................................. 157 3.9.3. Zachowywanie wartoci rejestrw za pomoc instrukcji push i pop .......... 158

Spis treci

5 3.9.4. Stos jako kolejka LIFO ............................................................................... 159 3.9.5. Pozostae wersje instrukcji obsugi stosu.................................................... 161 3.9.6. Usuwanie danych ze stosu bez ich zdejmowania ........................................ 163 3.9.7. Odwoywanie si do danych na stosie bez ich zdejmowania ...................... 165 3.10. Dynamiczny przydzia pamici obszar pamici sterty ..................................... 166 3.11. Instrukcje inc oraz dec.......................................................................................... 171 3.12. Pobieranie adresu obiektu..................................................................................... 171 3.13. rda informacji dodatkowych............................................................................ 172

Rozdzia 4. Stae, zmienne i typy danych.......................................................... 1734.1. Wprowadzenie...................................................................................................... 173 4.2. Kilka dodatkowych instrukcji: intmul, bound i into ............................................. 174 4.3. Typ tbyte............................................................................................................... 178 4.4. Deklaracje staych i zmiennych w jzyku HLA.................................................... 178 4.4.1. Typy staych ............................................................................................... 182 4.4.2. Literay staych acuchowych i znakowych............................................... 183 4.4.3. Stae acuchowe i napisowe w sekcji const............................................... 185 4.4.4. Wyra enia staowartociowe....................................................................... 186 4.4.5. Wielokrotne sekcje const i ich kolejno w programach HLA ................... 189 4.4.6. Sekcja val programu HLA .......................................................................... 190 4.4.7. Modyfikowanie obiektw sekcji val w wybranym miejscu kodu rdowego programu ....................................................................... 191 4.5. Sekcja type programu HLA .................................................................................. 192 4.6. Typy wyliczeniowe w jzyku HLA ...................................................................... 193 4.7. Typy wskanikowe ............................................................................................... 194 4.7.1. Wskaniki w jzyku asemblerowym........................................................... 196 4.7.2. Deklarowanie wskanikw w programach HLA ........................................ 197 4.7.3. Stae wskanikowe i wyra enia staych wskanikowych............................ 197 4.7.4. Zmienne wskanikowe a dynamiczny przydzia pamici ........................... 199 4.7.5. Typowe bdy stosowania wskanikw ...................................................... 200 4.8. Modu chars.hhf biblioteki standardowej HLA .................................................... 205 4.9. Zo one typy danych ............................................................................................ 207 4.10. acuchy znakw................................................................................................. 208 4.11. acuchy w jzyku HLA...................................................................................... 210 4.12. Odwoania do poszczeglnych znakw acucha ................................................. 217 4.13. Modu strings biblioteki standardowej HLA i procedury manipulacji acuchami...219 4.14. Konwersje wewntrzpamiciowe ......................................................................... 231 4.15. Zbiory znakw...................................................................................................... 232 4.16. Implementacja zbiorw znakw w jzyku HLA................................................... 233 4.17. Literay, stae i wyra enia zbiorw znakw w jzyku HLA ................................. 235 4.18. Operator in w wyra eniach logicznych wysokopoziomowego rozszerzenia jzyka HLA.................................................. 237 4.19. Obsuga zbiorw znakw w bibliotece standardowej HLA.................................. 237 4.20. Wykorzystywanie zbiorw znakw w programach HLA ..................................... 241 4.21. Tablice.................................................................................................................. 243 4.22. Deklarowanie tablic w programach HLA ............................................................. 244 4.23. Literay tablicowe................................................................................................. 245 4.24. Odwoania do elementw tablicy jednowymiarowej ............................................ 246 4.24.1. Porzdkowanie tablicy wartoci ................................................................. 248 4.25. Tablice wielowymiarowe ..................................................................................... 250 4.25.1. Wierszowy ukad elementw tablicy .......................................................... 251 4.25.2. Kolumnowy ukad elementw tablicy ........................................................ 255 4.26. Przydzia pamici dla tablic wielowymiarowych ................................................. 256 4.27. Odwoania do elementw tablic wielowymiarowych w jzyku asemblerowym... 258

6

Asembler. Sztuka programowania 4.28. Du e tablice i MASM (tylko dla programistw systemu Windows) .................... 259 4.29. Rekordy (struktury) .............................................................................................. 260 4.30. Stae rekordowe.................................................................................................... 263 4.31. Tablice rekordw.................................................................................................. 264 4.32. Wykorzystanie tablic i rekordw w roli pl rekordw ......................................... 265 4.33. Ingerowanie w przesunicia pl rekordw ........................................................... 269 4.34. Wyrwnanie pl w ramach rekordu...................................................................... 270 4.35. Wskaniki na rekordy........................................................................................... 271 4.36. Unie ...................................................................................................................... 273 4.37. Unie anonimowe................................................................................................... 275 4.38. Typy wariantowe .................................................................................................. 276 4.39. Stae unii............................................................................................................... 277 4.40. Przestrzenie nazw ................................................................................................. 278 4.41. Tablice dynamiczne w jzyku asemblerowym ..................................................... 281 4.42. Obsuga tablic w bibliotece standardowej jzyka HLA ........................................ 284 4.43. rda informacji dodatkowych............................................................................ 287

Rozdzia 5. Procedury i moduy ........................................................................ 2895.1. Wprowadzenie...................................................................................................... 289 5.2. Procedury.............................................................................................................. 289 5.3. Zachowywanie stanu systemu .............................................................................. 292 5.4. Przedwczesny powrt z procedury ....................................................................... 296 5.5. Zmienne lokalne ................................................................................................... 297 5.6. Symbole lokalne i globalne obiektw innych ni zmienne................................... 303 5.7. Parametry.............................................................................................................. 304 5.7.1. Przekazywanie przez warto ..................................................................... 305 5.7.2. Przekazywanie przez adres ......................................................................... 308 5.8. Funkcje i wartoci funkcji .................................................................................... 311 5.8.1. Zwracanie wartoci funkcji......................................................................... 312 5.8.2. Zo enie instrukcji jzyka HLA .................................................................. 313 5.8.3. Atrybut @returns procedur jzyka HLA..................................................... 316 5.9. Rekurencja............................................................................................................ 318 5.10. Deklaracje zapowiadajce .................................................................................... 322 5.11. Procedury w ujciu niskopoziomowym instrukcja call.................................... 323 5.12. Rola stosu w procedurach..................................................................................... 325 5.13. Rekordy aktywacji................................................................................................ 328 5.14. Standardowa sekwencja wejcia do procedury ..................................................... 331 5.15. Standardowa sekwencja wyjcia z procedury....................................................... 333 5.16. Niskopoziomowa implementacja zmiennych automatycznych ............................ 334 5.17. Niskopoziomowa implementacja parametrw procedury..................................... 336 5.17.1. Przekazywanie argumentw w rejestrach ................................................... 337 5.17.2. Przekazywanie argumentw w kodzie programu........................................ 340 5.17.3. Przekazywanie argumentw przez stos....................................................... 342 5.18. Wskaniki na procedury ....................................................................................... 365 5.19. Parametry typu procedurowego............................................................................ 368 5.20. Nietypowane parametry wskanikowe ................................................................. 370 5.21. Zarzdzanie du ymi projektami programistycznymi............................................ 371 5.22. Dyrektywa #include ............................................................................................. 372 5.23. Unikanie wielokrotnego wczania do kodu tego samego pliku........................... 374 5.24. Moduy a atrybut @external................................................................................. 375 5.24.1. Dziaanie atrybutu @external ..................................................................... 380 5.24.2. Pliki nagwkowe w programach HLA....................................................... 382 5.25. Jeszcze o problemie zamiecania przestrzeni nazw .............................................. 384 5.26. rda informacji dodatkowych............................................................................ 386

Spis treci

7

Rozdzia 6. Arytmetyka.................................................................................... 3896.1. Wprowadzenie...................................................................................................... 389 6.2. Zestaw instrukcji arytmetycznych procesora 80x86 ............................................. 389 6.2.1. Instrukcje mul i imul................................................................................... 389 6.2.2. Instrukcje div i idiv..................................................................................... 393 6.2.3. Instrukcja cmp ............................................................................................ 396 6.2.4. Instrukcje setXX ......................................................................................... 401 6.2.5. Instrukcja test.............................................................................................. 403 6.3. Wyra enia arytmetyczne ...................................................................................... 404 6.3.1. Proste przypisania ....................................................................................... 405 6.3.2. Proste wyra enia ......................................................................................... 406 6.3.3. Wyra enia zo one...................................................................................... 408 6.3.4. Operatory przemienne................................................................................. 413 6.4. Wyra enia logiczne .............................................................................................. 414 6.5. Idiomy maszynowe a idiomy arytmetyczne.......................................................... 417 6.5.1. Mno enie bez stosowania instrukcji mul, imul i intmul.............................. 417 6.5.2. Dzielenie bez stosowania instrukcji div i idiv............................................. 419 6.5.3. Zliczanie modulo n za porednictwem instrukcji and ................................. 420 6.5.4. Nieostro ne korzystanie z idiomw maszynowych .................................... 420 6.6. Arytmetyka zmiennoprzecinkowa ........................................................................ 421 6.6.1. Rejestry jednostki zmiennoprzecinkowej.................................................... 421 6.6.2. Typy danych jednostki zmiennoprzecinkowej ............................................ 429 6.6.3. Zestaw instrukcji jednostki zmiennoprzecinkowej ..................................... 430 6.6.4. Instrukcje przemieszczania danych............................................................. 431 6.6.5. Instrukcje konwersji.................................................................................... 433 6.6.6. Instrukcje arytmetyczne .............................................................................. 436 6.6.7. Instrukcje porwna ................................................................................... 442 6.6.8. Instrukcje adowania staych na stos koprocesora....................................... 445 6.6.9. Instrukcje funkcji przestpnych .................................................................. 445 6.6.10. Pozostae instrukcje jednostki zmiennoprzecinkowej ................................. 447 6.6.11. Instrukcje operacji cakowitoliczbowych.................................................... 449 6.7. Tumaczenie wyra e arytmetycznych na kod maszynowy jednostki zmiennoprzecinkowej........................................................................... 449 6.7.1. Konwersja notacji wrostkowej do odwrotnej notacji polskiej..................... 451 6.7.2. Konwersja odwrotnej notacji polskiej do kodu jzyka asemblerowego...... 453 6.8. Obsuga arytmetyki zmiennoprzecinkowej w bibliotece standardowej jzyka HLA.....455 6.8.1. Funkcje stdin.getf i fileio.getf ..................................................................... 455 6.8.2. Funkcje trygonometryczne moduu math.................................................... 455 6.8.3. Funkcje wykadnicze i logarytmiczne moduu math................................... 456 6.9. Podsumowanie...................................................................................................... 458

Rozdzia 7. Niskopoziomowe struktury sterujce wykonaniem programu............ 4597.1. Wprowadzenie...................................................................................................... 459 7.2. Struktury sterujce niskiego poziomu................................................................... 460 7.3. Etykiety instrukcji................................................................................................. 460 7.4. Bezwarunkowy skok do instrukcji (instrukcja jmp) ............................................. 462 7.5. Instrukcje skoku warunkowego ............................................................................ 465 7.6. Struktury sterujce redniego poziomu jt i jf................................................ 468 7.7. Implementacja popularnych struktur sterujcych w jzyku asemblerowym ......... 469 7.8. Wstp do podejmowania decyzji .......................................................................... 469 7.8.1. Instrukcje if..then..else................................................................................ 471 7.8.2. Tumaczenie instrukcji if jzyka HLA na jzyk asemblerowy.................... 475 7.8.3. Obliczanie wartoci zo onych wyra e logicznych metoda penego szacowania wartoci wyra enia................................... 480

8

Asembler. Sztuka programowania 7.8.4. Skrcone szacowanie wyra e logicznych ................................................. 481 7.8.5. Wady i zalety metod szacowania wartoci wyra e logicznych ................. 483 7.8.6. Efektywna implementacja instrukcji if w jzyku asemblerowym ............... 485 7.8.7. Instrukcje wyboru ....................................................................................... 490 7.9. Skoki porednie a automaty stanw...................................................................... 500 7.10. Kod spaghetti........................................................................................................ 503 7.11. Ptle...................................................................................................................... 504 7.11.1. Ptle while .................................................................................................. 505 7.11.2. Ptle repeat..until ........................................................................................ 506 7.11.3. Ptle nieskoczone ..................................................................................... 508 7.11.4. Ptle for ...................................................................................................... 508 7.11.5. Instrukcje break i continue.......................................................................... 509 7.11.6. Ptle a rejestry ............................................................................................ 513 7.12. Optymalizacja kodu.............................................................................................. 514 7.12.1. Obliczanie warunku zakoczenia ptli na kocu ptli ................................ 515 7.12.2. Zliczanie licznika ptli wstecz .................................................................... 517 7.12.3. Wstpne obliczanie niezmiennikw ptli.................................................... 518 7.12.4. Rozciganie ptli ........................................................................................ 519 7.12.5. Zmienne indukcyjne ................................................................................... 521 7.13. Mieszane struktury sterujce w jzyku HLA........................................................ 522 7.14. rda informacji dodatkowych............................................................................ 524

Rozdzia 8. Pliki .............................................................................................. 5258.1. Wprowadzenie...................................................................................................... 525 8.2. Organizacja plikw............................................................................................... 525 8.2.1. Pliki jako listy rekordw............................................................................. 526 8.2.2. Pliki tekstowe a pliki binarne...................................................................... 528 8.3. Pliki sekwencyjne ................................................................................................. 530 8.4. Pliki dostpu swobodnego .................................................................................... 538 8.5. Indeksowany sekwencyjny dostp do pliku (ISAM) ............................................ 543 8.6. Przycinanie pliku .................................................................................................. 546 8.7. rda informacji dodatkowych............................................................................ 548

Rozdzia 9. Zaawansowane obliczenia w jzyku asemblerowym......................... 5499.1. Wprowadzenie...................................................................................................... 549 9.2. Operacje o zwielokrotnionej precyzji ................................................................... 550 9.2.1. Obsuga operacji zwielokrotnionej precyzji w bibliotece standardowej jzyka HLA...................................................... 550 9.2.2. Dodawanie liczb zwielokrotnionej precyzji ................................................ 553 9.2.3. Odejmowanie liczb zwielokrotnionej precyzji............................................ 556 9.2.4. Porwnanie wartoci o zwielokrotnionej precyzji ...................................... 558 9.2.5. Mno enie operandw zwielokrotnionej precyzji ........................................ 562 9.2.6. Dzielenie wartoci zwielokrotnionej precyzji ............................................. 565 9.2.7. Negacja operandw zwielokrotnionej precyzji ........................................... 575 9.2.8. Iloczyn logiczny operandw zwielokrotnionej precyzji.............................. 577 9.2.9. Suma logiczna operandw zwielokrotnionej precyzji................................. 577 9.2.10. Suma wyczajca operandw zwielokrotnionej precyzji........................... 578 9.2.11. Inwersja operandw zwielokrotnionej precyzji .......................................... 578 9.2.12. Przesunicia bitowe operandw zwielokrotnionej precyzji ........................ 578 9.2.13. Obroty operandw zwielokrotnionej precyzji............................................. 583 9.2.14. Operandy zwielokrotnionej precyzji w operacjach wejcia-wyjcia........... 583 9.3. Manipulowanie operandami r nych rozmiarw.................................................. 604 9.4. Arytmetyka liczb dziesitnych.............................................................................. 606 9.4.1. Literay liczb BCD...................................................................................... 608 9.4.2. Instrukcje maszynowe daa i das.................................................................. 608

Spis treci

9 9.4.3. Instrukcje maszynowe aaa, aas, aam i aad .................................................. 610 9.4.4. Koprocesor a arytmetyka spakowanych liczb dziesitnych ........................ 612 9.5. Obliczenia w tabelach........................................................................................... 615 9.5.1. Wyszukiwanie w tabeli wartoci funkcji .................................................... 615 9.5.2. Dopasowywanie dziedziny ......................................................................... 620 9.5.3. Generowanie tabel wartoci funkcji............................................................ 621 9.5.4. Wydajno odwoa do tabel przegldowych ............................................. 625 9.6. rda informacji dodatkowych............................................................................ 625

Rozdzia 10. Makrodefinicje i jzyk czasu kompilacji .......................................... 62710.1. Wprowadzenie...................................................................................................... 627 10.2. Jzyk czasu kompilacji wstp .......................................................................... 627 10.3. Instrukcje #print i #error....................................................................................... 629 10.4. Stae i zmienne czasu kompilacji.......................................................................... 631 10.5. Wyra enia i operatory czasu kompilacji............................................................... 632 10.6. Funkcje czasu kompilacji ..................................................................................... 635 10.6.1. Funkcje czasu kompilacji konwersja typw........................................... 636 10.6.2. Funkcje czasu kompilacji obliczenia numeryczne ................................. 638 10.6.3. Funkcje czasu kompilacji klasyfikacja znakw ..................................... 638 10.6.4. Funkcje czasu kompilacji manipulacje acuchami znakw .................. 639 10.6.5. Funkcje czasu kompilacji dopasowywanie wzorcw............................. 639 10.6.6. Odwoania do tablicy symboli .................................................................... 641 10.6.7. Pozostae funkcje czasu kompilacji ............................................................ 643 10.6.8. Konwersja typu staych napisowych........................................................... 643 10.7. Kompilacja warunkowa........................................................................................ 645 10.8. Kompilacja wielokrotna (ptle czasu kompilacji)................................................. 650 10.9. Makrodefinicje (procedury czasu kompilacji) ...................................................... 653 10.9.1. Makrodefinicje standardowe....................................................................... 654 10.9.2. Argumenty makrodefinicji.......................................................................... 656 10.9.3. Symbole lokalne makrodefinicji ................................................................. 663 10.9.4. Makrodefinicje jako procedury czasu kompilacji ....................................... 666 10.9.5. Symulowane przeci anie funkcji .............................................................. 667 10.10. Tworzenie programw czasu kompilacji.............................................................. 672 10.10.1. Generowanie tabel wartoci funkcji............................................................ 673 10.10.2. Rozciganie ptli ........................................................................................ 677 10.11. Stosowanie makrodefinicji w osobnych plikach kodu rdowego ...................... 679 10.12. rda informacji dodatkowych ........................................................................... 679

Rozdzia 11. Manipulowanie bitami .................................................................... 68111.1. Wprowadzenie...................................................................................................... 681 11.2. Czym s dane bitowe? .......................................................................................... 681 11.3. Instrukcje manipulujce bitami............................................................................. 683 11.4. Znacznik przeniesienia w roli akumulatora bitw ................................................ 692 11.5. Wstawianie i wyodrbnianie acuchw bitw .................................................... 693 11.6. Scalanie zbiorw bitw i rozpraszanie acuchw bitowych................................ 696 11.7. Spakowane tablice acuchw bitowych .............................................................. 699 11.8. Wyszukiwanie bitw ............................................................................................ 701 11.9. Zliczanie bitw ..................................................................................................... 704 11.10. Odwracanie acucha bitw.................................................................................. 707 11.11. Scalanie acuchw bitowych .............................................................................. 709 11.12. Wyodrbnianie acuchw bitw ......................................................................... 710 11.13. Wyszukiwanie wzorca bitowego .......................................................................... 712 11.14. Modu bits biblioteki standardowej HLA ............................................................. 713 11.15. rda informacji dodatkowych ........................................................................... 715

10

Asembler. Sztuka programowania

Rozdzia 12. Operacje acuchowe..................................................................... 71712.1. Wprowadzenie...................................................................................................... 717 12.2. Instrukcje acuchowe procesorw 80x86............................................................ 717 12.2.1. Sposb dziaania instrukcji acuchowych ................................................. 718 12.2.2. Przedrostki instrukcji acuchowych repX ............................................ 719 12.2.3. Znacznik kierunku ...................................................................................... 719 12.2.4. Instrukcja movs........................................................................................... 721 12.2.5. Instrukcja cmps........................................................................................... 727 12.2.6. Instrukcja scas............................................................................................. 731 12.2.7. Instrukcja stos............................................................................................. 732 12.2.8. Instrukcja lods ............................................................................................ 733 12.2.9. Instrukcje lods i stos w zo onych operacjach acuchowych .................... 733 12.3. Wydajno instrukcji acuchowych procesorw 80x86 ...................................... 734 12.4. rda informacji dodatkowych............................................................................ 735

Rozdzia 13. Instrukcje MMX............................................................................. 73713.1. Wprowadzenie...................................................................................................... 737 13.2. Sprawdzanie obecnoci rozszerzenia MMX......................................................... 738 13.3. rodowisko programowania MMX ...................................................................... 739 13.3.1. Rejestry MMX............................................................................................ 739 13.3.2. Typy danych MMX .................................................................................... 741 13.4. Przeznaczenie instrukcji zestawu MMX............................................................... 742 13.5. Arytmetyka z nasycaniem a arytmetyka z zawijaniem ......................................... 743 13.6. Operandy instrukcji MMX ................................................................................... 744 13.7. Instrukcje zestawu MMX ..................................................................................... 746 13.7.1. Instrukcje transferu danych......................................................................... 747 13.7.2. Instrukcje konwersji.................................................................................... 747 13.7.3. Arytmetyka operandw spakowanych ........................................................ 752 13.7.4. Instrukcje logiczne...................................................................................... 755 13.7.5. Instrukcje porwna ................................................................................... 756 13.7.6. Instrukcje przesuni bitowych................................................................... 760 13.7.7. Instrukcja emms.......................................................................................... 762 13.8. Model programowania MMX............................................................................... 763 13.9. rda informacji dodatkowych............................................................................ 774

Rozdzia 14. Klasy i obiekty............................................................................... 77514.1. Wprowadzenie...................................................................................................... 775 14.2. Wstp do programowania obiektowego................................................................ 775 14.3. Klasy w jzyku HLA ............................................................................................ 779 14.4. Obiekty ................................................................................................................. 782 14.5. Dziedziczenie ....................................................................................................... 784 14.6. Przesanianie......................................................................................................... 785 14.7. Metody wirtualne a procedury statyczne .............................................................. 786 14.8. Implementacje metod i procedur klas ................................................................... 788 14.9. Implementacja obiektu ......................................................................................... 793 14.9.1. Tabela metod wirtualnych .......................................................................... 796 14.9.2. Reprezentacja w pamici obiektu klasy pochodnej..................................... 798 14.10. Konstruktory i inicjalizacja obiektw................................................................... 802 14.10.1. Konstruktor a dynamiczny przydzia obiektu ............................................. 804 14.10.2. Konstruktory a dziedziczenie...................................................................... 806 14.10.3. Parametry konstruktorw i przeci anie procedur klas .............................. 810 14.11. Destruktory........................................................................................................... 811 14.12. acuchy _initialize_ oraz _finalize_ w jzyku HLA .......................................... 812 14.13. Metody abstrakcyjne ............................................................................................ 818

Spis treci

11 14.14. Informacja o typie czasu wykonania (RTTI) ........................................................ 822 14.15. Wywoania metod klasy bazowej ......................................................................... 824 14.16. rda informacji dodatkowych ........................................................................... 825

Rozdzia 15. Na styku asemblera i innych jzykw programowania...................... 82715.1. Wprowadzenie...................................................................................................... 827 15.2. czenie kodu HLA i kodu asemblera MASM bd Gas ..................................... 827 15.2.1. Kod asemblera MASM (Gas) rozwijany w kodzie jzyka HLA................. 828 15.2.2. Konsolidacja moduw MASM (Gas) z moduami HLA............................ 832 15.3. Moduy HLA a programy jzyka Delphi (Kylix) ................................................. 837 15.3.1. Konsolidacja moduw HLA z programami jzyka Delphi (Kylix) ........... 838 15.3.2. Zachowywanie wartoci rejestrw.............................................................. 842 15.3.3. Wartoci zwracane funkcji.......................................................................... 843 15.3.4. Konwencje wywoa .................................................................................. 849 15.3.5. Przekazywanie argumentw przez warto i adres, parametry niemodyfikowalne i wyjciowe ................................................. 854 15.3.6. Skalarne typy danych w jzykach HLA i Delphi (Kylix) ........................... 856 15.3.7. Przekazywanie acuchw znakw z Delphi do procedury HLA ............... 858 15.3.8. Przekazywanie rekordw z programu w jzyku Delphi do kodu HLA....... 862 15.3.9. Przekazywanie zbiorw z programu w jzyku Delphi do kodu HLA ......... 866 15.3.10. Przekazywanie tablic z programu w jzyku Delphi do kodu HLA ............. 867 15.3.11. Odwoania do obiektw programu pisanego w Delphi w kodzie HLA....... 867 15.4. Moduy HLA a programy jzykw C i C++ ......................................................... 870 15.4.1. Konsolidacja moduw jzyka HLA z programami jzykw C i C++........ 872 15.4.2. Zachowywanie wartoci rejestrw.............................................................. 875 15.4.3. Wartoci funkcji ......................................................................................... 876 15.4.4. Konwencje wywoa .................................................................................. 876 15.4.5. Tryby przekazywania argumentw ............................................................. 880 15.4.6. Odwzorowanie typw skalarnych pomidzy jzykiem C (C++) a jzykiem HLA ........................................... 881 15.4.7. Przekazywanie acuchw znakw pomidzy programem w jzyku C (C++) a moduem HLA........................ 883 15.4.8. Przekazywanie rekordw pomidzy programem w jzyku C (C++) a moduem HLA........................ 883 15.4.9. Przekazywanie tablic pomidzy programem w jzyku C (C++) a moduem HLA........................ 886 15.5. rda informacji dodatkowych............................................................................ 886

Dodatek A Tabela kodw ASCII....................................................................... 887 Dodatek B Instrukcje procesorw 80x86......................................................... 891 Skorowidz...................................................................................... 927

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

WYLACZNO DO PUBLIKOWANIA TEGO TEKSTU, POSIADA RAG WWW.R-AG.PRV.PL THE ART OF ASSEMBLY LANGUAGE tumaczone by KREMIK konsultacja naukowa [email protected]

[email protected]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ROZDZIAL PIERWSZY: REPREZENTACJA DANYCH Prawdopodobnie najwiksz przeszkod jak wikszo pocztkujcych napotyka kiedy prbuje nauczy si asemblera jest powszechne uywanie binarnego i heksadecymalnego systemu liczbowego. Wielu programistw sdzi e liczby heksadecymalne stanowi absolutny dowd na to, e Bg nigdy nie planowa aby ktokolwiek pracowa w asemblerze. Chocia to prawda, e liczby heksadecymalne troch si rni od tego czego uywamy na co dzie, ich zalety znacznie przewyszaj ich wady. Pomimo to, opanowanie tych systemw liczbowych jest wane poniewa ich zrozumienie upraszcza inne wane tematy wliczajc w to algebr boolowsk i projekt logiczny, reprezentacj numeryczn znakw, kody znakw i dane upakowane. 1.0 WSTP Ten rozdzia omawia kilka wanych poj, w tym binarny i heksadecymalny system liczbowy, organizacj danych binarnych (bity ,nibbles ,bajty ,sowa i podwjne sowa),system liczb ze znakiem i bez znaku, operacje arytmetyczne, logiczne, przesunicia i obroty na wartociach binarnych, pola bitw i pakowanie danych ,zbir znakw ASCII. Jest to podstawowy materia a dalsze czytanie tego tekstu zaley od zrozumienia tych poj. Jeli ju jeste zapoznany z tymi terminami z innych kursw lub studiw powiniene przynajmniej przejrze ten materia przed przystpieniem do nastpnego rozdziau. Jeli nie jeste zapoznany lub tylko oglnikowo ,powiniene przestudiowa go starannie. CAY MATERIA W TYM ROZDZIALE JEST WANY! Nie opuszczaj nadmiernie materiau. 1.1 SYSTEMY LICZBOWE Wikszo nowoczesnych systemw komputerowych nie przedstawia wartoci liczbowych uywajc systemu dziesitnego. Zamiast tego, uywaj systemu binarnego lub systemu "dopenienia do dwch" .eby zrozumie ograniczenia arytmetyki komputerw musimy zrozumie w jaki sposb komputery przedstawiaj liczby. 1.1.1 PRZEGLD SYSTEMU DZIESITNEGO Uywasz systemu dziesitnego (opartego o 10) od tak dawna, e uwaasz go za pewnik. Kiedy widzisz liczb tak jak *123*,nie mylisz o wartoci 123;raczej stwarzasz umysowy obraz tego jak pozycj ta warto przedstawia. W rzeczywistoci, liczba 123 przedstawia 1*102+2*101+3*100 lub 100+20+3 Kada cyfra pojawiajca si po lewej stronie przecinka przyjmuje warto midzy zero a dziewi mnoone przez dodatnie potgi liczby dziesi. Cyfra pojawiajca si po prawej stronie przecinka przyjmuje wartoci midzy zero a dziewi mnoone przez rosnce, ujemne potgi liczby dziesi. Na przykad warto 123,456 to: 1*1022+2*1011+3*1000+4*10-1-1+5*10-2-2+6*10-3 lub 100+20+3+0.4+0.05+0.006

1.1.2 BINARNY SYSTEM LICZBOWY Wikszo nowoczesnych systemw komputerowych (w tym IBM PC) dziaa uywajc logiki binarnej. Komputer przedstawia wartoci uywajc dwch poziomw napicia (zwykle 0V i 5V).Poprzez dwa takie poziomy moemy przedstawi dokadnie dwie rone wartoci. To mogyby by dowolne dwie rone wartoci ale konwencjonalnie uywamy wartoci zero i jeden. Te dwie wartoci, zbiegiem okolicznoci, odpowiadaj dwom cyfrom uywanym przez binarny system liczbowy. Poniewa jest zgodno midzy logicznymi poziomami uywanymi przez 80x86 i dwoma cyframi uywanymi w binarnym systemie liczbowym, nie byo niespodzianki, ze IBM PC zastosowa binarny system liczbowy. Binarny system liczbowy pracuje tak jak system dziesitny z dwoma wyjtkami: system binarny uznaje tylko cyfry 0 i 1 (zamiast 0-9) i system binarny uywa potgi dwa zamiast potgi dziesi. Dlatego tez jest bardzo atwo przeksztaci liczb binarna na dziesitn. Dla kadego "1" lub 0 w acuchu binarnym dodajemy 2n gdzie n jest pozycja cyfry binarnej liczonej od prawej strony (zera)Na przykad binarna wartosc11001010(2) przedstawia si tak: 1*27+1*26 +0*25+0*24+1*23+0*22+1*21+0*20 lub 8+64+8+2 = 202(10) Przeksztacenie liczby dziesitnej na binarna jest odrobin bardziej skomplikowane Musisz znale te potgi dwjki, ktre dodane razem stworz rezultat dziesitny. Najatwiejsza metoda to zacz od duych potg dwjki a do 20.Rozwamy dziesitn warto 1359: * 210=1024. 211=2048. 1024 jest najwiksz potga dwjki mniejsz ni 1359. Odejmujemy 1024 od 1359 i zaczynamy warto binarna od lewej cyfra "1".Binarnie = "1".Resultat dziesitny to 1359-1024=335. * Kolejna ,nisza potga dwjki (29=512) jest wiksza ni powyszy rezultat, wic dodajemy "0" na koniec binarnego acucha. Binarnie="10",dziesitnie jest wci 335 * Kolejn, nisz potg dwjki jest 256 (28).Odejmujemy j od 335 i dodajemy cyfr "1" na koniec binarnej liczby.Binarnie="101",rezultat dziesitny to 79. * 128 (27) jest wiksze ni 79 wic doczamy "0" do koca acucha binarnego. Binarnie ="1010",rezultat dziesitny pozostaje 79. * Nastpna nisza potga dwjki (26=64) jest mniejsza ni 79,wiec odejmujemy 64 i doczamy "1" do koca binarnego acucha. Binarnie ="10101".Rezultat dziesitny to 15 * 15 jest mniejsze ni nastpna potga dwjki (25=32) wic po prostu dodajemy "0" do koca acucha binarnego.Binarnie="101010".Dziesietny rezultat to wci 15. * 16 (24) jest wiksza ni dotychczasowa reszta wic doczamy "0" do koca acucha binarnego.Binarnie="1010100",rezultat dziesitny to 15. * 23 (osiem) jest mniejsze ni 15 wic dokadamy nastpna cyfr "1" na koniec binarnego lancucha.Binarnie="10101001",dziesitnie rezultat to 7. * 22 jest mniejsze ni 7 wic odejmujemy cztery od siedmiu i doczamy nastpn jedynk do binarnego lancucha.Binarnie="101010011",dziesietnie jest 3. * 21 jest mniejsze ni 3 wic dodajemy jedynk do acucha binarnego i odejmujemy dwa od wartoci dziesitnej.Binarnie="1010100111",dziesitny rezultat to teraz 1. * Ostatecznie rezultat dziesitny wynosi jeden ( 20) wiec dodajemy kocow "1" na koniec acucha binarnego. Kocowy rezultat binarny to: 10101001111 Liczby binarne, mimo i maja mae znaczenie w jzykach programowania wysokiego poziomu, pojawiaj si wszdzie w programach pisanych w asemblerze. 1.1.3 FORMAT DWJKOWY Kada binarna liczba zawiera bardzo dua liczb cyfr (lub bitw - skrt od BInary digiTs).Na przykad ,przedstawiamy liczb pi poprzez: 101 00000101 0000000000101 000000000000101 Dowolna liczba zera moe poprzedza licz binarn bez zmiany jej wartoci. Przyjmiemy konwencj ignorowania poprzedzajcych zer. Na przyklad,101(2) przedstawia liczb pi .Poniewa 80x86 pracuje z grupami omiobitowymi, przyjdzie nam duo atwiej rozszerzy o zera wszystkie liczby binarne jako wielokrotnoci czterech lub omiu bitw. Dlatego tez podajc za konwencja, przedstawimy liczb pi jako 0101(2) lub 00000101(2).

W USA wikszo ludzi oddziela kade trzy cyfry przecinkiem, co czyni due liczby atwiejszymi do odczytu, na przykad 1,023,435,208 jest duo atwiejsze do przeczytania i pojcia ni 1023435208.Przyjmiemy podobn koncepcje w tym tekcie dla liczb binarnych. Oddzielimy kad grup czterech bitw spacj. Na przykad binarn warto 1010111110110010 zapiszemy jako 1010 1111 1011 0010. Czsto pakujemy kilka wartoci razem do tej samej liczby binarnej. Jedna z form instrukcji MOV 80x86 uywa binarnego kodowania 1011 0rrr dddd dddd dla spakowania trzech pozycji do 16 bitw; pi bitw kodu operacji (10110),trzy bity pola rejestrw (rrr) i osiem bitw wartoci bezporedniej (dddd dddd).Dla wygody, przydzielimy wartoci liczbowe kadej pozycji bitu .Ponumerujemy kady bit jak nastpuje: 1) Bit najbardziej na prawo jest bitem z pozycji zero. 2) Kady bit na lewo ma kolejny ,wikszy numer Omiobitowa warto binarna uywa bitw od zero do siedem: x7,x6,x5,x4,x3,x2,x1,x0 Szesnastobitowa warto binarna uywa bitw od zera do pitnastu: x15,x14,x13,x12,x11,x10,x9,x8,x7,x6,x5,x4,x3,x2,x1,x0 Do bitu zerowego zazwyczaj odnosimy si jako najmniej znaczcego bitu (L.O). Bit najbardziej z lewej strony jest zwykle nazywany bitem najbardziej znaczcym (H.O.). Bdziemy si odnosili do bitw porednich poprzez ich numery. 1.2 ORGANIZACJA DANYCH W czystej matematyce wartoci mog zawiera przypadkowe liczby bitw. Komputery ,generalnie rzecz biorc pracuj z okrelon liczb bitw. Powszechnie przyjte to pojedyncze bity, grupy czterech bitw (zwane nibbles),grupy omiu bitw (zwane bajtami),grupy szesnastu bitw (zwane sowem) i wicej. Ich rozmiary nie s przypadkowe. Ta sekcja opisze grupy bitw powszechnie uywanych w chipach Intela 80x86 1.2.1 BITY Najmniejsza "jednostka danych w komputerze jest pojedynczy bit. Poniewa pojedynczy bit jest zdolny do przedstawiania tylko dwch ronych wartoci (typowo zero i jeden),moemy odnie wraenie, ze jest bardzo mao wartoci jakie moe przedstawi pojedynczy bit. Nie prawda! Jest ogromna liczba pozycji jakie moemy przedstawi za pomoc pojedynczego bitu. Za pomoc pojedynczego bitu moemy przedstawi dwie odrbne pozycje. Przykadem mog by: zero lub jeden, prawda lub fasz, wczony lub wyczony, mczyzna lub kobieta, Jednake nie jestemy ograniczeni do przedstawiania typw danych binarnych (to znaczy tych obiektw ktre maja dwie rone wartoci). Moesz uywa pojedynczego bitu do przedstawiania liczb 723 i 1,245 lub 6.254 i 5. Moesz rwnie uy pojedynczego bitu do przedstawiania kolorw czerwonego i niebieskiego. Moesz nawet przedstawi dwa nie powizane ze sob obiekty za pomoc pojedynczego bitu. Na przykad, moesz przedstawi kolor czerwony i liczb 3.256 za pomoc pojedynczego bitu. Moesz przedstawi jakie dwie rone wartoci za pomoc pojedynczego bitu. Jednake moesz przedstawi tylko dwie rone wartoci za pomoc pojedynczego bitu. To mylce rzeczy, nawet bardzo, rone bity mog przedstawia rone rzeczy. Na przykad jeden bit moe by uywany do przedstawiania wartoci zero i jeden, podczas gdy ssiedni bit moe by uywany do przedstawiania wartoci prawda i fasz .Jak mona to odrni patrzc na te bity? Odpowied, nie mona. Ale to ilustruje caa ide komputerowej struktury danych: dana jest to to co ty zdefiniujesz. Jeli uyjesz bitu do przedstawienia boolowskiej (prawda/ fasz) wartoci wwczas ten bit (zdefiniowany przez ciebie) reprezentuje prawd lub fasz. Dla bitw majcych prawdziwe znaczenie musisz by konsekwentny. To znaczy ,jeli uywasz bitu do przedstawiania prawdy lub faszu w jednym punkcie swojego programu nie powiniene uywa wartoci prawda/fasz przechowywanej w tym bicie do pniejszego przedstawiania koloru czerwonego lub niebieskiego. Poniewa wikszo danych ktrych bdziesz uywa, wymaga wicej ni dwch ronych wartoci, pojedyncze wartoci bitw nie s najbardziej powszechnymi typami danych, ktre bdziesz stosowa. Poniewa wszystko inne skada si z grup bitw, bity odgrywaj wan role w twoich programach. Oczywicie, jest kilka typw danych ktre wymagaj dwch odrbnych wartoci, wiec wydaje si, ze bity s wane same w sobie. Jednak wkrtce zobaczysz, e pojedyncze bity s trudne do manipulowania, wiec czsto bdziemy uywa innych typw danych do przedstawiania wartoci boolowskich. 1.2.2 NIBBLESY

Nibble jest zbiorem czterech bitw. To nie jest szczeglnie interesujca struktura danych za wyjtkiem dwch przypadkw: liczb BCD (Binary Coded Decimal) i liczb heksadecymalnych. Cztery bity przedstawiaj pojedyncz cyfr BCD lub heksadecymaln. Przy pomocy nibblea moemy przedstawi do 16 odrbnych wartoci. W przypadku liczb heksadecymalnych, wartoci 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E i F s przedstawiane przez cztery bity (zobacz "Heksadecymalny System Liczbowy ).BCD uywa 10 ronych cyfr (0,1,2,3,4,5,6,7,8,9) i wymaga czterech bitw. Faktycznie, kada z szesnastu odrbnych wartoci moe by przedstawiana przez nibblea, ale cyfry heksadecymalne i BCD s podstawowymi pozycjami jakie moemy przedstawi za pomoc pojedynczego nibble'a. 1.2.3 BAJTY Bez wtpliwoci, najwaniejsz struktur danych uywan przez mikroprocesor 80x86 jest bajt .Bajt skada si z omiu bitw i jest najmniejszym adresowalnym elementem danych w mikroprocesorze 80x86.Adresy pamici gwnej jak i I/O w 80x86 wszystkie s adresami bajtowymi. To znaczy, ze najmniejsza pozycja ktra moe by dostpna przez program w 80x86 jest wartoci omiobitow. Dostp do czegokolwiek mniejszego wymaga aby odczyta bajt zawierajcy dane i zamaskowa niechciane bity. Bity w bajcie s zazwyczaj numerowane od zera do siedem, przy uyciu konwencji przedstawionej na rysunku 1.1. Bit 0 jest najmniej znaczcym bitem, bit 7 jest najbardziej znaczcym bitem. Do pozostaych bitw bdziemy si odwoywa poprzez ich numery.

Rysunek 1.1 Numerowanie bitw w bajcie Zauwa, e bajt take zawiera dwa nibble (zobacz rysunek 1.2)

Rysunek 1.2 Dwa nibble w bajcie Bity 0..3 stanowi mniej znaczcego nibble'a, bity 4..7 bardziej znaczcego nibble'a. Poniewa bajt zawiera dokadnie dwa nibble, warto bajtu wymaga dwch cyfr heksadecymalnych. Poniewa bajt zawiera osiem bitw, mona przedstawi 28 ,lub 256, ronych wartoci. Generalnie bdziemy uywa bajtu do przedstawiania wartoci liczbowych w zakresie 0...255,liczb ze znakiem w zakresie -128..+127 (zobacz "Liczby ze znakiem i bez znaku" ),kodw znakw ASCII/IBM, i innych specjalnych typw danych wymagajcych nie wicej ni 256 ronych wartoci. Wiele typw danych ma mniej ni 256 pozycji, wic osiem bitw jest zazwyczaj wystarczajcych. Poniewa 80x86 jest maszyn adresowalna bajtem (zobacz "Ukad Pamici i Dostp") okazuje si bardziej efektywne manipulowanie caym bajtem ni pojedynczym bitem czy nibble'm. Z tego powodu wikszo programistw uywa caego bajtu do przedstawienia typu danych ktry wymaga nie wicej ni 256 pozycji, nawet jeli mniej ni osiem bitw wystarczyoby. Na przykad, czsto przedstawiamy wartoci boolowskie prawd i fasz (odpowiednio) jako 00000001(2) i 00000000(2). Prawdopodobnie najwaniejszym zastosowaniem bajtu jest udzia w kodzie znaku. Znaki pisane z klawiatury, wywietlane na ekranie, i drukowane na drukarce, wszystkie maj wartoci liczbowe. Pozwala to porozumiewa si z reszt wiata, IBM PC uywa wariantu ze znakami ASCII (zobacz "Zbir znakw ASCII). Jest 128 zdefiniowanych kodw w zbiorze znakw ASCII.IBM uywa pozostaych 128 moliwych wartoci dla rozszerzonego zbioru kodw znakw wliczajc w to znaki europejskie ,symbole graficzne, litery greckie i symbole matematyczne. 1.2.4 SOWA

Sowo jest grup 16 bitw. Ponumerujemy te bity zaczynajc od zera w gore a do pitnastu. Numeracja bitw pokazana jest na rysunku 1.3

Rysunek 1.3 Numeracja bitw w sowie Tak jak przy bajcie, bit 0 jest najmodszym bitem a bit 15 najstarszym bitem. Kiedy odnosimy si do innych bitw w sowie uywamy ich numerw pozycji. Zauwa, ze sowo zawiera dokadnie dwa bajty. Bity 0 do 7 tworz mniej znaczcy bajt, bity od 8 do 15 tworz bardziej znaczcy bajt.(Zobacz rysunek 1.4)

Rysunek 1.4 Dwa bajty w sowie Naturalnie, sowo moe by dalej rozbite na cztery nibble jak pokazuje rysunek 1.5

Rysunek 1.5 Nibble w sowie Nibble zero jest najmniej znaczcym nibblem w sowie a nibble trzy najbardziej znaczcym nibblem sowa. Pozostae dwa nibble to "nibble jeden" i nibble dwa". Majc 16 bitw moemy przedstawi 216 (65,536) ronych wartoci. To mog by wartoci w zakresie od 0 do 65 536 (lub zazwyczaj -32,768..+32,767) lub kady inny typ danych o wartociach nie wikszych ni 65,536.Trzy wane zastosowania dla sowa to wartoci liczb cakowitych, offsetw i wartoci segmentw (zobacz "Ukad Pamici i Dostp przy opisie segmentw i offsetw). Sowa mog reprezentowa wartoci cakowite w zakresie 0..65 536 lub -32,768..+32,767.Wartoci liczb bez znaku s reprezentowane przez wartoci binarne zgodne z bitami w sowie. Wartoci liczb ze znakiem uywaj formy dopenienia do dwch dla wartoci liczbowych (zobacz "Liczby ze znakiem i bez znaku").Wartoci segmentu, ktre s zawsze dugie na 16 bitw stanowi adres paragrafu kodu, danych, danych specjalnych lub segmentu stosu w pamici. 1.2.5 PODWJNE SLOWO Podwjne sowo jest dokadnie tym, na co wskazuje jego nazwa, par sw .Dlatego tez dugo podwjnego sowa wynosi 32 bity ,jak pokazuje rysunek 1.6.

Rysunek 1.6 Liczba bitw w podwjnym sowie Naturalnie, to podwjne sowo moe by dzielone na sowo wyszego rzdu i sowo niszego rzdu, lub cztery rone bajty, lub osiem ronych nibbli (zobacz rysunek 1.7).Podwjne sowa mog reprezentowa wiele rodzajw ronych rzeczy .Przede wszystkim na licie jest adresowanie segmentu. Inna powszechn pozycj reprezentowan przez podwjne sowo jest 32 bitowa

Rysunek 1.7 Nibble, bajty i sowa w podwjnym sowie warto cakowita (ktra okrela liczby bez znaku w zakresie 0..4,294,967,295 lub liczby ze znakiem w zakresie 2,147,483,648..2,147,483,647).32-bitowa warto zmiennoprzecinkowa take mieci si w podwjnym sowie. Wikszo czasu bdziemy uywa podwjnych sw dla adresowania segmentw. 1.3 HEKSADECYMALNY SYSTEM LICZBOWY Spraw z binarnym systemem ju omwilimy. Przedstawienie wartoci 202(10) wymaga omiu cyfr binarnych. Wersja dziesitna wymaga tylko trzech cyfr dziesitnych, tak wiec przedstawianie liczb jest duo atwiejsze ni w przypadku systemu binarnego. Ten fakt nie umkn uwadze inynierw ktrzy projektowali komputerowy system binarny. Kiedy pracowali z duymi wartociami, liczby binarne szybko stay si zbyt nieporczne .Niestety, komputer myli binarnie, wikszo czasu ,w dogodnym w uyciu binarnym systemie liczbowym. Mimo, e umiemy konwertowa midzy systemem dziesitnym a systemem dwjkowym, przeliczanie nie jest bahym zadaniem. Heksadecymalny system liczbowy (oparty o 16) rozwizuje te problemy. .Liczby heksadecymalne oferuj dwie cechy ,ktrych szukamy: s niewielkich rozmiarw i prosto zamienia si je na liczby binarne i vice versa .Z powodu tego, wikszo binarnych systemw komputerowych dzisiaj uywa heksadecymalnego systemu liczbowego. Poniewa podstaw liczby heksadecymalnej jest 16,kada heksadecymalna cyfra przedstawia jak warto ktr mnoymy przez kolejn potg liczby 16.Na przykad liczba 1234(16) rwna si: 1*163*1623*161*160 lub 4096+512+48+4 = 4660(10) Kada cyfra heksadecymalna moe reprezentowa jedn z szesnastu wartoci midzy 0 a 15(10).Poniewa jest tylko 10 cyfr dziesitnych, musimy wymyli sze dodatkowych cyfr dla przedstawienia wartoci w zakresie 10(10) do

15(10) ..Zamiast tworzy nowe symbole dla tych cyfr, uyjemy liter od A do F. Wszystkie niej przedstawione wyraenia s przykadami prawidowych heksadecymalnych liczb: 1234(16) DEAD(16) BEEF(16) 0AFB(16) FEED(16) DEAF(16) Poniewa bdziemy musieli czsto wprowadza liczby heksadecymalne do systemu komputerowego, bdziemy potrzebowa ronych mechanizmw dla przedstawiania liczb heksadecymalnych. W kocu, w wikszoci systemw komputerowych nie mona wprowadza indeksw dolnych oznaczajcych rodzaj wprowadzanej liczby. Przyjmiemy nastpujc konwencj: * Wszystkie wartoci liczbowe (bez wzgldu na ich indeks) zaczynamy cyfra dziesitn * Wszystkie wartoci heksadecymalne koczymy liter "h" np. 123A4h * Liczby dziesitne mog mie przyrostek "t" lub "d" Przykady prawidowych liczb heksadecymalnych: 1234h 0DEADh 0BEEFh 0AFBh 0FEEDh 0DEAFh Wic jak widzisz, liczby heksadecymalne s niewielkich rozmiarw i atwe do odczytu. W dodatku moesz atwo przeksztaca midzy liczbami heksadecymalnymi a binarnymi. Rozwa nastpujca tablice: Binarnie 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Heksadecymalnie 0 1 2 3 4 5 6 7 8 9 A B C D E F

Tablica 1 Liczby binarne i heksadecymalne Ta tablica dostarcza wszystkich informacji ktrych bdziesz potrzebowa przy konwersji liczby heksadecymalnej na binarn i vice versa. Konwersja liczby heksadecymalnej na binarn polega na zamianie odpowiednich czterech bitw kadej heksadecymalnej cyfry na liczb. Na przykad, konwersja 0ABCDh na warto binarn, polega na konwersji kadej heksadecymalnej cyfry wedug powyszej tabeli: 0 A B C D heksadecymalnie 0000 1010 1011 1100 1101 binarnie Konwersja liczby binarnej na format heksadecymalny jest prawie tak samo atwa. Pierwszy krok to dodanie zer do liczby binarnej aby upewni si, ze wystpuje wielokrotno czterech bitw w liczbie. Na przykad, mamy dan liczb binarna 1011001010,pierwszym krokiem bdzie dodanie dwch bitw z lewej strony liczby, tak aby zawieraa 12 bitw. Konwertowana warto binarna to 001011001010.Nastpny krok to rozdzielenie wartoci binarnej w grupy czterobitowe np. 0010 1100 1010.Na koniec sprawdzamy te wartoci binarne w powyszej tablicy i zastpujemy je waciwymi cyframi heksadecymalnymi np. 2CA.Porwnaj to z trudnociami przy konwersji midzy liczbami dziesitnymi a binarnymi, czy dziesitnymi i heksadecymalnymi. Poniewa konwertowanie midzy liczbami heksadecymalnymi a binarnymi jest operacj, ktr bdziesz wykonywa wielokrotnie, wiec powi kilka chwil i naucz si powyszej tabelki na pami. Nawet jeli masz kalkulator, ktry zrobi te konwersje dla ciebie, odkryjesz, e konwersja rczna jest duo szybsza i bardziej dogodna kiedy konwertujesz pomidzy liczbami binarnymi i heksadecymalnymi. 1.4 OPERACJE ARYTMETYCZNE NA LICZBACH BINARNYCH I HEKSADECYMALNYCH

Jest kilka operacji, ktre moemy wykona na liczbach binarnych i heksadecymalnych. Na przykad, moemy dodawa, odejmowa, mnoy, dzieli i wykona inne operacje arytmetyczne. Mimo, e nie musisz zosta ekspertem w tej dziedzinie, powiniene, umie wykona te operacje rcznie uywajc kawaka papieru i owka. Majc powiedziane, ze powiniene wykona te operacje rcznie, waciwym sposobem wykonania takiej operacji jest posiadanie kalkulatora ktry wykona to za ciebie. Jest kilka takich kalkulatorw na rynku; lista poniej przedstawia kilku producentw ktrzy produkuj takie urzdzenia: Producenci kalkulatorw heksadecymalnych: * Casio * Hewlett-Packard * Sharp * Texas Instruments Ta lista nie jest wyczerpujca. Kalkulatory innych producentw s prawdopodobnie rwnie dobre. Urzdzenia Hewlett-Packarda s by moe najlepsze w swojej grupie ,jednake s one drosze ni inne .Sharp i Casio wytwarzaj kalkulatory, ktre sprzedaj poniej 50$.Jeli spodziewasz si napisa program w jzyku asemblera, posiadanie jednego z tych kalkulatorw jest niezbdne. Alternatywa dla zakupu kalkulatora heksadecymalnego jest posiadanie programu TSR firmy SideKick, ktry zawiera wbudowany kalkulator. Jednake, o ile nie masz ju jednego z tych programw, lub potrzebujesz kilku innych cech, ktre oferuj ,takie programy nie maj szczeglnej wartoci, poniewa kosztuj wicej ni kalkulator i nie s tak dogodne w uyciu. Aby zrozumie dlaczego wydasz pienidze na kalkulator rozwa nastpujcy problem arytmetyczny: 9h + 1h ---kusi ci, eby napisa odpowied "10h" jako rozwizanie tego problemu. To nie jest prawidowo! Prawidowa odpowied to dziesi, ale zapisana jako "0Ah","10h" nie jest prawidowym zapisem heksadecymalnym. Podobny problem wystpuje w tym arytmetycznym problemie: 10h - 1h ----prawdopodobnie kusi ci odpowiedz "9h" pomimo, e prawdziwa odpowiedz to "0Fh".Pamitaj, ten problem to pytanie "jaka jest rnica midzy szesnacie a jeden?" Odpowied: oczywicie, to pitnacie zapisane "0Fh". Nawet jeli te dwa przykady nie zaniepokoiy ci, w sytuacji stresowej twj mzg wrci do trybu dziesitnego podczas pracy nad czym istotnym i twoja praca przyniesie bdne rezultaty. Mora z tej historii - jeli musisz robi arytmetyczne wyliczenia uywaj liczb heksadecymalnych rcznie, powi swj czas i bd przy tym ostrony. Nigdy nie bdziesz wykonywa oblicze w arytmetyce binarnej. Poniewa liczby binarne zwykle zwieraj dugie acuchy bitw, wiec jest dua moliwo, e popenisz bd. Zawsze przeksztacaj liczby binarne na heksadecymalne, wykonaj operacje na heksadecymalnych (najlepiej kalkulatorem heksadecymalnym) i przekszta wynik z powrotem na liczb binarna ,jeli to konieczne. 1.5 OPERACJE LOGICZNE NA BITACH S cztery gwne operacje logiczne, ktre moemy wykona na liczbach heksadecymalnych i binarnych: AND,OR,XOR (exlusive-or) i NOT.W odrnieniu od operacji arytmetycznych kalkulator heksadecymalny nie jest konieczny do wykonania tych operacji. Jest to czsto atwiejsze do zrobienia rcznie ni przy uyciu do oblicze urzdze elektronicznych. Operacja logiczna AND jest operacj na liczbach binarnych (operuje na dwch operandach) S to operacje na pojedynczych bitach. Operacja AND: 0 AND 0=0 0 AND 1=0 1 AND 0=0 1 AND 1=1 Prostym sposobem dla przedstawienia logicznej operacji AND jest tabela prawdy. Tabela prawdy AND wyglda nastpujco : AND 0 1 0 0 0 1 0 1

Tablica 2: Tabela prawdy AND

Wyglda to jak tabliczka mnoenia z ktr zetknlicie si w szkole podstawowej. Kolumna z lewej strony i wiersz na grze reprezentuj dane wejciowe operacji AND. Wartoci umieszczone na przeciciu si wiersza i kolumny (dla poszczeglnych par wartoci wejciowych) s wynikiem logicznego ANDowania tych dwch wartoci razem. Po angielsku operacja AND : "Jeli pierwszy operand rwna si jeden i drugi operand rwna si jeden ,wtedy wynik rwna si jeden; w przeciwnym wypadku wynik rwna si zero" Jednym wanym faktem godnym odnotowania przy logicznej operacji AND, jest to, ze moesz uy jej do wymuszenia wyniku zero. Jeli jeden z operandw rwna si zero, wynik zawsze jest zero bez wzgldu na drugi operand. W tablicy prawdy powyej, np. wiersz z zerow wartoci wejciow zawiera tylko zera, a kolumna zawierajc zero zawiera wynik zerowy. Odwrotnie, jeli jeden operand zawiera jeden wynik jest dokadnie wartoci drugiego operandu. Ta cecha operacji AND jest bardzo wana, szczeglnie kiedy pracujesz z acuchem bitw i chcesz ustawi pojedynczy bit w acuchu na zero. Zbadamy to zastosowanie logicznej operacji AND w nastpnej sekcji. Logiczna operacja OR jest take operacja na bitach. Jej definicja: 0 OR 0 = 0 0 OR 1 = 1 1 OR 0 = 1 1 OR 1 = 1 Tablica prawdy dla operacji OR przybiera nastpujc form: OR 0 1 0 0 1 1 1 1 Tablica 3: Tablica prawdy OR Potocznie, operacja logiczna OR: "jeli pierwszy operand lub drugi operand (lub oba) maj warto jeden, wynik wynosi jeden, w przeciwnym razie wynik rwna si zero." Jest to rwnie znane jako operacja inclusive-OR. Jeli jeden z operandw operacji logicznej OR rwna si jeden, wynik zawsze wynosi jeden bez wzgldu na warto drugiego operandu. Tak jak w logicznej operacji AND, jest to wana cecha logicznej operacji OR, ktra udowadnia cakowit przydatno podczas pracy z acuchami bitw.(zobacz nastpn sekcj). Odnotujmy, e jest rnica pomidzy t forma operacji logicznej OR a standardowym znaczeniem angielskim. Rozwamy takie zdanie: "Id do sklepu LUB Id do parku". Taka wypowiedz wskazuje, e mwca idzie do sklepu lub do parku, ale nie do obu miejsc naraz. Zatem, angielska wersja logicznego OR jest odrobin rona ni operacja inclusive-OR, rzeczywicie bliej jej do operacji exclusive-OR. Logiczna operacja XOR (exclusive-OR) jest rwnie operacja na bitach. Jej definicja znajduje si poniej: 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Tablica prawdy dla operacji XOR przybiera nastpujc form: XOR 0 1 0 0 1 1 1 0 Tablica 4: Tablica prawdy XOR Operacja logiczna XOR: "jeli pierwszy operand lub drugi operand, ale nie obydwa rwnoczenie, rwnaj si jeden wynik rwna si jeden; w przeciwnym razie wynik rwna si zero" Zauwa, ze operacja exclusive-OR jest blisza angielskiemu znaczeniu sowa "or" ni operacji logicznej OR. Jeli jeden operand operacji logicznej exclusive-OR rwna si jeden, wynik jest zawsze odwrotnoci drugiego operandu; to znaczy ,jeli jeden operand rwna si jeden, wynik rwna si zero jeli drugi operand rwna si jeden, a wynik rwna si jeden jeli drugi operand rwna si zero. Jeli pierwszy operand zawiera zero, wtedy wynik jest dokadnie wartoci drugiego operandu. Ta cecha pozwala na selektywne odwracanie bitw w acuchu bitw. Operacja logiczna NOT jest operacja jedno argumentow (w znaczeniu, e przyjmuje tylko jeden argument): NOT 0=1 NOT 1=0

Tablica prawdy operacji NOT przyjmuje nastpujc form: 0 1 1 0 Tablica 5: Tablica Prawdy NOT NOT

1.6 OPERACJE LOGICZNE NA LICZBACH BINARNYCH I ACUCHACH BITW Jak zostao opisane w poprzedniej sekcji ,funkcje logiczne pracuj tylko z pojedynczymi bitami operandw. Poniewa 80x86 uywa grup 8,16 lub 32 bitw, musimy rozszerzy definicje tych funkcji dotyczce wicej ni dwch bitw. Funkcje logiczne w 80x86 operuj na zasadzie "bit przez bit" .Jeli podano dwie wartoci, funkcje te operuj na bicie zero ustalajc w wyniku bit zero. Operujc na bicie jeden wartoci wejciowych ,ustawiaj w wyniku bit jeden itd. itp. Na przykad, jeli chcesz obliczy logiczne AND z nastpujcych dwch omiobitowych liczb, musisz wykona operacj logicznego AND na kadej kolumnie niezalenie od pozostaych: 1011 0101 1110 1110 ------------1010 0100 Ta forma "bit przez bit" moe by miao zastosowana rwnie dla innych logicznych operacji. Poniewa zdefiniowalimy operacje logiczne pod wzgldem wartoci binarnych, przyjdzie ci duo atwiej wykona operacje logiczne na wartociach binarnych ni na wartociach opartych o inne systemy liczbowe. Zatem jeli chcesz wykonywa operacje logiczne na dwch liczbach heksadecymalnych, przekonwertuj je najpierw na liczby binarne .Ma to zastosowanie do wikszoci podstawowych operacji logicznych na liczbach binarnych (np. AND, OR ,XOR, itd) Umiejtno ustawiania bitw na zero lub jeden, przy uyciu operacji logicznych AND/OR i umiejtno odwracania bitw przy uyciu operacji logicznej XOR jest bardzo wana kiedy pracujemy z acuchami bitw (np. liczbami binarnymi) .Te operacje pozwalaj selektywnie manipulowa pewnymi bitami wewntrz jakiej wartoci podczas gdy pozostawiamy inne bity w spokoju. Na przykad, jeli masz omiobitowa warto "X" i chcesz mie pewno, e bity od czwartego do sidmego bd zawiera zera, moesz logicznie "doda"(AND) warto "X" z binarna wartoci 00001111.Ta operacja logiczna AND, "bit przez bit" ustawi bardziej znaczce cztery bity na zero i pozostawi mniej znaczce cztery bity z "X" bez zmian. Podobnie moesz ustawi mniej znaczce bity z "X" na jeden i odwrci bit numer dwa z "X" ,odpowiednio, przez logiczne ORowanie "X" przez 0000 0001 i logiczne exclusiveORowanie przez 0000 0100.Uycie operacji logicznych AND,OR i XOR do manipulowania acuchami bitw w ten sposb ,jest znany jako maskowanie acucha bitw. Uywamy terminu maskowanie, poniewa moemy uywa pewnych wartoci (jeden dla AND, zero dla OR/XOR) do "zamaskowania" pewnych bitw podczas operacji zmiany bitw zero/jeden lub ich odwracania. 1.7 LICZBY ZE ZNAKIEM I BEZ ZNAKU Jak dotd traktowalimy liczby binarne jako wartoci bez znaku. Liczba binarna ...0000 reprezentowaa zero,...0001 przedstawiaa jeden ,0010 przedstawiaa dwa, tak a do nieskoczonoci. A co z liczbami ujemnymi? Wartoci ze znakiem zostay wspomniane w pierwszej sekcji, gdzie wspomnielimy system uzupeniania do dwch, ale nie omwilimy jak przedstawi liczby ujemne uywajc binarnego systemu liczbowego. To jest wanie to o czym bdzie ta sekcja! Przy przedstawianiu liczb bez znaku przy uyciu binarnego systemu liczbowego mamy ograniczone miejsce na nasze liczby :musza mie skoczon i niezmienn liczb bitw. Tak dugo jak 80x86 pracuje ,nie jest to zbyt due ograniczenie, w kocu 80x86 moe adresowa skoczon liczb bitw. Z naszego punktu widzenia, mamy powane ograniczenie liczby bitw do omiu,16,32 lub jakiej innej, malej liczby bitw. Z niezmienn liczb bitw moemy przedstawi tylko pewna liczb obiektw .Na przykad, przy pomocy omiu bitw moemy przedstawi tylko 256 ronych obiektw. Wartoci ujemne s penoprawnymi obiektami, tak jak liczby dodatnie. Dlatego tez uyjemy kilku, z 256 ronych wartoci do przedstawienia liczb ujemnych. Innymi sowy, musimy uy kilku liczb dodatnich do przedstawienia liczb ujemnych. Aby zrobi to sprawiedliwie przydzielimy poow z moliwych kombinacji dla wartoci ujemnych i poow dla wartoci dodatnich. Moemy wic przedstawi wartoci ujemne jako -128..-1 i wartoci dodatnie jako 0..127 za pomoc pojedynczego bajtu.Za pomoc 16 bitowego sowa moemy przedstawia liczby w zakresie -32,768..+32.767.Przy pomocy 32 bitowego

podwjnego sowa przedstawimy wartoci z zakresu -2,147,483,648..+2,147,483,647.Generalnie,za pomoc n bitw moemy przedstawi warto ze znakiem z zakresu -2(n-1)..+2(n-1)-1. Okay, wic moemy przedstawia wartoci ujemne. Ale ,jak to robimy? C, jest wiele sposobw, ale mikroprocesor 80x86 uywa notacji uzupenienie do dwch .W systemie uzupenienia do dwch najbardziej znaczcy bit jest bitem znaku. Jeli jego warto wynosi zero, wwczas liczba jest dodatnia, jeli jego warto wynosi jeden, wwczas liczba jest ujemna. Przykady: Dla liczby 16-bitowej: 8000h jest liczb ujemn, poniewa bit znaku rwna si jeden 100h jest liczb dodatni poniewa bit znaku rwna si zero 7FFFh jest dodatnia 0FFFFh jest ujemna. 0FFFh jest dodatnia Jeli najbardziej znaczcy bit wynosi zero, wtedy liczba jest dodatnia i jest przechowywana jako standardowa warto binarna. Jeli najbardziej znaczcy bit rwna si jeden, wtedy liczba jest ujemna i jest przechowywana w formie uzupenienia do dwch. Przy konwertowaniu liczby dodatniej na ujemn, uywasz nastpujcego algorytmu: 1) odwracasz wszystkie bity w liczbie np. uywajc logicznej funkcji NOT 2) dodajesz jeden do odwrconego wyniku Na przykad, obliczymy omiobitowy odpowiednik liczby -5: 0000 0101 Pi (binarnie) 1111 1010 Odwracamy wszystkie bity 1111 1011 Dodajemy jeden do otrzymanego wyniku Jeli wemiemy minus pi i wykonamy na niej operacje uzupenienia do dwch, otrzymamy nasz oryginaln warto 000101,tak jak si spodziewalimy: 1111 1011 -5 po uzupenieni do dwch 0000 0100 Odwracamy wszystkie bity 0000 0101 Dodajemy jeden do otrzymanego wyniku (+5) Nastpujcy przykad pokazuje kilka dodatnich i ujemnych 16-bitowych wartoci ze znakiem: 7FFFh +32767, najwiksz 16-bitowa liczba dodatnia 8000h -32768, najmniejsza 16-bitowa liczba ujemna 4000h +16384 Konwersje powyszych liczb do ich ujemnych odpowiednikw (tj. ich negacji) robimy nastpujco: 7FFFh: 0111 1111 1111 1111 +32,767t 1000 0000 0000 0000 Odwrcenie wszystkich bitw (8000h) 1000 0000 0000 0001 Dodanie jedynki (8001h lub -32767t) 8000h: 1000 0000 0000 0000 -32,768t 0111 1111 1111 1111 Odwracamy wszystkie bity (7FFFh) 1000 0000 0000 0000 Dodajemy jedynk (8000h lub -32768t) 4000h: 0100 0000 0000 0000 16,384 1011 1111 1111 1111 Odwracamy wszystkie bity (BFFFh) 1100 0000 0000 0000 Dodajemy jedynk (0C000h lub -16,384t) Odwrcone 8000h zmienio si w 7FFFh.Po dodaniu jedynki uzyskujemy 8000h!Czekaj!Co si tutaj dzieje? -(32,768) rwna si -32,768? Oczywicie nie! .Ale warto + 32,768 nie moe by przedstawiana jako 16 bitowa liczba ze znakiem, wiec nie moemy zanegowa najmniejszej ujemnej wartoci. Jeli sprbujesz takiej operacji, mikroprocesor 80x86 zgosi bd. Dlaczego mamy kopota si takim nieprzyjemnym systemem liczbowym? Dlaczego nie uywa najbardziej znaczcego bitu jako znaku flagi, przechowujc dodatni odpowiednik liczby w pozostaych bitach? Odpowied ley w hardware. Jak si okazuje negowanie ujemnych wartoci jest nuc prac. Z systemem uzupenienia do dwch ,wikszo innych operacji jest tak atwa jak system dwjkowy. Na przykad, przypumy, e chcielibymy wykona dodawanie 5+(-5).Wynik rwna si zero. Rozwamy co si wydarzy, kiedy dodamy te dwie wartoci w systemie uzupenienia do dwch: 000000101 111111011 ------------1 000000000

Skoczylimy z przeniesieniem do 9 bitu i wyzerowanymi pozostaymi bitami .Okazuje si ,e jeli zignorujemy przeniesienie najbardziej znaczcego bitu, dodanie dwch wartoci ze znakiem zawsze przyniesie prawidowe rozwizanie kiedy uyjemy systemu liczbowego uzupenienia do dwch. To oznacza ,e moemy uywa tego samego hardware dla dodawania i odejmowania liczb ze znakiem i bez znaku. To nie mogoby wystpi w przypadku innych systemw liczbowych. Oprcz odpowiedzi na pytania na kocu tego rozdziau, nie musisz wykonywa uzupenienia do dwch rcznie. Mikroprocesor 80x86 dostarcza instrukcje NEG (neguj),ktra wykona te operacje za ciebie. Co wicej ,wszystkie heksadecymalne kalkulatory wykonaj ta operacje poprzez naciniecie klawisza (+/- lub CHS).Niemniej jednak wykonanie uzupenienia do dwch jest atwe a ty ju wiesz jak to zrobi. Zapamitaj raz jeszcze, e interpretacja danych reprezentowanych przez zbir bitw binarnych zaley wycznie od kontekstu. Omiobitowa warto binarna 11000000b moe przedstawia znak IBM/ASCII, moe przedstawia dziesitn warto bez znaku 192,lub dziesitn warto ze znakiem -64,itd.Jako programista, jeste odpowiedzialny za waciwe uywanie tych danych. 1.8 ROZSZERZANIE ZNAKIEM I ROZSZERZENIE ZERAMI Poniewa format uzupenienia do dwch liczb cakowitych ma staa form ,pojawia si may problem. Co si stanie jeli musisz skonwertowa omiobitow warto uzupenieniem do dwch do 16 bitw? Ten problem i jego odwrotno (konwertowanie 16 bitowej wartoci do omiu bitw) moe by realizowane przez rozszerzenie znakiem i operacje cigania.80x86 pracuje ze staa dugoci wartoci ,nawet kiedy pracuje na binarnej liczbie bez znaku. "Rozszerzenie o zero" pozwala ci skonwertowa maa warto bez znaku o duej wartoci bez znaku. Rozwamy warto "-64".Osiem bitw, po uzupenieniu do dwch dla tej wartoci to "0C0h".16 bitowy odpowiednik tej liczby to 0FFC0h.Teraz,rozwazmy warto "+64". Omio- i szesnastobitowa wersja tej wartoci to odpowiednio 40h i 0040h. Rnica midzy omio i szesnastobitow liczb moe by opisana przez zasad:" Jeli liczba jest ujemna, najbardziej znaczcy bajt z liczby 16 bitowej zawiera 0FFh;jeli liczba jest dodatnia, najbardziej znaczcy bajt z 16 bitowej liczby wynosi zero". Rozszerzenie znakiem wartoci jakiej liczby bitw do wikszej liczby bitw jest atwe, skopiuj znak bitu do wszystkich dodatkowych bitw w nowym formacie. Na przykad, rozszerzajc znak liczby omiobitowej do 16 bitowej, po prostu skopiuj sidmy bit z omiobitowej liczby do bitw 8..15 z liczby 16 bitowej. Rozszerzajc znak 16 bitowej liczby do podwjnego sowa, po porostu skopiuj bit 15 do bitw 16..31 z podwjnego sowa. Rozszerzenie znakiem jest wymagane kiedy manipulujemy wartociami ze znakiem o ronych dugociach. Czsto musisz powikszy bajt do wielkoci sowa. Musisz rozszerzy znakiem bajt do wielkoci sowa nim ta operacja bdzie miaa miejsce. Inne operacje (w szczeglnoci ,mnoenie i dzielenie) mog wymaga poszerzenia do 32 bitw. Nie wolno ci rozszerza wartoci bez znaku. Przykady rozszerzenia znakiem: Osiem bitw Szesnacie bitw Trzydzieci dwa bity 80h FF80h FFFFFF80h 28h 0028h 00000028h 9Ah FF9Ah FFFFFF9Ah 7Fh 007Fh 0000007Fh ---1020h 00001020h ---8088h FFFF8088h Do rozszerzenia bajtu bez znaku musisz zastosowa rozszerzenia zerem. Rozszerzanie zerem jest bardzo atwe postaw zero przed najbardziej znaczcy bajt(y) . Na przykad, rozszerzanie zerem wartoci 82h do 16-bitowej,po prostu dodajesz zera do bardziej znaczcego bajtu co daje 0082h. Osiem bitw Szesnacie bitw Trzydzieci dwa bity 80h 0080h 00000080h 28h 0028h 00000028h 9Ah 009Ah 0000009Ah 7Fh 007Fh 0000007Fh ---1020h 00001020h ---8088h 00008088h ciganie znaku, przeksztacajce warto jakiej liczby bitw do identycznej wartoci z mniejsz liczb bitw, jest troszk bardziej dokuczliwe. Rozszerzone znaki nigdy nie zawodz. Majc m-bitow warto ze znakiem moesz zawsze przeksztaci j do n-bitowej liczby (gdzie n >m) uywajc rozszerzenia znakiem .Niestety, majc n-bitow liczb nie zawsze moesz przeksztaci j do m-bitowej liczby jeli m< n. Na przykad, rozwamy warto -448. Jako 16-bitowa heksadecymalna liczba ktra j reprezentuje mamy 0FE40h. Niestety, rozmiar tej liczby jest zbyt duy aby dopasowa ja do wartoci omiobitowej, wiec nie moesz cign znaku do omiu bitw. To jest przykad przepenienia stanu ,ktry zdarza si przy konwersji. Przy stosowaniu cigania znaku jednej wartoci do

innej musisz przypatrzy si najbardziej znaczcym bajt(om),ktre chcesz wyrzuci. Najbardziej znaczce bajty ktre pragniesz usun ,musz zawiera albo zero albo 0FFh.Jesli napotkasz jak inna warto, nie moesz jej skrci bez przepenienia. Ostatecznie, najbardziej znaczcy bit z twojej wartoci kocowej musi odpowiada kademu bitowi ktry usune z liczby. Przykady ( 16 bitw do 8 bitw): FF80h znak nie moe by skrcony do 80h 0040h znak nie moe by skrcony do 40h FE40h znak nie moe by skrcony do 8 bitw 0100h znak nie moe by skrcony do 8 bitw

1.9 PRZESUNICIA I OBROTY Innym zbiorem logicznych operacji ktre maj zastosowanie do acucha bitw s operacje przesunicia i obrotw. Te dwie kategorie mog by dalej rozbite na "przesunicie w lewo", "obrt w lewo", "przesunicie w prawo" i "obrt w prawo". Te operacje okazuj si by niezwykle uyteczne dla programisty asemblerowego. Operacja przesunicia w lewo, przesuwa kady bit w acuchu bitw jedna pozycje w lewo (zobacz rysunek 1.8)

Rysunek 1.8: Operacja przesunicia w lewo Bit zero przesuwa si na pozycje bitu jeden, poprzednia warto bitu jeden przesuwa na pozycje bitu dwa itd. S oczywicie dwa pytania, ktre pojawiaj si w sposb naturalny: "Gdzie zmierza bit zero?" i Gdzie znika bit sidmy?". Do najmniej znaczcego bitu wpisywana jest warto zero, a warto sidmego bitu jest przenoszona podczas tej operacji do znacznika flagi. Zapamitaj, ze przesunicie wartoci w lewo jest tym samym co pomnoenie jej przez jej podstaw potgi. na przykad, przesunicie wartoci dziesitnej jedn pozycj w lewo (dodanie zera z prawej strony) faktycznie mnoy j przez dziesi (podstawa potgi): 1234 SHL 1 = 12340 (SHL 1 = przesunicie w lewo o jedna pozycje) Poniewa podstaw potgi liczby binarnej jest dwa, przesunicie w lewo mnoy j przez dwa. Jeli przesuniemy warto binarn w lewo dwa razy, mnoymy j przez dwa razy (tj. mnoymy j przez cztery).Jeli przesuwamy warto binarn w lewo trzy razy, mnoymy j przez osiem (2*2*2).Generalnie, jeli przesuwamy warto w lewo n razy, mnoymy t warto przez 2n.Operacja przesunicia w prawo pracuje na tej samej zasadzie, z wyjtkiem tego, e przesuwamy dane w przeciwnym kierunku. Bit siedem przesuwamy do bitu sze, bit sze przesuwamy do bitu pitego itd. Podczas przesunicia w prawo, do bitu sidmego wpisujemy 0,a bit zero zostaje przeniesiony .(zobacz rysunek 1.9)

Rysunek 1.9: Operacja przesunicia w prawo Jest jeden problem z przesuniciem w prawo w zwizku z dzieleniem: jak opisano powyej, przesuniecie w prawo jest tylko odpowiednikiem bezznakowego dzielenia przez dwa. Na przykad, jeli chcesz przesun warto bez znaku 254 (0EFh) jedno miejsce w prawo, otrzymasz 127 (07Fh),dokadnie to co chciae osign. Jednak, jeli przesuniesz binarny odpowiednik -2 (0FEh) w prawo o jedn pozycj, otrzymasz 127 (07Fh) ktra nie jest prawidowa. Problem wystpuje poniewa wstawiamy zero do bitu sidmego. Jeli bit sidmy poprzednio zawiera jeden, zmienimy ja z liczby ujemnej na dodatni. Aby stosowa przesunicie w prawo jako operator dzielenia, musimy zdefiniowa trzeci operacj przesunicia: arytmetyczne przesunicie w prawo. Pracuje ona dokadnie tak jak zwyka operacja prz