16.05.2015 Views

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

Programowanie w C++ Borland Builder - Wyższa Szkoła Informatyki ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

stanie się 0. Czy można jednakże wyobrazić sobie np.<br />

jednobajtową liczbę dwójkową, która po dodaniu 1 da nam w<br />

rezultacie 0 ? Wydawałoby się, że w dowolnym przypadku wynik<br />

powinien być conajmniej równy 1.<br />

A jednak. Jeśli ograniczymy swoje rozważania do ośmiu bitów<br />

jednego bajtu, może wystąpić taka, absurdalna tylko z pozoru<br />

sytuacja. Jeśli np. dodamy 255 + 1 (dwójkowo 255 = 11111111):<br />

1111 1111 hex FF dec 255<br />

+ 1 + 1 + 1<br />

___________ _____ _____<br />

1 0000 0000 100 256<br />

otrzymamy 1 0000 0000 (hex 100). Dla Twojego PC oznacza to, że w<br />

ośmiobitowym rejestrze pozostanie 0000 0000 , czyli po prostu 0.<br />

Nastąpi natomiast przeniesienie (carry) do dziewiątego (nie<br />

zawsze istniejącego sprzętowo bitu).<br />

Wystąpienie przeniesienia powoduje ustawienie flagi CARRY w<br />

rejestrze FLAGS. Jeśli zignorujemy flagę i będziemy brać pod<br />

uwagę tylko te osiem bitów w rejestrze, okaże się, że<br />

otrzymaliśmy wynik 0000 0000. Krótko mówiąc FF = (-1), ponieważ<br />

FF + 1 = 0.<br />

Aby odwrócić wszystkie bity bajtu, bądź słowa możemy w<br />

asemblerze zastosować instrukcję NOT. Jeśli zawartość rejestru<br />

AX wynosiła np. 0000 1111 0101 0101 (hex 0F55), to instrukcja<br />

NOT AX zmieni ją na 1111 0000 1010 1010 (hex F0AA). Dokładnie<br />

tak samo działa operator bitowy ~_AX w C/<strong>C++</strong>. W zestawie<br />

rozkazów mikroprocesorów rodziny Intel 80x86 jest także<br />

instrukcja NEG, powodująca zamianę znaku liczby (dokonując<br />

konwersji liczby na kod komplementarny). Instrukcja NEG robi to<br />

samo, co NOT, ale po odwróceniu bitów dodaje jeszcze jedynkę.<br />

Jeśli rejestr BX zawierał 0000 0000 0000 0001 (hex 0001), to po<br />

operacji NEG AX zawartość rejestru wyniesie 1111 1111 1111 1111<br />

(hex FFFF).<br />

Zastosujmy praktycznie uzupełnienia dwójkowe przy współdziałaniu<br />

asemblera z <strong>C++</strong>:<br />

[P059.CPP]<br />

#pragma inline<br />

void main()<br />

{<br />

const char *napis = "\nRazem warzyw: $";<br />

int marchewki = -2, pietruszki = 5;<br />

asm {<br />

MOV DX, napis<br />

MOV AH, 9<br />

- 169-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!