-
1. Data: 2015-10-04 15:10:53
Temat: asm - przesuwanie wektora bajtow
Od: szemrany <s...@o...off>
Witam
Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów. Po
jakimś tam czasie czytania i prób zrobiłem prockę opartą o instrukcję RCL
przesuwająca o jeden bit:
mov ebx, x // liczba bajtów w wektorze
mov eax, end_byte // adres ostatniego elementu
clc
@@loop:
mov cl, byte ptr [eax]
rcl cl, 1
mov byte ptr [eax], CL
dec eax
dec ebx
jne @@loop
Teraz, gdy chcę przesunąć o 3 bity to wykonuję ten kod w pętli trzy razy.
Czy ten kod można zoptymalizować bardziej?
Czy można to zrobić inaczej, bez RCL?
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
2. Data: 2015-10-05 09:05:37
Temat: Re: asm - przesuwanie wektora bajtow
Od: Wojciech Muła <w...@g...com>
On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
> [...]
> Teraz, gdy chcę przesunąć o 3 bity to wykonuję ten kod w pętli trzy razy.
Poczytaj o instrukcji SHRD, robi dokładnie to co chcesz. Z tym, że działa
na słowach 16 lub 32-bitowych, więc musisz sobie z tą niedogodnością poradzić.
w.
-
3. Data: 2015-10-05 12:06:31
Temat: Re: asm - przesuwanie wektora bajtow
Od: "M.M." <m...@g...com>
On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
Co to znaczy?
-
4. Data: 2015-10-05 15:04:14
Temat: Re: asm - przesuwanie wektora bajtow
Od: szemrany <s...@o...off>
On Mon, 5 Oct 2015 03:06:31 -0700 (PDT), M.M. wrote:
> On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
>> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
> Co to znaczy?
Dokładnie to co napisałem. Np. wektor 5 bajtów to 40 bitów, chce je
wszystkie przesunąć o X pozycji w lewo.
przed:
1011001100001100110000110011000011001100
po przesunięciu o 2 bity w lewo:
1100110000110011000011001100001100110000
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
5. Data: 2015-10-05 17:06:14
Temat: Re: asm - przesuwanie wektora bajtow
Od: "M.M." <m...@g...com>
On Monday, October 5, 2015 at 3:04:17 PM UTC+2, szemrany wrote:
> On Mon, 5 Oct 2015 03:06:31 -0700 (PDT), M.M. wrote:
>
> > On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
> >> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
> > Co to znaczy?
>
> Dokładnie to co napisałem. Np. wektor 5 bajtów to 40 bitów, chce je
> wszystkie przesunąć o X pozycji w lewo.
>
> przed:
>
> 1011001100001100110000110011000011001100
>
> po przesunięciu o 2 bity w lewo:
> 1100110000110011000011001100001100110000
>
> --
> howgh
> szemrany
> "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
> a nie w uwiędłych laurów liść z uporem stroić głowę"
Czyli na granicy bajtu (lub dowolnej jednostki) znaczące
bity nie są obcinane lecz przechodzą do bajtu bardziej
znaczącego.
Nie wiem jakie długie masz ciągi. Nie wiem na jaką platformę
sprzętową. Może opłacać się to wykonać na (jakiś) długich
rejestrach, choćby na 64 bitowych. Nie wiem też o ile
bitów chcesz przesuwać. Gdy przesuwasz np. o 100 bitów i
używasz słowa 64 bitowego, to (chyba) najpierw trzeba
przesunąć o pełne słowo, a potem 36 bitów. Prosta procedura, a
wariacji na temat sporo - naprawdę nie szkoda czasu na
asembler i optymalizację?
Pozdrawiam
-
6. Data: 2015-10-05 17:19:06
Temat: Re: asm - przesuwanie wektora bajtow
Od: bartekltg <b...@g...com>
On 05.10.2015 17:06, M.M. wrote:
> On Monday, October 5, 2015 at 3:04:17 PM UTC+2, szemrany wrote:
>> On Mon, 5 Oct 2015 03:06:31 -0700 (PDT), M.M. wrote:
>>
>>> On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
>>>> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
>>> Co to znaczy?
>>
>> Dokładnie to co napisałem. Np. wektor 5 bajtów to 40 bitów, chce je
>> wszystkie przesunąć o X pozycji w lewo.
>>
>> przed:
>>
>> 1011001100001100110000110011000011001100
>>
>> po przesunięciu o 2 bity w lewo:
>> 1100110000110011000011001100001100110000
>>
>> --
>> howgh
>> szemrany
>> "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
>> a nie w uwiędłych laurów liść z uporem stroić głowę"
>
> Czyli na granicy bajtu (lub dowolnej jednostki) znaczące
> bity nie są obcinane lecz przechodzą do bajtu bardziej
> znaczącego.
>
> Nie wiem jakie długie masz ciągi. Nie wiem na jaką platformę
> sprzętową. Może opłacać się to wykonać na (jakiś) długich
> rejestrach, choćby na 64 bitowych. Nie wiem też o ile
> bitów chcesz przesuwać. Gdy przesuwasz np. o 100 bitów i
> używasz słowa 64 bitowego, to (chyba) najpierw trzeba
> przesunąć o pełne słowo, a potem 36 bitów. Prosta procedura, a
> wariacji na temat sporo - naprawdę nie szkoda czasu na
> asembler i optymalizację?
Też się skończy na rzeżbieniu, bo gotowców za dużo nie ma.
pzdr
bartekltg
-
7. Data: 2015-10-05 19:39:12
Temat: Re: asm - przesuwanie wektora bajtow
Od: "M.M." <m...@g...com>
On Monday, October 5, 2015 at 5:19:08 PM UTC+2, bartekltg wrote:
> On 05.10.2015 17:06, M.M. wrote:
> > On Monday, October 5, 2015 at 3:04:17 PM UTC+2, szemrany wrote:
> >> On Mon, 5 Oct 2015 03:06:31 -0700 (PDT), M.M. wrote:
> >>
> >>> On Sunday, October 4, 2015 at 3:10:56 PM UTC+2, szemrany wrote:
> >>>> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów.
> >>> Co to znaczy?
> >>
> >> Dokładnie to co napisałem. Np. wektor 5 bajtów to 40 bitów, chce je
> >> wszystkie przesunąć o X pozycji w lewo.
> >>
> >> przed:
> >>
> >> 1011001100001100110000110011000011001100
> >>
> >> po przesunięciu o 2 bity w lewo:
> >> 1100110000110011000011001100001100110000
> >>
> >> --
> >> howgh
> >> szemrany
> >> "Trzeba z żywymi naprzód iść, po życie sięgać nowe,
> >> a nie w uwiędłych laurów liść z uporem stroić głowę"
> >
> > Czyli na granicy bajtu (lub dowolnej jednostki) znaczące
> > bity nie są obcinane lecz przechodzą do bajtu bardziej
> > znaczącego.
> >
> > Nie wiem jakie długie masz ciągi. Nie wiem na jaką platformę
> > sprzętową. Może opłacać się to wykonać na (jakiś) długich
> > rejestrach, choćby na 64 bitowych. Nie wiem też o ile
> > bitów chcesz przesuwać. Gdy przesuwasz np. o 100 bitów i
> > używasz słowa 64 bitowego, to (chyba) najpierw trzeba
> > przesunąć o pełne słowo, a potem 36 bitów. Prosta procedura, a
> > wariacji na temat sporo - naprawdę nie szkoda czasu na
> > asembler i optymalizację?
>
>
> Też się skończy na rzeżbieniu, bo gotowców za dużo nie ma.
>
Ja nie znam, ale może są jakieś.
Pozdrawiam
-
8. Data: 2015-10-05 21:15:44
Temat: Re: asm - przesuwanie wektora bajtow
Od: "Bogdan (bogdro)" <b...@p...gazeta.pl>
W dniu 04.10.2015 o 15:10, szemrany pisze:
> Witam
>
> Potrzebuję przesunąć tablicę/wektor bajtów w lewo o zadaną liczbę bitów. Po
> jakimś tam czasie czytania i prób zrobiłem prockę opartą o instrukcję RCL
> przesuwająca o jeden bit:
>
>
> mov ebx, x // liczba bajtów w wektorze
> mov eax, end_byte // adres ostatniego elementu
> clc
> @@loop:
> mov cl, byte ptr [eax]
> rcl cl, 1
> mov byte ptr [eax], CL
> dec eax
> dec ebx
> jne @@loop
>
> Teraz, gdy chcę przesunąć o 3 bity to wykonuję ten kod w pętli trzy razy.
>
> Czy ten kod można zoptymalizować bardziej?
> Czy można to zrobić inaczej, bez RCL?
>
Witam.
Sądząc po kolejnych postach, ten kod NIE robi tego, co chcesz, bo nie
przenosisz wypchniętych bitów do kolejnych bajtów.
Potrzebujesz takiego "SHL o wielokrotnej precyzji". Robi się to
kombinacją instrukcji SHL i RCL. Poczytaj
http://bogdro.ciki.me/dos/a_kurs14.htm#a_kurs1405_1. Można też
przesuwać bity w więcej niż 1 bajcie na raz. Skoro masz dostępne
rejestry 32-bitowe, możesz załadować i przesuwać 32 bity na raz, po
czym te 8 bitów z ostatniego bajtu.
Niestety, jeśli nie masz rejestru dość długiego, aby pomieścić te
dane, to trzeba przesuwać bit po bicie, inaczej bity się pogubią.
Wartość 40-bitową można zmieścić w rejestrze 64-bitowym (jeśli masz
takowe dostępne), wtedy wykonujesz po prostu SHL od razu o tyle bitów,
ile trzeba.
Zwróć też uwagę, że prawdopodobnie powinieneś zaczynać od pierwszego
(najmłodszego) bajtu, choć to zależy dokładnie od tego, jak traktujesz
swoje dane (tamten post z zerami i jedynkami nie pokazywał, który bajt
jest najmłodszy, a który - najstarszy).
--
Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux): http://bogdro.ciki.me
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org Soft(EN): http://bogdro.ciki.me/soft
-
9. Data: 2015-10-05 21:23:45
Temat: Re: asm - przesuwanie wektora bajtow
Od: szemrany <s...@o...off>
On Mon, 5 Oct 2015 21:15:44 +0200, Bogdan (bogdro) wrote:
>> mov cl, byte ptr [eax]
>> rcl cl, 1
> Sądząc po kolejnych postach, ten kod NIE robi tego, co chcesz, bo nie
> przenosisz wypchniętych bitów do kolejnych bajtów.
Działa, używam go. Cała "magia" jest w znaczniku Carry, który jest
wykorzystywany przez rozkaz RCL i wędruje z bajtu do bajtu.
> Potrzebujesz takiego "SHL o wielokrotnej precyzji". Robi się to
> kombinacją instrukcji SHL i RCL. Poczytaj
> http://bogdro.ciki.me/dos/a_kurs14.htm#a_kurs1405_1. Można też
> przesuwać bity w więcej niż 1 bajcie na raz. Skoro masz dostępne
> rejestry 32-bitowe, możesz załadować i przesuwać 32 bity na raz, po
> czym te 8 bitów z ostatniego bajtu.
Tak naprawdę sens ma przesuwanie o 1 do 7 bitów, powyżej tego można już
kombinować z miksowaniem metody bitowej i bajtowej.
> Zwróć też uwagę, że prawdopodobnie powinieneś zaczynać od pierwszego
> (najmłodszego) bajtu, choć to zależy dokładnie od tego, jak traktujesz
> swoje dane (tamten post z zerami i jedynkami nie pokazywał, który bajt
> jest najmłodszy, a który - najstarszy).
Po prawej był młodszy.
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"
-
10. Data: 2015-10-05 21:24:12
Temat: Re: asm - przesuwanie wektora bajtow
Od: szemrany <s...@o...off>
On Mon, 5 Oct 2015 00:05:37 -0700 (PDT), Wojciech Muła wrote:
> Poczytaj o instrukcji SHRD, robi dokładnie to co chcesz. Z tym, że działa
> na słowach 16 lub 32-bitowych, więc musisz sobie z tą niedogodnością poradzić.
Dzięki, w wolnej chwili z tym powalczę.
--
howgh
szemrany
"Trzeba z żywymi naprzód iść, po życie sięgać nowe,
a nie w uwiędłych laurów liść z uporem stroić głowę"