Thread View: pl.comp.lang.asm
31 messages
31 total messages
Started by Johnny
Thu, 24 Aug 2006 11:17
Neg i carry
Author: Johnny
Date: Thu, 24 Aug 2006 11:17
Date: Thu, 24 Aug 2006 11:17
9 lines
968 bytes
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
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:02
Date: Thu, 24 Aug 2006 12:02
62 lines
2762 bytes
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
Author: Johnny
Date: Thu, 24 Aug 2006 12:18
Date: Thu, 24 Aug 2006 12:18
12 lines
1326 bytes
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
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:18
Date: Thu, 24 Aug 2006 12:18
67 lines
2912 bytes
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
Author: Matuzalem
Date: Thu, 24 Aug 2006 12:36
Date: Thu, 24 Aug 2006 12:36
17 lines
1722 bytes
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
Author: Johnny
Date: Thu, 24 Aug 2006 13:06
Date: Thu, 24 Aug 2006 13:06
21 lines
1666 bytes
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
Author: Matuzalem
Date: Thu, 24 Aug 2006 13:18
Date: Thu, 24 Aug 2006 13:18
10 lines
1500 bytes
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
Author: Bernard
Date: Thu, 24 Aug 2006 16:10
Date: Thu, 24 Aug 2006 16:10
11 lines
1204 bytes
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
Author: Matuzalem
Date: Thu, 24 Aug 2006 16:45
Date: Thu, 24 Aug 2006 16:45
29 lines
2218 bytes
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
Author: Wiktor S.
Date: Thu, 24 Aug 2006 23:30
Date: Thu, 24 Aug 2006 23:30
10 lines
1222 bytes
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
Author: Wiktor S.
Date: Thu, 24 Aug 2006 23:41
Date: Thu, 24 Aug 2006 23:41
36 lines
1968 bytes
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
Author: Johnny
Date: Fri, 25 Aug 2006 06:33
Date: Fri, 25 Aug 2006 06:33
18 lines
1717 bytes
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
Author: Bernard
Date: Fri, 25 Aug 2006 07:15
Date: Fri, 25 Aug 2006 07:15
30 lines
2399 bytes
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
Author: Johnny
Date: Fri, 25 Aug 2006 07:31
Date: Fri, 25 Aug 2006 07:31
6 lines
1300 bytes
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
Author: Matuzalem
Date: Fri, 25 Aug 2006 18:10
Date: Fri, 25 Aug 2006 18:10
27 lines
2531 bytes
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
Author: Wiktor S.
Date: Sat, 26 Aug 2006 21:21
Date: Sat, 26 Aug 2006 21:21
9 lines
1393 bytes
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
Author: Bernard
Date: Mon, 28 Aug 2006 10:21
Date: Mon, 28 Aug 2006 10:21
24 lines
2269 bytes
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
Author: Matuzalem
Date: Mon, 28 Aug 2006 10:34
Date: Mon, 28 Aug 2006 10:34
23 lines
2570 bytes
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
Author: Wiktor S.
Date: Mon, 28 Aug 2006 10:58
Date: Mon, 28 Aug 2006 10:58
40 lines
2777 bytes
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
Author: Matuzalem
Date: Mon, 28 Aug 2006 11:34
Date: Mon, 28 Aug 2006 11:34
67 lines
3722 bytes
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
Author: Analog
Date: Mon, 28 Aug 2006 12:19
Date: Mon, 28 Aug 2006 12:19
10 lines
1170 bytes
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
Author: Wiktor S.
Date: Tue, 29 Aug 2006 09:16
Date: Tue, 29 Aug 2006 09:16
13 lines
1178 bytes
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
Author: Wiktor S.
Date: Tue, 29 Aug 2006 09:18
Date: Tue, 29 Aug 2006 09:18
16 lines
1677 bytes
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
Author: Matuzalem
Date: Tue, 29 Aug 2006 10:22
Date: Tue, 29 Aug 2006 10:22
30 lines
2468 bytes
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
Author: Analog
Date: Tue, 29 Aug 2006 14:59
Date: Tue, 29 Aug 2006 14:59
32 lines
3330 bytes
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
Author: Matuzalem
Date: Tue, 29 Aug 2006 16:06
Date: Tue, 29 Aug 2006 16:06
12 lines
1933 bytes
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
Author: Analog
Date: Tue, 29 Aug 2006 16:25
Date: Tue, 29 Aug 2006 16:25
11 lines
2051 bytes
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
Author: Matuzalem
Date: Tue, 29 Aug 2006 16:56
Date: Tue, 29 Aug 2006 16:56
21 lines
2668 bytes
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
Author: Analog
Date: Tue, 29 Aug 2006 18:22
Date: Tue, 29 Aug 2006 18:22
23 lines
2330 bytes
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
Author: Matuzalem
Date: Tue, 29 Aug 2006 18:34
Date: Tue, 29 Aug 2006 18:34
7 lines
2167 bytes
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
Author: Andrzej Grażyński
Date: Tue, 26 Sep 2006 23:57
Date: Tue, 26 Sep 2006 23:57
9 lines
1198 bytes
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