Thread View: pl.comp.lang.asm
26 messages
26 total messages
Started by mikezum
Fri, 01 Dec 2006 20:16
string reverse
Author: mikezum
Date: Fri, 01 Dec 2006 20:16
Date: Fri, 01 Dec 2006 20:16
12 lines
1304 bytes
1304 bytes
chcialbym przekonwertowac liczbe z postaci intelowskiej do zwyklego stringa, czyli normalnie jest tak a:int64 a:=1 rzutuje na stringa - czyli jest tak "$01$00$00$00$00$00$00$00" a chcialbym zeby bylo tak "$00$00$00$00$00$00$00$01" jak to zrobic bardzo szybko ( bez kopiowania bajt po bajcie), bo kopiowanie pamieci ztcw odbywa sie dla pierwszego i drugiego operandu w ta sama strone liczbe jako przyklad podalem 8 bajtowa ( zalezy jaki kompilator :- takze nie czepiac sie)ale liczba moze byc naprawde duza naprzyklad 256 bajtow
Re: string reverse
Author: Wiktor S.
Date: Sat, 02 Dec 2006 10:00
Date: Sat, 02 Dec 2006 10:00
14 lines
1230 bytes
1230 bytes
> chcialbym przekonwertowac liczbe z postaci intelowskiej > do zwyklego stringa, czyli normalnie jest tak > a:int64 > a:=1 > rzutuje na stringa - czyli jest tak > "$01$00$00$00$00$00$00$00" ty cos kombinujesz. od kiedy to ot tak sobie mozna int64 rzutowac na stringa? albo: jak to robisz? -- Azarien
Re: string reverse
Author: Lopez
Date: Sat, 02 Dec 2006 10:38
Date: Sat, 02 Dec 2006 10:38
23 lines
1522 bytes
1522 bytes
Wiktor S. wrote: >> chcialbym przekonwertowac liczbe z postaci intelowskiej >> do zwyklego stringa, czyli normalnie jest tak >> a:int64 >> a:=1 >> rzutuje na stringa - czyli jest tak >> "$01$00$00$00$00$00$00$00" > > ty cos kombinujesz. od kiedy to ot tak sobie mozna int64 rzutowac na > stringa? > > albo: jak to robisz? > Przecierz w asemblerze nie ma rzutowania, wydaje mi sie ze to taki 'skrot myslowy'. Poczekajmy az OP doprecyzuje czy chodzi mu o zmiane kolejnosci bajtow, czy cos z pogranicza endianowosci, czy tez jeszcze cos innego. -- Pozdrawiam Lopez
Re: string reverse
Author: mikezum
Date: Mon, 04 Dec 2006 19:46
Date: Mon, 04 Dec 2006 19:46
62 lines
2519 bytes
2519 bytes
> Przecierz w asemblerze nie ma rzutowania,
> wydaje mi sie ze to taki 'skrot myslowy'.
> Poczekajmy az OP doprecyzuje czy chodzi mu
> o zmiane kolejnosci bajtow, czy cos z pogranicza
> endianowosci, czy tez jeszcze cos innego.
Panowie, a czy ktos powiedzial, ze ja pisze tylko w czystym assemblerze ?
To po pierwsze :)
Rzutowanie, czyli traktowanie liczby zapisanej w postaci intelowskiej na
postac "zwykla" cokolwiek mialoby to oznaczac
Z tym sobie juz powradzilem poradzilem
procedure ValueToValueIntel(var BufferIn;var BufferOut;const
BufferLen:integer);
var
pBufferIn:pByte;
pBufferOut:pByte;
begin
If BufferLen =0 then exit;
pBufferIn:=@BufferIn;
pBufferOut:=@BufferOut;
Inc(pBufferOut,BufferLen-1);
asm
PUSH EAX
PUSH EBX
PUSH ECX
MOV ECX,BufferLen
LEA EBX,pBufferIn
MOV EBX,[EBX]
LEA EDX,pBufferOut
MOV EDX,[EDX]
@@Loop:
MOV EAX,[EBX]
MOV [EDX-3],EAX
inc EBX
inc EBX
inc EBX
inc EBX
DEC EDX
DEC EDX
DEC EDX
DEC EDX
DEC ECX
DEC ECX
DEC ECX
DEC ECX
JNZ @@Loop
POP ECX
POP EBX
POP EAX
end;
end;
Oczywiscie dla uproszczenia liczby przesylane beda 8 bajtowe czyli int64
Nie wiem tylko czy lepiej dac cztery razy inc czy raz add ( coi bedzie
szybsze) ?
Druga sprawa, czy ktos wie dlaczego dwie instrukcje czyli bsr i bsf zwracaj
a ten sam wynik ???
MOV EAX, 1
bsr EBX,EAX // EBX =7 przeciez to jest Bit Scan Reverse ???!!
MOV EAX, 1
bsf EBX,EAX // EBX =7 przeciez to jest Bit Scan Forward ???!!
????
Re: string reverse
Author: mikezum
Date: Mon, 04 Dec 2006 19:49
Date: Mon, 04 Dec 2006 19:49
16 lines
1396 bytes
1396 bytes
On Mon, 4 Dec 2006 20:46:04 +0100, mikezum wrote: > MOV EAX, 1 > bsr EBX,EAX // EBX =7 przeciez to jest Bit Scan Reverse ???!! > > MOV EAX, 1 > bsf EBX,EAX // EBX =7 przeciez to jest Bit Scan Forward ???!! > ???? soory nie mialobyc eax,1 tylko eax,128 MOV EAX, 128 bsr EBX,EAX // EBX =7 przeciez to jest Bit Scan Reverse ???!! MOV EAX, 128 bsf EBX,EAX // EBX =7 przeciez to jest Bit Scan Forward ???!! ????
Re: string reverse
Author: Michal Schulz
Date: Mon, 04 Dec 2006 20:41
Date: Mon, 04 Dec 2006 20:41
29 lines
1707 bytes
1707 bytes
mikezum wrote: > Nie wiem tylko czy lepiej dac cztery razy inc czy raz add ( coi bedzie > szybsze) ? Add bedzie szybsze > Druga sprawa, czy ktos wie dlaczego dwie instrukcje czyli bsr i bsf > zwracaj a ten sam wynik ??? > MOV EAX, 128 > bsr EBX,EAX // EBX =7 przeciez to jest Bit Scan Reverse ???!! > > MOV EAX, 1 > bsf EBX,EAX // EBX =7 przeciez to jest Bit Scan Forward ???!! > ???? Obie podaja numer pierwszego napotkanego bitu rownego 1. Jedna instrukcja skanuje operand od najstarszego bitu do najmlodszego, a druga odwrotnie. W twoim wypadku EAX = 00000000000000000000000010000000b Innymi slowy, niezaleznie z ktorej strony skanujesz EAX, bit numer 7 bedzie pierwszym napotkanym bitem rownym 1 wystarczy, czy bardziej po ludzku napisac? -- Michal Schulz
Re: string reverse
Author: Bernard
Date: Tue, 05 Dec 2006 12:44
Date: Tue, 05 Dec 2006 12:44
77 lines
3047 bytes
3047 bytes
mikezum wrote: >> Przecierz w asemblerze nie ma rzutowania, >> wydaje mi sie ze to taki 'skrot myslowy'. >> Poczekajmy az OP doprecyzuje czy chodzi mu >> o zmiane kolejnosci bajtow, czy cos z pogranicza >> endianowosci, czy tez jeszcze cos innego. > Panowie, a czy ktos powiedzial, ze ja pisze tylko w czystym assemblerze ? > To po pierwsze :) > Rzutowanie, czyli traktowanie liczby zapisanej w postaci intelowskiej na > postac "zwykla" cokolwiek mialoby to oznaczac Możesz zdefiniować pojęcia "postać intelowska" i "postać zwykła"? > Z tym sobie juz powradzilem poradzilem > procedure ValueToValueIntel(var BufferIn;var BufferOut;const > BufferLen:integer); Czemu var w parametrach? > var > pBufferIn:pByte; > pBufferOut:pByte; > begin > If BufferLen =0 then exit; > pBufferIn:=@BufferIn; > pBufferOut:=@BufferOut; > Inc(pBufferOut,BufferLen-1); > asm > PUSH EAX > PUSH EBX > PUSH ECX > MOV ECX,BufferLen > LEA EBX,pBufferIn > MOV EBX,[EBX] > LEA EDX,pBufferOut > MOV EDX,[EDX] > @@Loop: > > MOV EAX,[EBX] > MOV [EDX-3],EAX > inc EBX > inc EBX > inc EBX > inc EBX > DEC EDX > DEC EDX > DEC EDX > DEC EDX > DEC ECX > DEC ECX > DEC ECX > DEC ECX > JNZ @@Loop > POP ECX > POP EBX > POP EAX > end; > end; > Oczywiscie dla uproszczenia liczby przesylane beda 8 bajtowe czyli int64 Oczywiście Twój kod nie działa tak, jak sobie wyobrażasz, tzn. nie zmienia kolejności bajtów i w dodatku zamazuje inne dane. > Nie wiem tylko czy lepiej dac cztery razy inc czy raz add ( coi bedzie > szybsze) ? Dodawanie i odejmowanie. Jedna instrukcja będzie tutaj szybsza niż cztery. > Druga sprawa, czy ktos wie dlaczego dwie instrukcje czyli bsr i bsf zwracaj > a ten sam wynik ??? > MOV EAX, 1 > bsr EBX,EAX // EBX =7 przeciez to jest Bit Scan Reverse ???!! > > MOV EAX, 1 > bsf EBX,EAX // EBX =7 przeciez to jest Bit Scan Forward ???!! Pewnie dlatego, że tak powinno być zgodnie z definicją tych instrukcji.
Re: string reverse
Author: Bartek Dajewski
Date: Tue, 05 Dec 2006 13:29
Date: Tue, 05 Dec 2006 13:29
89 lines
3067 bytes
3067 bytes
Czesc
Uzytkownik "mikezum" <noname@poczta.onet.pl> napisal w wiadomosci
news:8j3qqhx2oh2t.16ahj7wfz15t2$.dlg@40tude.net...
> chcialbym przekonwertowac liczbe z postaci intelowskiej
> do zwyklego stringa, czyli normalnie jest tak
> a:int64
> a:=1
> rzutuje na stringa - czyli jest tak
> "$01$00$00$00$00$00$00$00"
> a chcialbym zeby bylo tak
> "$00$00$00$00$00$00$00$01"
> jak to zrobic bardzo szybko ( bez kopiowania bajt po bajcie), bo
kopiowanie
Jesli chcesz, zeby pierwszy bajt stal sie ostatnim, a ostatni pierwszym to
bez kopiowania po bajcie sie nie obejdzie.
> pamieci ztcw odbywa sie dla pierwszego i drugiego operandu w te sama
strone
Tak, to prawda, jesli mówimy o operacji typu movs...
[...]
> procedure ValueToValueIntel(var BufferIn;var BufferOut;const
> BufferLen:integer);
Chyba lepiej (klarowniej) byloby tak:
procedure ValueToValueIntel(const BufferIn;var BufferOut;const
BufferLen:integer);
> LEA EBX,pBufferIn
> MOV EBX,[EBX]
Tu bym dal po prostu:
mov ebx, [pBufferIn]
albo jeszcze prosciej - odwolal bezposrednio do parametrów zamiast do
zmiennej tymczasowej:
mov ebx, [BufferIn]
> LEA EDX,pBufferOut
> MOV EDX,[EDX]
a tu:
mov edx, [BufferOut] (tez bez zmiennej tymcz.)
add edx, ecx (koniec bufora)
i dodalbym (*1):
shr ecx, 2
> MOV EAX,[EBX]
> MOV [EDX-3],EAX
> inc EBX
> inc EBX
> inc EBX
> inc EBX
> DEC EDX
> DEC EDX
> DEC EDX
> DEC EDX
a to bym zastapil przez:
dec edx
mov al, [ebx]
inc ebx
mov [edx], al
lub (zwróc uwage na zmiane kolejnosci bajtów przed zapisem):
mov eax, [ebx]
lea ebx, [ebx + 4]
xchg al, ah
lea edx, [edx - 4]
rol eax, 16
xchg al, ah
mov [edx], eax
[...]
> DEC ECX
> DEC ECX
> DEC ECX
> DEC ECX
a tu zostawil tylko jeden dec ecx (patrz *1)
DEC ECX
JNZ @@Loop
--
Pozdrawiam :-)
Bartek
PS. Kod pisany "z glowy", wiec nie dam glowy, ze bezbledny...
Re: string reverse
Author: Bernard
Date: Tue, 05 Dec 2006 16:46
Date: Tue, 05 Dec 2006 16:46
20 lines
1521 bytes
1521 bytes
Bartek Dajewski wrote: > Czesc > > Uzytkownik "mikezum" <noname@poczta.onet.pl> napisal w wiadomosci > news:8j3qqhx2oh2t.16ahj7wfz15t2$.dlg@40tude.net... >> chcialbym przekonwertowac liczbe z postaci intelowskiej >> do zwyklego stringa, czyli normalnie jest tak >> a:int64 >> a:=1 >> rzutuje na stringa - czyli jest tak >> "$01$00$00$00$00$00$00$00" >> a chcialbym zeby bylo tak >> "$00$00$00$00$00$00$00$01" >> jak to zrobic bardzo szybko ( bez kopiowania bajt po bajcie), bo > kopiowanie > > Jesli chcesz, zeby pierwszy bajt stal sie ostatnim, a ostatni pierwszym to > bez kopiowania po bajcie sie nie obejdzie. Obejdzie się. Kopiowanie po 32 bity i BSWAP po drodze.
Re: string reverse
Author: Paweł Pawlak
Date: Tue, 05 Dec 2006 16:47
Date: Tue, 05 Dec 2006 16:47
21 lines
1418 bytes
1418 bytes
Bartek Dajewski napisał(a):
> lub (zwróc uwage na zmiane kolejnosci bajtów przed zapisem):
>
> mov eax, [ebx]
> lea ebx, [ebx + 4]
> xchg al, ah
> lea edx, [edx - 4]
> rol eax, 16
> xchg al, ah
> mov [edx], eax
a ja zamiast
> xchg al, ah
> rol eax, 16
> xchg al, ah
dałbym po prostu
bswap eax
Pozdrawiam,
Morris
Re: string reverse
Author: Bartek Dajewski
Date: Tue, 05 Dec 2006 17:00
Date: Tue, 05 Dec 2006 17:00
19 lines
1704 bytes
1704 bytes
Cześć. Użytkownik "Bernard" <bernard@earth.net> napisał w wiadomości news:el47iu$qie$1@achot.icm.edu.pl... > Bartek Dajewski wrote: [...] > > Jesli chcesz, zeby pierwszy bajt stal sie ostatnim, a ostatni pierwszym to > > bez kopiowania po bajcie sie nie obejdzie. > > Obejdzie się. Kopiowanie po 32 bity i BSWAP po drodze. Fakt. Ja miałem na myśli raczej konieczność zabawy pojedynczymi bajtami niż jednobajtowe operacje odczytu lub zapisu pamięci. A swoją drogą (dawno nie zaglądałem do materiałów dotyczących optymalizacji) - czy mi się wydaje, czy na starszych typach procesorów bswap było mniej wydajne niż xchg? -- Pozdrawiam :-) Bartek
Re: string reverse
Author: mikezum
Date: Tue, 05 Dec 2006 20:37
Date: Tue, 05 Dec 2006 20:37
14 lines
1557 bytes
1557 bytes
> Obie podaja numer pierwszego napotkanego bitu rownego 1. Jedna instrukcja > skanuje operand od najstarszego bitu do najmlodszego, a druga odwrotnie. W > twoim wypadku > > EAX = 00000000000000000000000010000000b > > Innymi slowy, niezaleznie z ktorej strony skanujesz EAX, bit numer 7 bedzie > pierwszym napotkanym bitem rownym 1 > > wystarczy, czy bardziej po ludzku napisac? Czyli kazdy bajt w EAX jst skanowany odzielnie ? Tak rozumiem z Twojej wypowiedzi. A jak najszybciej przeskanowac caly operand od nastarszego bitu w operandzie, a nie w bajcie ?
Re: string reverse
Author: mikezum
Date: Tue, 05 Dec 2006 20:39
Date: Tue, 05 Dec 2006 20:39
5 lines
1313 bytes
1313 bytes
> Oczywiście Twój kod nie działa tak, jak sobie wyobrażasz, tzn. nie > zmienia kolejności bajtów i w dodatku zamazuje inne dane. Dalczego zamazuje dane ?, skoro BufferOut jest allokowany gdzies w procedurze wywolujacej, przecieztak samo robi sie tez w api.
Re: string reverse
Author: mikezum
Date: Tue, 05 Dec 2006 20:48
Date: Tue, 05 Dec 2006 20:48
8 lines
1298 bytes
1298 bytes
> > Chyba lepiej (klarowniej) byloby tak: > procedure ValueToValueIntel(const BufferIn;var BufferOut;const > BufferLen:integer); Masz racje zamiast var przeciez mozna dac const, ale chcialem, zeby po naglowku funkcji mozna bylo wyczaic, ze funkcja zmienia dane :) chociaz przyrost predkosci jest niewielki, to i tak zmienilem na to co proponujesz, nawet 'producenci' jezyka stosuja taka konwencje brrrrr.
Re: string reverse
Author: Michal Schulz
Date: Tue, 05 Dec 2006 21:23
Date: Tue, 05 Dec 2006 21:23
63 lines
3500 bytes
3500 bytes
mikezum wrote: >> EAX = 00000000000000000000000010000000b >> >> Innymi slowy, niezaleznie z ktorej strony skanujesz EAX, bit numer 7 >> bedzie pierwszym napotkanym bitem rownym 1 >> >> wystarczy, czy bardziej po ludzku napisac? > Czyli kazdy bajt w EAX jst skanowany odzielnie ? nie. instrukcja operuje na rejestrze EAX traktujac go jako calosc. W jaki sposob z mojego opisu wyciagnales swoje wnioski? > Tak rozumiem z Twojej wypowiedzi. zatem nic nie zrozumiales > A jak najszybciej przeskanowac caly operand od nastarszego bitu w > operandzie, a nie w bajcie ? To teraz jeszcze bardziej proste wyjasnienie. Wyobraz sobie rejestr eax, skladajacy sie z 32 bitow. Bit najstarszy (najbardziej wazny) ma numer 31, bit najmlodszy ma numer 0. Liczba 128 w systemie szesnastkowym to 0x00000080, lub tez w systemie binarnym 00000000000000000000000010000000b. Innymi slowy, liczba 128 to taka liczba, w ktorej bit numer 7 jest rowny 1 (jeden), a *wszystkie* pozostale bity sa rowne 0 (zero). Instrukcja BSF (Bit scan forward) przeglada drugi operand (w naszym wypadku rejestr EAX zawierajacy liczbe 128) od najmlodszego bitu do najstarszego. Jesli nie znajdzie zadnego bitu rownego 1 (jeden), ustawi flage Z w rejestrze EFLAGS. W przeciwny wypadku flaga Z zostanie wyzerowana, a w pierwszym operandzie (EBX w przypadku twojego kodu) zostanie zapisany numer pierwszego bitu ktorego wartosc jest rowna 1 (jeden). W podanym przez ciebie przypadku bedzie to liczba 7 (bit numer 7 jest pierwszym ustawionym bitem, patrzac od PRAWEJ strony). Instrukcja BSR (Bit scan reverse) przeglada drugi operand (w naszym wypadku rejestr EAX zawierajacy liczbe 128) od najstarszego bitu do najmlodszego. Jesli nie znajdzie zadnego bitu rownego 1 (jeden), ustawi flage Z w rejestrze EFLAGS. W przeciwny wypadku flaga Z zostanie wyzerowana, a w pierwszym operandzie (EBX w przypadku twojego kodu) zostanie zapisany numer pierwszego bitu ktorego wartosc jest rowna 1 (jeden). W podanym przez ciebie przypadku bedzie to liczba 7 (bit numer 7 jest pierwszym ustawionym bitem, patrzac od LEWEJ strony). Wystarczajaco prosta odpowiedz? PS. gdyby w rejestrze EAX byla liczba 1073741826 (0x40000002 w systemie szesnastkowym, lub tez 01000000000000000000000000000010 w systemie dwojkowym), to instrukcja BSF ebx, eax owocowalaby wartoscia 1 w rejestrze ebx, natomiast instrukcja BSR ebx, eax owocowalaby wartoscia 30 w rejestrze ebx. Potrafisz zrozumiec dlaczego? -- Michal Schulz
Re: string reverse
Author: Bartek Dajewski
Date: Tue, 05 Dec 2006 21:41
Date: Tue, 05 Dec 2006 21:41
26 lines
1896 bytes
1896 bytes
Użytkownik "Bartek Dajewski" <bartek@UsunTo.tradiss.com.pl> napisał w wiadomości news:el48ga$evi$1@news.onet.pl... > Cześć. > > Użytkownik "Bernard" <bernard@earth.net> napisał w wiadomości > news:el47iu$qie$1@achot.icm.edu.pl... > > Bartek Dajewski wrote: > [...] > > > Jesli chcesz, zeby pierwszy bajt stal sie ostatnim, a ostatni pierwszym > to > > > bez kopiowania po bajcie sie nie obejdzie. > > > > Obejdzie się. Kopiowanie po 32 bity i BSWAP po drodze. > > Fakt. Ja miałem na myśli raczej konieczność zabawy pojedynczymi bajtami niż > jednobajtowe operacje odczytu lub zapisu pamięci. A swoją drogą (dawno nie > zaglądałem do materiałów dotyczących optymalizacji) - czy mi się wydaje, czy > na starszych typach procesorów bswap było mniej wydajne niż xchg? > -- > Pozdrawiam :-) > Bartek >
Re: string reverse
Author: Bartek Dajewski
Date: Tue, 05 Dec 2006 22:15
Date: Tue, 05 Dec 2006 22:15
24 lines
2216 bytes
2216 bytes
Cześć. Użytkownik "Bartek Dajewski" <bartek@UsunTo.tradiss.com.pl> napisał w wiadomości news:el48ga$evi$1@news.onet.pl... [...] > czy > na starszych typach procesorów bswap było mniej wydajne niż xchg? No i się wyjaśniło. Ale siara! W spisie rozkazów, który mam jeszcze z czasów młodych P1 jest napisane, że bswap potrzebuje nie jednego tylko 11 (jedenastu!) cykli! Nigdy do tej pory tego nie weryfikowałem i tylko wbiłem sobie do łba, żeby go zastępować kombinacją xchg + rol + xchg, bo jest szybsza. A wygląda na to, że to zwykła literówka... Ale zonk!!! No cóż - całe życie się człowiek uczy. Zasady ograniczonego zaufania też... To mi tylko przypomniało stare, sprawdzone powiedzenie, że jak na płocie jest napisane d*a, to nie trza od razu wierzyć, bo potem można długo drzazgi wyciągać... -- Pozdrawiam :-) Bartek PS. I dziękuję Wam za ten wątek, bo nie wiem jak długo tkwiłbym jeszcze w tym koszmarnym błędzie. PPS. Opis już poprawiłem, a teraz chyba sobie każę za karę 100 razy w zeszycie zapisać, że bswap wykonuje się w _JEDNYM_ cyklu.
Re: string reverse
Author: Bartek Dajewski
Date: Tue, 05 Dec 2006 23:02
Date: Tue, 05 Dec 2006 23:02
17 lines
1536 bytes
1536 bytes
Czesc. Uzytkownik "mikezum" <noname@poczta.onet.pl> napisal w wiadomosci news:8hpmldksmqgr.1b5c321wbnuw8$.dlg@40tude.net... > > > > Chyba lepiej (klarowniej) byloby tak: > > procedure ValueToValueIntel(const BufferIn;var BufferOut;const > > BufferLen:integer); > Masz racje zamiast var przeciez mozna dac const [...] > chociaz przyrost predkosci jest niewielki, to i tak zmienilem Zauwazyles przyrost predkosci po zmianie naglówka!? Nic z tego nie rozumiem... -- Pozdrawiam :-) Bartek
Re: string reverse
Author: Bernard
Date: Wed, 06 Dec 2006 09:09
Date: Wed, 06 Dec 2006 09:09
14 lines
1600 bytes
1600 bytes
mikezum wrote: >> Oczywiście Twój kod nie działa tak, jak sobie wyobrażasz, tzn. nie >> zmienia kolejności bajtów i w dodatku zamazuje inne dane. > > Dalczego zamazuje dane ?, skoro BufferOut jest allokowany gdzies w > procedurze wywolujacej, przecieztak samo robi sie tez w api. Dlatego: MOV [EDX-3],EAX Na początku EDX zawiera adres początku bufora, a delikwent pisze o 3 bajty wcześniej, czyli poza buforem. Jeśli bufor był alokowany dynamicznie - rozwali w ten sposób listę alokacji subalokatora. Jeśli był alokowany statycznie - zamaże zmienną umieszczoną przed buforem.
Re: string reverse
Author: Bartek Dajewski
Date: Wed, 06 Dec 2006 10:32
Date: Wed, 06 Dec 2006 10:32
19 lines
1648 bytes
1648 bytes
Cześć.
Użytkownik "Bernard" <bernard@earth.net> napisał w wiadomości
news:el616u$h97$1@achot.icm.edu.pl...
> mikezum wrote:
[...]
> > Dalczego zamazuje dane ?, skoro BufferOut jest allokowany gdzies w
>
> Dlatego:
> MOV [EDX-3],EAX
>
> Na początku EDX zawiera adres początku bufora, a delikwent pisze o 3
Nie początku tylko końca. Wcześniej jest:
pBufferOut:=@BufferOut;
Inc(pBufferOut,BufferLen-1);
--
Pozdrawiam :-)
Bartek
Re: string reverse
Author: Bernard
Date: Wed, 06 Dec 2006 12:31
Date: Wed, 06 Dec 2006 12:31
18 lines
1583 bytes
1583 bytes
Bartek Dajewski wrote: > Cześć. > > Użytkownik "Bernard" <bernard@earth.net> napisał w wiadomości > news:el616u$h97$1@achot.icm.edu.pl... >> mikezum wrote: > [...] >>> Dalczego zamazuje dane ?, skoro BufferOut jest allokowany gdzies w >> Dlatego: >> MOV [EDX-3],EAX >> >> Na początku EDX zawiera adres początku bufora, a delikwent pisze o 3 > > Nie początku tylko końca. Wcześniej jest: > pBufferOut:=@BufferOut; > Inc(pBufferOut,BufferLen-1); No fakt, nie zauważyłem. Ale bajtów i tak nie zamienia ;)
Re: string reverse
Author: mikezum
Date: Wed, 06 Dec 2006 12:32
Date: Wed, 06 Dec 2006 12:32
5 lines
1202 bytes
1202 bytes
> Zauwazyles przyrost predkosci po zmianie naglówka!? Nic z tego nie > rozumiem... oczywiscie pod warunkiem, ze dodatkowo nie korzystam ze zmiennych tymczasowych.... moglem to dopisac wczesniej.....
Re: string reverse
Author: mikezum
Date: Wed, 06 Dec 2006 12:41
Date: Wed, 06 Dec 2006 12:41
7 lines
1465 bytes
1465 bytes
> owocowalaby wartoscia 30 w rejestrze ebx. Potrafisz zrozumiec dlaczego? Ddziekuje za odpowiedz, choc sarkazmy nie byly potrzebne.... zreszta mniejsza o wiekszosc..... Dla pelnego zrozumienia nalezaloby tylko dodac, ze wynik zwracany przez te dwie instrukcje liczony zawsze jest od bajtu najmlodszego, a nie tak jak ja spodziewlem sie - od tego czy jest to bsf czy bsr. W kazdym badz razie dzieki.
Re: string reverse
Author: mikezum
Date: Wed, 06 Dec 2006 12:48
Date: Wed, 06 Dec 2006 12:48
9 lines
1291 bytes
1291 bytes
> No fakt, nie zauważyłem. Ale bajtów i tak nie zamienia ;) *4bajty ^4bajty po wykonaniu instrukcji ^4bajty *4bajty prosciej 1234 56789 5678 1234
Re: string reverse
Author: Michal Schulz
Date: Wed, 06 Dec 2006 13:52
Date: Wed, 06 Dec 2006 13:52
20 lines
1638 bytes
1638 bytes
mikezum wrote: >> owocowalaby wartoscia 30 w rejestrze ebx. Potrafisz zrozumiec dlaczego? > Ddziekuje za odpowiedz, choc sarkazmy nie byly potrzebne.... zreszta > mniejsza o wiekszosc..... czasem wredny bywam :) > Dla pelnego zrozumienia nalezaloby tylko dodac, ze wynik zwracany przez te > dwie instrukcje liczony zawsze jest od bajtu najmlodszego, Dla pelnego zrozumienia nalezaloby dodac ze numeracja bitow jest okreslona w dokumentacji dotyczacej danej architektury (x86 w tym wypadku) i nie zalezy od aktualnie wykonywanej instrukcji :-D pozdrawiam, M. -- Michal Schulz
Re: string reverse
Author: mikezum
Date: Wed, 06 Dec 2006 22:37
Date: Wed, 06 Dec 2006 22:37
11 lines
1611 bytes
1611 bytes
> Dla pelnego zrozumienia nalezaloby dodac ze numeracja bitow jest okreslona w > dokumentacji dotyczacej danej architektury (x86 w tym wypadku) i nie zalezy > od aktualnie wykonywanej instrukcji :-D > > pozdrawiam, > M. Masz racje, choc w assemblerze pisze bardzo malo, jesli jest potrzebna duza szybkosc ( choc wcale nie uwazam, ze znam go dobrze - raczej w stopniu minimalnym ) :) Nie wszystko, co dla Ciebie wydaja sie oczywiste, dla mnie tez jest... Pozdrowka :)
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