🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
31 messages
31 total messages Started by Johnny Thu, 24 Aug 2006 11:17
Neg i carry
#539
Author: Johnny
Date: Thu, 24 Aug 2006 11:17
9 lines
968 bytes
mov ax,80h
neg ax

Dlaczego druga linijka ustawia znacznik carry? Przecież neg to nic
innego jak not ax i add ax,1h. Jeśli w ten sposób zapiszę tą linijkę to
carry nie jest ustawiane.

-- 
Johnny
Re: Neg i carry
#540
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:02
62 lines
2762 bytes
Johnny napisal(a):
> mov ax,80h
> neg ax
>
> Dlaczego druga linijka ustawia znacznik carry? Przeciez neg to nic
> innego jak not ax i add ax,1h. Jesli w ten sposób zapisze ta linijke to
> carry nie jest ustawiane.
>
> --
> Johnny

Polecenie NEG odwraca liczby poprzez konwersje liczby na jej
uzupelnienie dwójkowe.
Dozwolone sa:

NEG reg
NEG mem

Jest to odwrócenie wszystkich bitów w operandzie docelowym i dodanie
1.
I teraz dlaczego ustawia carry?
Operacja NEG ma wplyw na znaczniki:
  - overflow,
  - sign,
  - zero,
  - parity,
  - CARRY,
  - auxiliary carry

A kiedy jest ustawiane carry?
Jesli wynik operacjcji arytmetycznej bez znaku jest zbyt duzy i nie
miesci sie w miejscu docelowym.

Czyli czemu jest ustawiny carry?
Bo wynik operacji nie miesci sie w operandzie docelowym (nie chodzi
tu tylko o ax)
NEG jest to odwrócenie wszystkich bitów:

czyli np. 20d == 14h == 10100b

liczby jest nieskonczenie wiele, wiec tak naprawde 10100b mozna np.
zapisac:

0000 10100b lub 0000 0000 10100b itd.

dalej najpierw not:

not 10100b czyli 1111 1111 1111 1111 1111 1111 1110 1011b (odwrócenie
wszystkich bitów, zauwaz ze to jest "cale" eax, a gdyby to bylo
rax to równiez zostalo by zapelnione w "calosci", bo liczb jest
nieskonczenie wiele).

Juz w tym momencie carry jest ustawione.

No i teraz dodajemy 1:
add 1 czyli 1111 1111 1111 1111 1111 1111 1110 1100b


Mam nadzieje, ze nie namieszalem zbytnio :]

Pozdrawiam
Re: Neg i carry
#542
Author: Johnny
Date: Thu, 24 Aug 2006 12:18
12 lines
1326 bytes
Matuzalem napisał(a):
> dalej najpierw not:
> 
> not 10100b czyli 1111 1111 1111 1111 1111 1111 1110 1011b (odwrócenie
> wszystkich bitów, zauwaz ze to jest "cale" eax, a gdyby to bylo
> rax to równiez zostalo by zapelnione w "calosci", bo liczb jest
> nieskonczenie wiele).

No, nie jestem pewien. Po wywołaniu not, carry nie jest ustawiane.

-- 
Johnny
Re: Neg i carry
#541
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:18
67 lines
2912 bytes
Matuzalem napisal(a):
> Johnny napisal(a):
> > mov ax,80h
> > neg ax
> >
> > Dlaczego druga linijka ustawia znacznik carry? Przeciez neg to nic
> > innego jak not ax i add ax,1h. Jesli w ten sposób zapisze ta linijke to
> > carry nie jest ustawiane.
> >
> > --
> > Johnny
>
> Polecenie NEG odwraca liczby poprzez konwersje liczby na jej
> uzupelnienie dwójkowe.
> Dozwolone sa:
>
> NEG reg
> NEG mem
>
> Jest to odwrócenie wszystkich bitów w operandzie docelowym i dodanie
> 1.
> I teraz dlaczego ustawia carry?
> Operacja NEG ma wplyw na znaczniki:
>   - overflow,
>   - sign,
>   - zero,
>   - parity,
>   - CARRY,
>   - auxiliary carry
>
> A kiedy jest ustawiane carry?
> Jesli wynik operacjcji arytmetycznej bez znaku jest zbyt duzy i nie
> miesci sie w miejscu docelowym.
>
> Czyli czemu jest ustawiny carry?
> Bo wynik operacji nie miesci sie w operandzie docelowym (nie chodzi
> tu tylko o ax)
> NEG jest to odwrócenie wszystkich bitów:
>
> czyli np. 20d == 14h == 10100b
>
> liczby jest nieskonczenie wiele, wiec tak naprawde 10100b mozna np.
> zapisac:
>
> 0000 10100b lub 0000 0000 10100b itd.
>
> dalej najpierw not:
>
> not 10100b czyli 1111 1111 1111 1111 1111 1111 1110 1011b (odwrócenie
> wszystkich bitów, zauwaz ze to jest "cale" eax, a gdyby to bylo
> rax to równiez zostalo by zapelnione w "calosci", bo liczb jest
> nieskonczenie wiele).
>
> Juz w tym momencie carry jest ustawione.
>
> No i teraz dodajemy 1:
> add 1 czyli 1111 1111 1111 1111 1111 1111 1110 1100b
>
>

Jeszcze moze to:
http://pdos.csail.mit.edu/6.828/2005/readings/i386/NEG.htm

> Mam nadzieje, ze nie namieszalem zbytnio :]

 Pozdrawiam
Re: Neg i carry
#543
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:36
17 lines
1722 bytes
Johnny napisal(a):
> Matuzalem napisal(a):
> > dalej najpierw not:
> >
> > not 10100b czyli 1111 1111 1111 1111 1111 1111 1110 1011b (odwrócenie
> > wszystkich bitów, zauwaz ze to jest "cale" eax, a gdyby to bylo
> > rax to równiez zostalo by zapelnione w "calosci", bo liczb jest
> > nieskonczenie wiele).
>
> No, nie jestem pewien. Po wywolaniu not, carry nie jest ustawiane.
>
> --
> Johnny

Bo not ustawia tylko podany przez ciebie zasieng czyli tu ax.
a neg wszystkie bity.
Re: Neg i carry
#544
Author: Johnny
Date: Thu, 24 Aug 2006 13:06
21 lines
1666 bytes
Matuzalem napisał(a):
> Johnny napisal(a):
>> Matuzalem napisal(a):
>>> dalej najpierw not:
>>>
>>> not 10100b czyli 1111 1111 1111 1111 1111 1111 1110 1011b (odwrócenie
>>> wszystkich bitów, zauwaz ze to jest "cale" eax, a gdyby to bylo
>>> rax to równiez zostalo by zapelnione w "calosci", bo liczb jest
>>> nieskonczenie wiele).
>> No, nie jestem pewien. Po wywolaniu not, carry nie jest ustawiane.
>>
>> --
>> Johnny
> 
> Bo not ustawia tylko podany przez ciebie zasieng czyli tu ax.
> a neg wszystkie bity.
> 

Co to znaczy wszystkie bity? Dla neg też definiujesz zasięg, tu: ax.

J.
Re: Neg i carry
#545
Author: Matuzalem
Date: Thu, 24 Aug 2006 13:18
10 lines
1500 bytes
Johnny napisal(a):
> Co to znaczy wszystkie bity? Dla neg tez definiujesz zasieg, tu: ax.
>
> J.

Popatrz na moja pierwsza odpowiedz (liczb jest nieskonczenie
wiele).

Pozdrawiam
Re: Neg i carry
#547
Author: Bernard
Date: Thu, 24 Aug 2006 16:10
11 lines
1204 bytes
Johnny wrote:
> mov ax,80h
> neg ax
> 
> Dlaczego druga linijka ustawia znacznik carry? Przecież neg to nic
> innego jak not ax i add ax,1h. Jeśli w ten sposób zapiszę tą linijkę to
> carry nie jest ustawiane.

Pewnie dlatego, że tak jest zdefiniowana instrukcja w IA32 Programmer's 
Reference. Czytaj dokumenty (nie mylić z wiki itp.) a unikniesz 
niespodzianek.
Re: Neg i carry
#548
Author: Matuzalem
Date: Thu, 24 Aug 2006 16:45
29 lines
2218 bytes
Bernard napisal(a):
> Pewnie dlatego, ze tak jest zdefiniowana instrukcja w IA32 Programmer's
> Reference. Czytaj dokumenty (nie mylic z wiki itp.) a unikniesz
> niespodzianek.

