eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingasm - przesuwanie wektora bajtow
Ilość wypowiedzi w tym wątku: 15

  • 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ę"

strony : [ 1 ] . 2


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: