Ciekaw jestem zefciu, czy Ty, jako bardzo dobry Ziemski programista jesteś w stanie zrozumieć to co pisze Kubuś niżej?
... pytam bo w moim Wszechświecie z którego przybyłem to są matematyczne banały.
http://www.sfinia.fora.pl/forum-kubusia ... tml#217359fiklit napisał(a):
Cytuj:
Zauważmy, że adresy BLOK1 i BLOK2 muszą być różne bowiem jeśli adresy są tożsame:
BLOK1=BLOK2
to instrukcja warunkowa przestanie być instrukcją warunkową.
Moim zdaniem to bzdura i nie kontynuuje dyskusji.
Nie rozumiem co tu jest bzdurą?
1.
Mamy dwa rejestry wewnętrzne mikroprocesora Z80 o nazwach A i B zawierające 8-bitowe liczby binarne.
2.
Mamy wskaźnik przeniesienia CY ustawiany operacją odejmowania:
A-B
CY=1 <=> A<B
CY=0 <=>A>=B
Mamy dwa prościutkie rozkazy mikroprocesora Z80:
Kod:
SUB A,B ;Wykonanie operacji odejmowania A-B z ustawieniem CY jak wyżej
JP C,BLOK1 ;Jeśli CY=1 to skocz do adresu BLOK1
;Inaczej wykonaj poniższy ciąg instrukcji.
;tu musi być CY=0 czyli A>=B
BLOK2:
--------
BLOK1:
--------
Doskonale widać że, dla adresów tożsamych:
BLOK1 = BLOK2
powyższy ciąg instrukcji jest tożsamy z ciągiem poniższym:
Kod:
SUB A,B ;Wykonanie operacji odejmowania A-B z ustawieniem CY jak wyżej
JP BLOK1=BLOK2 ; skok bezwarunkowy do adresu BLOK1=BLOK2
BLOK2:
Co więcej!
Przy zapisie BLOK2 bezpośrednio pod rozkazem JP BLOK1=BLOK2 zbędność rozkazu JP jest oczywistością, czyli program redukuje się do postaci
Kod:
SUB A,B ;Wykonanie operacji odejmowania A-B z ustawieniem CY jak wyżej
Kolejne pytanie?
Co tu robi rozkaz SUB, do czego on jest potrzebny?
Oczywista odpowiedź:
Do NICZEGO!
Nasz program ulega kolejnej redukcji do postaci:
Czyli dla tożsamych adresów BLOK1=BLOK2 nie ma nie tylko instrukcji skoku warunkowego, nie ma TOTALNIE niczego, z naszego „programu” zostało absolutne ZERO!
Wniosek:
Tożsame etykiety w instrukcji warunkowej zapisuje wyłącznie matematyczny żółtodziób.
Oczywiście nie jest prawdą, że najprostszy choćby program komputerowy można napisać bez instrukcji skoku warunkowego.
Dowód:
Zabierzmy z listy rozkazów dowolnego mikroprocesora wszystkie skoki warunkowe typu:
JP C,BLOK2
JP NC,BLOK1
Oczywiście zostaną wówczas wyłącznie rozkazy podstawienia typu:
LD A,B ;Przepisz do rejestru A zawartość rejestru B
plus rozkazy arytmetyczne które nie ustawiają elementarnych wskaźników przeniesienia CY i zera Z bo po co?
… skoro nie dysponujemy instrukcją warunkową?
Przy pomocy takiego „mikroprocesora” nie da się napisać najprostszego pod słońcem programu typu włącz/wyłącz oświetlenie obiektu nocą, gdzie zmienna wejściowa „ciemno” informuje:
ciemno =1 - jest ciemno, zapal światła
ciemno =0 - jest widno wyłącz światła
Jak to zrobić bez instrukcji skoku warunkowego?
Nie da się - to fizycznie niemożliwe!
Często spotykaną sztuczką w języku asemblera jak również w językach wysokiego poziomu jest rozgałęzienie kaskadowe.
Jak działa?
Załóżmy dla uproszczenia następujące wartości stałych symbolicznych:
A0=0
A1=1
A2=2
A3=3
gdzie z prawej strony to kolejne liczby binarne.
+ - spójnik „lub”(+) z naturalnej logiki człowieka
* - spójnik „i”(*) z naturalnej logiki człowieka
if x=A0+A1+A2+A3 then BLOK0 then BLOK1 then BLOK2 then BLOK3 else BLOK4
Tożsamy ciąg instrukcji:
if x=A0 then BLOK0
if x=A1 then BLOK1
if x=A2 then BLOK2
if x=A3 then BLOK3
if ~x =~(A0+A1+A2+A3) then BLOK4
Prawo algebry Boole’a:
~(A0+A1+A2+A3) =~A0*~A1*~A2*~A3
Stąd ostatnią instrukcję można zapisać w postaci tożsamej:
if ~x=~A0*~A1*~A2*~A3 then BLOK4
Jak to działa?
Załóżmy:
x=2
mamy wówczas wartości binarne:
x~~>A0 = x*A0= [2]*[0] =0 - zbiory rozłączne
x~~>A1 = x*A1= [2]*[1] =0
x~~>A2 = x*A2= [2]*[2] =1 - zbiory tożsame
x~~>A3 = x*A3= [2]*[3] =0
Wykonane zostanie rozgałęzienie BLOK2
Ostatnia instrukcja nie zostanie wykonana bo:
if ~x=~(A0+A1+A2+A3) = ~(0+0+1+0) = ~(1) =0
Załóżmy ze x jest spoza przedziału <0,3>:
x=5
mamy wówczas wartości binarne:
x~~>A0 = x*A0= [5]*[0] =0 - zbiory rozłączne
x~~>A1 = x*A1= [5]*[1] =0
x~~>A2 = x*A2= [5]*[2] =0
x~~>A3 = x*A3= [5]*[3] =0
czyli:
Żadne z rozgałęzień nie zostanie wykonane!
Wykonany zostanie ostatni rozkaz:
if ~x=~(A0+A1+A2+A3) = ~(0+0+0+0) = ~(0)=1 then BLOK4
Zapis tożsamy:
if ~x = ~A0*~A1*~A2*~A3 = 1*1*1*1 =1 then BLOK4
Podsumowanie:Doskonale widać, że nie jesteśmy w stanie wyjść poza operator równoważności rodem z algebry Boole’a.
Zawsze zostanie wykonany jeden z dwóch rozkazów A albo B!
A.
n-ty blok (jeden jedyny!) w rozgałęzieniu kaskadowym
albo
B.
Ostatnia instrukcja:
if ~A0*~A1*~A2*~A3 then BLOK4
Tertium non datur (łac. trzeciej możliwości nie ma)cnd