Zgadza sie, ale to 'zdefiniowanie' nie wzielo sie tam bez powodu :)
Tak jak pisalem.
Procesor nie jest taki jak czlowiek, jesli ma zdefiniowane "wszystkie
bity" (negowanie) to wszystkie.
neg najpierw neguje WSZYSTKIE bity, a potem dodaje 1.
Dla nas 27d binarnie to 11011b i kazdy kto zobaczy takie ustawienie
zero-jedynek wie, ze to jakas liczba i po przeliczeniu np. na
dziesietny system da 27d.
Procesor nie 'przetwarza' 11011b. Przeciez nie ma 'zapisane':

11011

tylko:

0000 0000 0000 0000 0000 11011 itp.

a poniewaz ma przetworzyc wszystkie bity - not-em - (a z logicznego
punktu widzenia jest ich nieskonczenie wiele, bo za ich pomoca mozna
zapisac nieskonczona ilosc liczb), i 'pojemnosc' procesora jest
skonczona, to ustawia znacznik carry (przepelnienie), bo nie
pomiesci 'nieskonczonosci' - przynajmniej narazie :)

Pozdrawiam
Re: Neg i carry
#546
Author: Wiktor S.
Date: Thu, 24 Aug 2006 23:30
10 lines
1222 bytes
> Bo not ustawia tylko podany przez ciebie zasieng czyli tu ax.
> a neg wszystkie bity.

Prosciej: Bo not nie ustawia carry. A neg ustawia. Przyjac za prawde 
objawiona, i powiesic w ramce nad lózkiem.

:-)

-- 
Azarien
Re: Neg i carry
#549
Author: Wiktor S.
Date: Thu, 24 Aug 2006 23:41
36 lines
1968 bytes
>> Pewnie dlatego, ze tak jest zdefiniowana instrukcja w IA32
>> Programmer's Reference. Czytaj dokumenty (nie mylic z wiki itp.) a
>> unikniesz niespodzianek.
>
> Zgadza sie, ale to 'zdefiniowanie' nie wzielo sie tam bez powodu :)
> Tak jak pisalem.

Carry jest ustawiane, gdy wynik nie mieści się w operandzie.

dla zobrazowania: not działa na liczbach bez znaku. Zakres 8-bitowej takiej 
liczby to 0..FFh (0..255d)

   not
00     FF
01     FE
02     FD
.       .
.       .
.       .
FD     02
FE     01
FF     00

nigdzie nie wychodzimy poza zakres. carry nie jest ustawiane.

neg działa na liczbach ze znakiem. Zakres 8-bitowej liczby ze znakiem 
to -128..+127; Zapisywana jest w kodzie uzupełnieniowym do 2. Podany przez 
ciebie przykład 80h (czyli 10000000b) w przypadku kodu U2 oznacza 
liczbę -128.

Jeśli chcesz zanegować liczbę -128 w 8-bitowym rejestrze, to liczba dodatnia 
+128 WYCHODZI POZA ZAKRES. Ustawiana jest wtedy flaga carry.


-- 
Azarien
Re: Neg i carry
#550
Author: Johnny
Date: Fri, 25 Aug 2006 06:33
18 lines
1717 bytes
> nigdzie nie wychodzimy poza zakres. carry nie jest ustawiane.
> 
> neg działa na liczbach ze znakiem. Zakres 8-bitowej liczby ze znakiem to
> -128..+127; Zapisywana jest w kodzie uzupełnieniowym do 2. Podany przez
> ciebie przykład 80h (czyli 10000000b) w przypadku kodu U2 oznacza liczbę
> -128.
> 
> Jeśli chcesz zanegować liczbę -128 w 8-bitowym rejestrze, to liczba
> dodatnia +128 WYCHODZI POZA ZAKRES. Ustawiana jest wtedy flaga carry.
> 

Być może się mylę lecz w moim podręczniku napisano, że carry jest
ustawiane dla liczb bez znaku, natomiast dla liczb ze znakiem stosuje
się overflow. Ponadto przypominam, że operandem jest w moim przykładzie
ax czyli 16 bitów.

