Uwagi o małych liczbach całkowitych i -65536

  1. Przez małą liczbę całkowitą n rozumiemy liczbę całkowitą z zakresu od -65535 do 65535. Sposób przechowywania tych liczb jest opisany w procedurze 'STACK-BC'. Zwróć uwagę na to, że instrukcja dołączana do komputera zawiera błąd w twierdzeniu, iż bajty trzeci i czwarty zawierają wartość n plus 131072, jeśli n jest ujemne. Ponieważ n jest wtedy w zakresie od -1 do -65535, to te dwa bajty mogą jedynie zawierać n plus 131072, jeśli będzie ono wzięte modulo 65536, tj. zawierają one n plus 65536. Instrukcja plecie bzdury. Prawdą jest to, że nie jest to prawdziwa postać uzupełnienia do dwóch (jak w innych okolicznościach mogłoby nią być n plus 131072). Tutaj ta sama liczba może odnosić się do dwóch różnych liczb w zależności od bajtu znaku: np. 00 01 odpowiada 1, jeśli bajtem znakowym jest 00, a dla bajtu znakowego FF będzie to liczba -65535; Podobnie FF FF odpowiada wartości 65535 przy bajcie znakowym równym 00 i -1 dla bajtu znakowego FF.
  2. Przyjęcie, że liczby ujemne mają nadaną specjalną postać 'uzupełnienia do dwóch', powoduje, że główną zaletą tej metody przechowywania liczb jest to, że są one gotowe do 'krótkiego dodawania' bez dalszych konwersji na postać uzupełnieniową do dwóch. Zostają one po prostu pobrane i przekazane bezpośrednio procedurze dodawania.  Lecz przy mnożeniu muszą być pobierane przez INT-FETCH, a następnie zapisywane przez INT-STORE.  Procedury te dokonują konwersji na postać uzupełnienia do dwóch przy pobieraniu i zapisie tych liczb. Wywołania INT-STORE są wykonywane z 'mnożenia' (po 'krótkim mnożeniu'), z 'obcinania' (po utworzeniu małej liczby całkowitej z zakresu -65535 do 65535 włącznie), ze 'zmiany znaku'/'abs' dla 'przypadku całkowitego' oraz z 'sgn' do zapisania 1 lub -1. Wywołania INT-FETCH następują z PRINT-FP do pobrania części całkowitej liczby, gdy jest ona 'mała', dwukrotnie z 'mnożenia' do pobrania dwóch 'małych liczb całkowitych', z RE-STACK do pobrania 'małej liczby całkowitej' do ponownego umieszczenia na stosie, ze 'zmiany znaku'/'abs' do pobrania liczby w celu jej przetworzenia oraz z FP-TO-BC w celu pobrania liczby całkowitej do umieszczenia w parze rejestrów BC.

Liczba -65536

  1. Liczba -65536 może zmieścić się w formacie 'małych liczb całkowitych' jako 00 FF 00 00 00. Jest ona wtedy 'liczbą graniczną', która pojawia się, gdy konwersja na postać uzupełnieniową przepełnia się (porównaj wartość szesnastkową 80 w prostym systemie jednobajtowym lub 7-mio bitowym, tj. -128 dziesiętnie, które przy zamianie na postać uzupełnienia do dwóch wciąż daje 80 szesnastkowo, czyli -128 dziesiętnie, ponieważ liczba dodatnia 128 nie mieści się w tym systemie).
  2. Pewna świadomość tych faktów mogła zainspirować poronioną próbę tworzenia 00 FF 00 00 00 w 'obcinaniu'. Jest ona poroniona, ponieważ nie potrafi nawet przetrwać procedury INT, której częścią jest 'obcinanie'. Po prostu prowadzi do błędu objawiającego się tym, że INT (-65536) daje wartość równą -1.
  3. Lecz głównym błędem jest to, iż pozwolono, aby liczba ta powstała z 'krótkiego dodawania' dwóch mniejszych ujemnych liczb całkowitych, a następnie umieszczona na stosie jako 00 FF 00 00 00. System nie potrafi poradzić sobie z taką liczbą. Rozwiązaniem zaproponowanym w 'dodawaniu' jest natychmiastowe utworzenie pełnej, pięciobajtowej postaci zmiennoprzecinkowej; tj. najpierw wykonanie testu na tą wartość gdzieś w okolicy bajtu 3032 w sposób następujący:
3032           PUSH AF                  Zapamiętaj bajt znaku w A.
3033           INC  A                   Zmień FF w A na 00.
3034           OR   E                   Sprawdź teraz wszystkie trzy bajty na zero.
3035           OR   D
3036           JR   NZ,3040,ADD-STORE   Skocz, jeśli nie -65536.
3038           POP  AF                  Wyczyść stos.
3039           LD   (HL),+80            Wprowadź szesnastkowo 80 do drugiego bajtu.
303B           DEC  HL                  Wskaż na pierwszy bajt.
303C           LD   (HL),+91            Umieść szesnastkowo 91 w pierwszym bajcie.
303E           JR   3049,ADD-RSTOR      Skocz, aby ustawić wskaźnik i wyjść.
3040 ADD-STORE POP  AF                  Odtwórz bajt znaku w A.
3041           LD   (HL),A              Umieść go na stosie.
3042           INC  HL                  Wskaż następną komórkę.
3043           LD   (HL),E              Zapisz młodszy bajt wyniku.
3044           INC  HL                  Wskaż następną komórkę.
3045           LD   (HL),D              Zapisz starszy bajt wyniku.
3046           DEC  HL                  Przesuń wskaźnik do tyłu, aby
3047           DEC  HL                  adresował pierwszy bajt wyniku.
3048           DEC  HL
3049 ADD-RSTOR POP  DE                  Odtwórz STKEND w DE.
304A           RET                      Skończone. 
  1. Powyższa poprawka (tj. 15 dodatkowych bajtów) z pominięciem bajtów od 3223 do 323E włącznie w 'obcinaniu' powinna rozwiązać te problemy. Byłoby miło najpierw ją przetestować. Wywołania INT-STORE nie powinny prowadzić do umieszczania na stosie 00 FF 00 00 00. W 'mnożeniu' liczba ta doprowadzi do przepełnienia, jeśli się pojawi, ponieważ 65536 spowoduje ustawienie znacznika przeniesienia; zatem będzie użyte 'długie mnożenie'. Jak wskazano przy adresie 30E5, te 5 bajtów, które tam się rozpoczyna, mogłoby zostać usunięte, jeśli by zastosowano powyższą poprawkę. 'Zmiana znaku' unika umieszczania na stosie 00 FF 00 00 00 przez odrębne zajęcie się zerem i zwrócenie go bez zmiany. Obcinanie zajmuje się oddzielnie -65536, jak zanotowano powyżej. SGN zapisuje na stos tylko 1 lub -1.


List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.