-- 
Johnny
Re: Neg i carry
#551
Author: Bernard
Date: Fri, 25 Aug 2006 07:15
30 lines
2399 bytes
Johnny wrote:
>> nigdzie nie wychodzimy poza zakres. carry nie jest ustawiane.
>>
>> neg działa na liczbach ze znakiem. Zakres 8-bitowej liczby ze znakiem to
>> -128..+127; Zapisywana jest w kodzie uzupełnieniowym do 2. Podany przez
>> ciebie przykład 80h (czyli 10000000b) w przypadku kodu U2 oznacza liczbę
>> -128.
>>
>> Jeśli chcesz zanegować liczbę -128 w 8-bitowym rejestrze, to liczba
>> dodatnia +128 WYCHODZI POZA ZAKRES. Ustawiana jest wtedy flaga carry.
>>
> 
> Być może się mylę lecz w moim podręczniku napisano, że carry jest
> ustawiane dla liczb bez znaku, natomiast dla liczb ze znakiem stosuje
> się overflow. Ponadto przypominam, że operandem jest w moim przykładzie
> ax czyli 16 bitów.

I to jest dobry powód do wywalenia podręcznika do kosza i czytania IA32 
Programmer's Reference.

Procesor najczęściej nie wie, na jakich liczbach operuje (ze znakiem, 
czy bez). Znaczniki reprezentują różne własności wyniku (np. 
przekroczenie zakresu dla liczb bez znaku lub ze znakiem).

Producent może instrukcję zdefiniować dowolnie, a procesor ma ją wykonać 
zgodnie z definicją. NEG jest zdefiniowana właśnie tak, a nie inaczej 
(rzeczywiście trochę dziwacznie). To nie jest tak, że dany znacznik po 
każdej instrukcji oznacza dokładnie to samo. Po ADD oznacza coś, po NEG 
- coś innego - zgodnie z definicją instrukcji, a nie z domysłami autora 
podręcznika czy programisty.
Re: Neg i carry
#552
Author: Johnny
Date: Fri, 25 Aug 2006 07:31
6 lines
1300 bytes
O! I ta odpowiedź mi wiele wyjaśnia. Podręcznik rzeczywiście momentami
jakby niedomaga, w dodatku korekta wydawnictwa powinna dostać po ... no
słowa dezaprobaty ;-)

-- 
Johnny
Re: Neg i carry
#553
Author: Matuzalem
Date: Fri, 25 Aug 2006 18:10
27 lines
2531 bytes
Bernard napisal(a):
> Procesor najczesciej nie wie, na jakich liczbach operuje (ze znakiem,
> czy bez). Znaczniki reprezentuja rózne wlasnosci wyniku (np.
> przekroczenie zakresu dla liczb bez znaku lub ze znakiem).

Tak jak pisalem :)

> Producent moze instrukcje zdefiniowac dowolnie, a procesor ma ja wykonac
> zgodnie z definicja. NEG jest zdefiniowana wlasnie tak, a nie inaczej
> (rzeczywiscie troche dziwacznie). To nie jest tak, ze dany znacznik po
> kazdej instrukcji oznacza dokladnie to samo. Po ADD oznacza cos, po NEG
> - cos innego - zgodnie z definicja instrukcji, a nie z domyslami autora
> podrecznika czy programisty.

Tylko pamietaj, ze praca procesora jest oparta o pewne aksiomaty (tu
logiczne).
To, ze po ADD, SUB itd. (czy NEG) jest ustawiany pewien znacznik flagi
proceora, jest spowodowane wlasnie tymi aksiomatami.
W wypatku NEG juz opisalem czemu jest ustawiony znacznik CARRY.

Zgadzam sie 100% zawsze lepiej siegnac bezposrednio do zrudla,
czyli "definicji producenta", bo to on "instaluje" wszystkie
zalozenia, definicje, aksiomaty, wyrazenia (w przypadku procesora te
najprostrze).

Pozdrawiam
[ort] Re: Neg i carry
#554
Author: Wiktor S.
Date: Sat, 26 Aug 2006 21:21
9 lines
1393 bytes
> Zgadzam sie 100% zawsze lepiej siegnac bezposrednio do zrudla,
> czyli "definicji producenta", bo to on "instaluje" wszystkie
> zalozenia, definicje, aksiomaty, wyrazenia (w przypadku procesora te
> najprostrze).

aksjomaty, źródła, i najprostsze.

-- 
Azarien
Re: Neg i carry
#555
Author: Bernard
Date: Mon, 28 Aug 2006 10:21
24 lines
2269 bytes
Matuzalem wrote:
> Bernard napisal(a):
>> Procesor najczesciej nie wie, na jakich liczbach operuje (ze znakiem,
>> czy bez). Znaczniki reprezentuja rózne wlasnosci wyniku (np.
>> przekroczenie zakresu dla liczb bez znaku lub ze znakiem).
> 
> Tak jak pisalem :)
> 
>> Producent moze instrukcje zdefiniowac dowolnie, a procesor ma ja wykonac
>> zgodnie z definicja. NEG jest zdefiniowana wlasnie tak, a nie inaczej
>> (rzeczywiscie troche dziwacznie). To nie jest tak, ze dany znacznik po
>> kazdej instrukcji oznacza dokladnie to samo. Po ADD oznacza cos, po NEG
>> - cos innego - zgodnie z definicja instrukcji, a nie z domyslami autora
>> podrecznika czy programisty.
> 
> Tylko pamietaj, ze praca procesora jest oparta o pewne aksiomaty (tu
> logiczne).
> To, ze po ADD, SUB itd. (czy NEG) jest ustawiany pewien znacznik flagi
> proceora, jest spowodowane wlasnie tymi aksiomatami.

He, he... Byłbym w stanie podać parę ciekawych przykładów niespójności w 
ustawianiu znaczników w różnych procesorach, więc z tymi "aksjomatami" 
byłbym ostrożny. Oczywiście NA OGOŁ ustawianiem znaczników rządzą jakieś 
ogólne reguły, ale niemal w każdym procesorze są od tych reguł wyjątki.
Re: Neg i carry
#556
Author: Matuzalem
Date: Mon, 28 Aug 2006 10:34
23 lines
2570 bytes
Bernard napisal(a):
> He, he... Bylbym w stanie podac pare ciekawych przykladów niespójnosci w
> ustawianiu znaczników w róznych procesorach, wiec z tymi "aksjomatami"
> bylbym ostrozny. Oczywiscie NA OGOL ustawianiem znaczników rzadza jakies
> ogólne reguly, ale niemal w kazdym procesorze sa od tych regul wyjatki.

Uwierz mi, jesli twierdzisz, ze sa jakies odchyly to tylko i
wylacznie sa one spowodowane bledami w kodzie, lub
niezdefiniowanymi zachowaniami programu.
Wszystkie aksjomaty implementowane w procesorach, sa restrykcyjnie
przestrzegane.
Gdyby tak nie bylo, to nic by na nich nie chodzilo (lub nie
dzialalo przewidywalnie/poprawnie). Zbyt duzo wyjatków w
"blednie" zaimplementowanych zalozeniach (nawet w jednym)
spowodowaloby chaos. Np. (oczywiscie to wyolbrzymiony przyklad)
"dodawanie" zostalo by zle zaimplementowane. W tedy procesor jest do
wyrzucenia. Ani dodawania, mnozenia, odejmowania itd. nic.
Owszem niektóre abstrakcyjne pojecia moga byc "czasem" róznie
interpretowane, ale jest to spowodowane aktualnym stanem procesora
wiec nadal jest to przewidywalne dzialanie.

Pozdrawiam
Re: Neg i carry
#557
Author: Wiktor S.
Date: Mon, 28 Aug 2006 10:58
40 lines
2777 bytes

Na miłość boską, Matuzalem, przestań psuć kodowanie. Popraw czytnik.

> Uwierz mi, jesli twierdzisz, ze sa jakies odchyly to tylko i
> wylacznie sa one spowodowane bledami w kodzie, lub
> niezdefiniowanymi zachowaniami programu.

Albo ZDEFINIOWANYM zachowaniem odmiennym od tego, które sobie wyobraziłeś 
:-)

> Wszystkie aksjomaty implementowane w procesorach, sa restrykcyjnie
> przestrzegane.
> Gdyby tak nie bylo, to nic by na nich nie chodzilo (lub nie
> dzialalo przewidywalnie/poprawnie).

Chodziłoby to, co byłoby napisane dla takiego procesora, z uwzględnieniem 
wszystkich jego udziwnień.

> Np. (oczywiscie to wyolbrzymiony przyklad)
> "dodawanie" zostalo by zle zaimplementowane. W tedy procesor jest do
> wyrzucenia. Ani dodawania, mnozenia, odejmowania itd. nic.

Otwórz trochę umysł. Procesor wcale NIE MUSI mieć dodawania (albo dowolnej 
innej instrukcji). Ani NIE MUSI mieć nawet jednostki arytmetycznej.

> Owszem niektóre abstrakcyjne pojecia moga byc "czasem" róznie
> interpretowane, ale jest to spowodowane aktualnym stanem procesora
> wiec nadal jest to przewidywalne dzialanie.


Nikt nie mówi o "zepsuciu" dodawania, a o okoliczności ustawiania flag typu 
carry czy overflow. Tu rzeczywiście, w szególnych przypadkach różne 
procesory mogą się inaczej zachowywać. Nikt twórcom procesora nie narzuca 
DOKŁADNEGO ich działania. Ważne tylko, żeby to działanie opisali w 
dokumentacji.


-- 
Azarien
Re: Neg i carry
#558
Author: Matuzalem
Date: Mon, 28 Aug 2006 11:34
67 lines
3722 bytes
Wiktor S. napisał(a):
> Na miłość boską, Matuzalem, przestań psuć kodowanie. Popraw czytnik.

Miłość którą? :)
Uwielbiam psuć, to moje drugie hobby... :P

> > Uwierz mi, jesli twierdzisz, ze sa jakies odchyly to tylko i
> > wylacznie sa one spowodowane bledami w kodzie, lub
> > niezdefiniowanymi zachowaniami programu.

> Albo ZDEFINIOWANYM zachowaniem odmiennym od tego, które sobie wyobraziłeś
> :-)

Czyli NIE zdefiniowane zachowanie (to może "zaimplementujemy" paradoks
russela ?, fajnie :) )

> > Wszystkie aksjomaty implementowane w procesorach, sa restrykcyjnie
> > przestrzegane.
> > Gdyby tak nie bylo, to nic by na nich nie chodzilo (lub nie
> > dzialalo przewidywalnie/poprawnie).
>
> Chodziłoby to, co byłoby napisane dla takiego procesora, z uwzględnieniem
> wszystkich jego udziwnień.

Tylko żeby nie przesadzić bo jeszcze "wyjdzie" nam ten procek i go
nie dogonimy :P

> > Np. (oczywiscie to wyolbrzymiony przyklad)
> > "dodawanie" zostalo by zle zaimplementowane. W tedy procesor jest do
> > wyrzucenia. Ani dodawania, mnozenia, odejmowania itd. nic.
>
> Otwórz trochę umysł. Procesor wcale NIE MUSI mieć dodawania (albo dowolnej
> innej instrukcji). Ani NIE MUSI mieć nawet jednostki arytmetycznej.

Free your mind, I'll try...

> > Owszem niektóre abstrakcyjne pojecia moga byc "czasem" róznie
> > interpretowane, ale jest to spowodowane aktualnym stanem procesora
> > wiec nadal jest to przewidywalne dzialanie.
>
>
> Nikt nie mówi o "zepsuciu" dodawania, a o okoliczności ustawiania flag typu
> carry czy overflow. Tu rzeczywiście, w szególnych przypadkach różne
> procesory mogą się inaczej zachowywać. Nikt twórcom procesora nie narzuca
> DOKŁADNEGO ich działania. Ważne tylko, żeby to działanie opisali w
> dokumentacji.
>
>
> --
> Azarien

Super skoro - powiedzmy jest te nieszczęsne dodawanie - to inne
zachowanie jest wskazane, prawda?

np.

mov ax, 8
add ax, 2
; o ax zawiera 6, odejmowanie?
;...

Kto tu pisze o sposobie implementacji, niech to nawet sadzą razem z
pomidorami jeśli będzie - przykładowo - dobrze dodawać to miłych
upraw :P :) (+)

Pozdrawiam
Re: Neg i carry
#567
Author: Analog
Date: Mon, 28 Aug 2006 12:19
10 lines
1170 bytes
> mov ax,80h
> neg ax
> 
> Dlaczego druga linijka ustawia znacznik carry? Przecież neg to nic
> innego jak not ax i add ax,1h. Jeśli w ten sposób zapiszę tą linijkę to
> carry nie jest ustawiane.

Bo   neg R =  0 - R  ?? (czyli sub 0, R )
-- 
TS
Re: Neg i carry
#568
Author: Wiktor S.
Date: Tue, 29 Aug 2006 09:16
13 lines
1178 bytes
>> Dlaczego druga linijka ustawia znacznik carry? Przecież neg to nic
>> innego jak not ax i add ax,1h. Jeśli w ten sposób zapiszę tą linijkę
>> to carry nie jest ustawiane.
>
> Bo   neg R =  0 - R  ?? (czyli sub 0, R )

O. Nareszcie ktoś mądry.

:-)


-- 
Azarien
Re: Neg i carry
#559
Author: Wiktor S.
Date: Tue, 29 Aug 2006 09:18
16 lines
1677 bytes
> Super skoro - powiedzmy jest te nieszczęsne dodawanie - to inne
> zachowanie jest wskazane, prawda?
>
> np.
>
> mov ax, 8
> add ax, 2
> ; o ax zawiera 6, odejmowanie?
> ;...

Czyli twórca asemblera nazwał sobie odejmowanie mnemonikiem "add". Trochę to 
dziwaczne z jego strony, i mylące. Ale jeszcze nic nie mówi o samym procku.


-- 
Azarien
Re: Neg i carry
#560
Author: Matuzalem
Date: Tue, 29 Aug 2006 10:22
30 lines
2468 bytes
Wiktor S. napisał(a):
> > Super skoro - powiedzmy jest te nieszczęsne dodawanie - to inne
> > zachowanie jest wskazane, prawda?
> >
> > np.
> >
> > mov ax, 8
> > add ax, 2
> > ; o ax zawiera 6, odejmowanie?
> > ;...
>
> Czyli twórca asemblera nazwał sobie odejmowanie mnemonikiem "add". Trochę to
> dziwaczne z jego strony, i mylące. Ale jeszcze nic nie mówi o samym procku.

My się Panie Wiktor nie rozumiemy... jak Pan sam napisał:
"Otwórz trochę umysł. Procesor wcale NIE MUSI mieć dodawania (albo
dowolnej innej instrukcji). Ani NIE MUSI mieć nawet jednostki
arytmetycznej."

Jeśli coś ma dodawać to niech dodaje.

Tak NEG to jest "negowanie" wyrażenia. Ale to co zostało napisane:
0 - R
Nie tłumaczy czemu jest ustawione CARRY. Tu chodzi o bity, jak
wszędzie, zresztą już pisałem :]

Miłego dnia życzę... :)

Pozdrawiam
Re: Neg i carry
#561
Author: Analog
Date: Tue, 29 Aug 2006 14:59
32 lines
3330 bytes
Matuzalem:
> Tak NEG to jest "negowanie" wyrażenia. Ale to co zostało napisane:
> 0 - R
> Nie tłumaczy czemu jest ustawione CARRY. Tu chodzi o bity, jak
> wszędzie, zresztą już pisałem :]

Jak nie tlumaczy ? Przeciez chyba logiczne jest ze procesor nie
ma osobnej jednostki do "negowania" tlyko zwykle wykorzystuje ALU.
NEG R to dla niego przeslanie zera do reg ALU (lub wyzerowanie w inny sposob)
i odejcie zawartosci wskazanego rejestru. Flagi ustawia tak jak przy odejmowaniu, bo to de facto
_jest_ odejmowanie (a ktore flagi i jak sa ustawiane podczas odejmowania - to chyba jest jasne).
Taka jest geneza tego rozkazu. Skrocona/szybsza wersja sub 0,R .
Tak bylo kiedys i pewnie podobnie jest dzis, mimo stosowania mikrokodow i inych technik
dazy sie do tego by zachowana byla kompatybilnosc i rozkazy dzialaly podobnie.
Wszystko oczywiscie zalezy od typu procesora, i tak: z80/IA32/68k/ARM dzialaja w ten sposob,
natomiast cala rodzina SuperH (renesans) nie zmienia carry(T) przy NEG.

Rozkazy cpu nie sa robione ot, tak dla przyjemnosci. Sa zwykle konsekwencja zastosowanych rozwiazan
wewnatrz cpu. Jesli ktos ich nie zna lub nie chce znac - niech poprzestanie na wiedzy ze dany rozkaz
ustawia odpowiednio flagi. Jak chce wnikac glebiej - tzreba zobaczyc jak i dalczego to dziala.
Niestety, poprzez pewne uproszczenia i bledy nie wszystko jest logiczne, ale wszystko jest przewidywalne.

Dobrym rozwiazaniem jest przeanalizowanie kodu zrodlowego (dzialajacego)emulatora/symulatora cpu. Czasami
pare spraw zobaczymy w zupelnie innym swietle.

Caly problem jest podobny do "paramedycznego" pytania :
"Dlaczego jak wbijam gwozdzia nad lewym uchem to paralizuje mi prawa reke a nie lewa ?"
Nie ma sensu odpowiadac ze gwozdz wydluza sie w czaszce i uderza znienacka od prawej, tylko
niestety trzeba liznac nuerologii/anatomii :)

-- 
TS
Re: Neg i carry
#562
Author: Matuzalem
Date: Tue, 29 Aug 2006 16:06
12 lines
1933 bytes
Analog napisal(a):
> Taka jest geneza tego rozkazu. Skrocona/szybsza wersja sub 0,R

Wiec skompiluj mi to:

mov ax, 8
sub 0, ax

A potem powiedz na jakim kompilatorze to zrobiles...

Pozdrawiam
Re: Neg i carry
#563
Author: Analog
Date: Tue, 29 Aug 2006 16:25
11 lines
2051 bytes
>>Taka jest geneza tego rozkazu. Skrocona/szybsza wersja sub 0,R
Pisalem ogolnie o NEG, nie o  konkretnej implementacji (dlatego wymeinilem kilka roznych
rozwiazan, wlaczajac odmienne podejscei Hitachi).

Jak latwo zauwazyc to powyzsze to pseudokod, pozwalajacy _zrozumiec_  dzialanie rozkazu.

Wiadomo ze IA32 i podobne wymuszaja bardziej skomplikowane rozwiazania
(uzycie rejestru (czyli ewentualne przechowanie / odtworzenie jego zawartosci),
  wyzerowanie go , odejmowanie  itp).
-- 
TS
Re: Neg i carry
#564
Author: Matuzalem
Date: Tue, 29 Aug 2006 16:56
21 lines
2668 bytes
Analog napisał(a):
> >>Taka jest geneza tego rozkazu. Skrocona/szybsza wersja sub 0,R
> Pisalem ogolnie o NEG, nie o  konkretnej implementacji (dlatego wymeinilem kilka roznych
> rozwiazan, wlaczajac odmienne podejscei Hitachi).
>
> Jak latwo zauwazyc to powyzsze to pseudokod, pozwalajacy _zrozumiec_  dzialanie rozkazu.
>
> Wiadomo ze IA32 i podobne wymuszaja bardziej skomplikowane rozwiazania
> (uzycie rejestru (czyli ewentualne przechowanie / odtworzenie jego zawartosci),
>   wyzerowanie go , odejmowanie  itp).
> --
> TS

Przykro mi, ale jestem konkretny, więc i wszystko "biorę" konkretnie.
W ASM nie ma nic "pseudo-", zresztą jak w całej matematyce (no prawie
całej, mam tu na myśli np. teorie mnogości :P )
ASM to konkretny język: coś jest, albo nie ma, tyle... NEG to NEG, a
SUB 0, Xx to bzdura. :)

Pozdrawiam
Re: Neg i carry
#565
Author: Analog
Date: Tue, 29 Aug 2006 18:22
23 lines
2330 bytes
Matuzalem:
> W ASM nie ma nic "pseudo-", zresztą jak w całej matematyce (no prawie
> całej, mam tu na myśli np. teorie mnogości :P )
Hmm. Dziwne. Bo mnie uczono podstaw assemblera  i budowy procesora na pseudojezyku i wirtualnym
cpu. Konkretne implementacje byly pozniej.
Co do tego ma teoria mnogosci ? To nie pl.sci.matematyka
> ASM to konkretny język: coś jest, albo nie ma, tyle... NEG to NEG, a
> SUB 0, Xx to bzdura. :)
Jak pisalem - chodzi o idee.
Nie ma znaczenia jaka implementacje sie wybierze.

xor ax,ax
sub ax,reg

czy

rsbs r3,r3,#0

lub cos zupelnie innego. Bo nie w tym lezy sendo sprawy.
Czepiac sie mozna o wszystko. Tylko po co ?

-- 
TS
Re: Neg i carry
#566
Author: Matuzalem
Date: Tue, 29 Aug 2006 18:34
7 lines
2167 bytes
Analog napisał(a):
> Czepiac sie mozna o wszystko. Tylko po co ?

Właśnie... po co ? (i to jest konkretne) :]

Pozdrawiam
Re: Neg i carry
#569
Author: Andrzej Grażyński
Date: Tue, 26 Sep 2006 23:57
9 lines
1198 bytes
Johnny napisał(a):
> mov ax,80h
> neg ax
> 
> Dlaczego druga linijka ustawia znacznik carry? Przecież neg to nic
> innego jak not ax i add ax,1h. Jeśli w ten sposób zapiszę tą linijkę to
> carry nie jest ustawiane.
> 
neg ustawia carry wtedy i tylko wtedy, gdy argument jest niezerowy
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads