🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
10 messages
10 total messages Started by piotrg Sun, 20 Jan 2008 21:33
przesunięcie cykliczne
#1679
Author: piotrg
Date: Sun, 20 Jan 2008 21:33
14 lines
1369 bytes
Witam!

Mam mały problem i może mi pomożecie . Mam jakiś obszar pamięci n*8 bitowy 
gdzie n jest podane muszę napisać program w asm który o robi obrót cykliczny 
tego obszaru o zadaną liczbę bitów p. Proszę o jakieś wskazówki.


Myślałem żeby to rozkazem ROL zrobić ale to chyba mija się z celem.

Może to jakość cześciowo ale nie mam pomysłu proszę o pomoc.


Pozdrawiam
Piotr Grota 
Re: przesuniêcie cykliczne
#1680
Author: Artur Ba?
Date: Mon, 21 Jan 2008 12:26
33 lines
2097 bytes
piotrg wrote:
> Mam ma³y problem i mo¿e mi pomo¿ecie . Mam jaki¶ obszar pamiêci n*8 bitowy
> gdzie n jest podane muszê napisaæ program w asm który o robi obrót
> cykliczny tego obszaru o zadan± liczbê bitów p. Proszê o jakie¶ wskazówki.
> 
> 
> My¶la³em ¿eby to rozkazem ROL zrobiæ ale to chyba mija siê z celem.

Chyba jednak nie.

Za slabo na asemblerze sie znam by to w nim napisac ale mozesz to zrobic tak
jak opsize to w C

majac wskaznik na poczatek obszaru byte *begin

//na pozycji at_ix przesuniecie
void shift_left( byte* begin, unsigned n, unsigned at_ix, unsigned p)
{
        unsigned tmp;
        //bierzesz 3 bajty i traktujesz jako uint
        tmp =      begin[ (at_ix + n - 2) % n ] 
                | (begin[ (at_ix + n - 1) % n ] << 8) 
                | (begin[ (at_ix) ] << 16); 
        tmp <<= p; //przeuswasz o zadana ilosc w lewo
        begin[at_ix] = (tmp >> 16) & 0xFF; //pobierasz bajt ktory cie interesuje
}
to pozwala przesunac maksymalnie o 16 bitow w lewo podobnie mozesz zrobic
jesli to ma byc w druga strone
modulo obsluguje skrajne bajty poprawnie tworzac cykliczne przesuneicie

-- 

Artur
Re: przesunięcie cykliczne
#1681
Author: w.sygnaturze
Date: Mon, 21 Jan 2008 12:48
31 lines
1732 bytes
piotrg wrote:

> Witam!
> 
> Mam mały problem i może mi pomożecie . Mam jakiś obszar pamięci n*8
> bitowy gdzie n jest podane muszę napisać program w asm który o robi
> obrót cykliczny tego obszaru o zadaną liczbę bitów p. Proszę o jakieś
> wskazówki.
> 
> 
> Myślałem żeby to rozkazem ROL zrobić ale to chyba mija się z celem.
> 
> Może to jakość cześciowo ale nie mam pomysłu proszę o pomoc.
> 

czyścisz CF
robisz RCL pierwszego bajtu -> cf (0) trafia do najmłodszego bitu,
najstarszy do CF
robisz kolejnego RCLa z kolejnym bajtem -> najstarszy bit poprzedniego
bajtu jest w CF wiec trafia do najmłodszgo bitu aktualnego bajtu,
najstarszy bit aktualnego bajtu trafia do CF
itd
dla ostatniego bajtu do CF trafia najstarszy jego bit a powinien do
pierwszego bajtu wiec po RCL robisz adc bajt_1,0 w ten sposób dopiszesz
CF do 1. bajtu

pozdro

-- 
Michał Walenciak,   gg: 3729519,  mail: Kicer86 na gmail kropka com
http://kicer.elsat.net.pl
Re: przesunięcie cykliczne
#1682
Author: Michal Schulz
Date: Mon, 21 Jan 2008 13:06
27 lines
1797 bytes
w.sygnaturze@absdefg.a wrote:

>> Mam mały problem i może mi pomożecie . Mam jakiś obszar pamięci n*8
>> bitowy gdzie n jest podane muszę napisać program w asm który o robi
>> obrót cykliczny tego obszaru o zadaną liczbę bitów p. Proszę o jakieś
>> wskazówki.
> 
> czyścisz CF
> robisz RCL pierwszego bajtu -> cf (0) trafia do najmłodszego bitu,
> najstarszy do CF
> robisz kolejnego RCLa z kolejnym bajtem -> najstarszy bit poprzedniego
> bajtu jest w CF wiec trafia do najmłodszgo bitu aktualnego bajtu,
> najstarszy bit aktualnego bajtu trafia do CF
> itd
> dla ostatniego bajtu do CF trafia najstarszy jego bit a powinien do
> pierwszego bajtu wiec po RCL robisz adc bajt_1,0 w ten sposób dopiszesz
> CF do 1. bajtu

Uhm. Czy uwazasz, ze to jest rozwiazanie optymalne? Jesli trzeba bedzie
obrocic obszar o wiecej niz jeden bit, bedziesz musial cala petle
wielokrotnie powtarzac...

Takie podejscie wydajnoscia nie grzeszy.


-- 
Michal Schulz
Re: przesuni?cie cykliczne
#1683
Author: Wojciech Muła
Date: Mon, 21 Jan 2008 14:14
18 lines
1484 bytes
Michal Schulz wrote:
>> [...]
>> dla ostatniego bajtu do CF trafia najstarszy jego bit a powinien do
>> pierwszego bajtu wiec po RCL robisz adc bajt_1,0 w ten sposób dopiszesz
>> CF do 1. bajtu
>
> Uhm. Czy uwazasz, ze to jest rozwiazanie optymalne? Jesli trzeba bedzie
> obrocic obszar o wiecej niz jeden bit, bedziesz musial cala petle
> wielokrotnie powtarzac...

A przede wszystkim jeśli n jest zminne, jak zrobi pętle.

> Takie podejscie wydajnoscia nie grzeszy.

Naturalnie narzuca się rozkaz SHLD (i specjalne traktowanie pierwszego
słowa).

w.
Re: przesuni?cie cykliczne
#1684
Author: Michal Schulz
Date: Mon, 21 Jan 2008 14:29
21 lines
1515 bytes
Wojciech Muła wrote:

>> Uhm. Czy uwazasz, ze to jest rozwiazanie optymalne? Jesli trzeba bedzie
>> obrocic obszar o wiecej niz jeden bit, bedziesz musial cala petle
>> wielokrotnie powtarzac...
> 
> A przede wszystkim jeśli n jest zminne, jak zrobi pętle.
> 
>> Takie podejscie wydajnoscia nie grzeszy.
> 
> Naturalnie narzuca się rozkaz SHLD (i specjalne traktowanie pierwszego
> słowa).

Ale to tylko x86_64 :)

A na intelu? Dwa obroty (raz w lewo raz w prawo), dwa and-y (z dwoma maskami
albo jedna negowana co chwila) i jeden or na kazda pare elementow? Jakos
tak to powinno byc :)

-- 
Michal Schulz
Re: przesuni?cie cykliczne
#1685
Author: Michal Schulz
Date: Mon, 21 Jan 2008 14:32
11 lines
1143 bytes
Michal Schulz wrote:

>> Naturalnie narzuca się rozkaz SHLD (i specjalne traktowanie pierwszego
>> słowa).
> 
> Ale to tylko x86_64 :)

Bredze. :) Za duzo x86_64 mialem ostatnio :)

-- 
Michal Schulz
Re: przesunięcie cykliczne
#1687
Author: Remek
Date: Mon, 21 Jan 2008 16:24
12 lines
1330 bytes
Użytkownik "piotrg" napisał:

> Mam jakiś obszar pamięci n*8 bitowy
> gdzie n jest podane muszę napisać program w asm który o robi obrót
> cykliczny tego obszaru o zadaną liczbę bitów p. Proszę o jakieś
> wskazówki.

W tytule masz - przesunięcie cykliczne, a w treści obrót cykliczny.
Zdecyduj się co chcesz zrobić, przesunięcie, czy obrót. Mimo dużego
podobieństwa, to nie są identyczne operacje. Jak brzmi zadanie?

Remek
Re: przesunięcie cykliczne
#1686
Author: Michał Walenciak
Date: Mon, 21 Jan 2008 19:57
19 lines
1427 bytes
Michal Schulz wrote:

> w.sygnaturze@absdefg.a wrote:
> 
> 
> Uhm. Czy uwazasz, ze to jest rozwiazanie optymalne? Jesli trzeba
> bedzie obrocic obszar o wiecej niz jeden bit, bedziesz musial cala
> petle wielokrotnie powtarzac...
> 
> Takie podejscie wydajnoscia nie grzeszy.
> 

nie, nie uważam ze jest optymalne, wymysliłem na prędko.
mozna zrobić na shld, czemu nie, ale bedziesz musiał kombinowac jesli n
będzie nie podzielne przez 2/4 , chyba ze nie nadążam za Toba
mysleniem ;)
-- 
Michał Walenciak,   gg: 3729519,  mail: Kicer86 na gmail kropka com
http://kicer.elsat.net.pl
Re: przesunięcie cykliczne
#1688
Author: rwt
Date: Tue, 22 Jan 2008 11:33
63 lines
3310 bytes
piotrg stuknął:
> Mam mały problem i może mi pomożecie . Mam jakiś obszar pamięci n*8 bitowy
> gdzie n jest podane muszę napisać program w asm który o robi obrót cykliczny
> tego obszaru o zadaną liczbę bitów p. Proszę o jakieś wskazówki.
>
>
> Myślałem żeby to rozkazem ROL zrobić ale to chyba mija się z celem.
>
> Może to jakość cześciowo ale nie mam pomysłu proszę o pomoc.

Rezerwacja bloku pamięci (optymalnie o rozmiarze bądź wielokrotności rozmiaru strony pamięci wirtualnej),

umieszczenie w tym bloku na końcu początkowego fragmentu bloku (o tym samym rozmiarze), w którym będzie początek tablicy bitów po obrocie bitów,
[przesuwamy o 16 bitów przy rozmiarze tymczasowego bloku pamięci do kopiowania 10 bitów]
|         |     0   |          |
0        10   / ^  20         30
	    /   tu będzie początek tablicy po obrocie bitów
	  |   |     |
	  0^^^
    skopiowana pamięć z pierwszego kopiowanego bloku

przekopiowanie pamięci od nowego początku tablicy (optymalną metodą dla danego sprzętu),

przepisanie mapowania stron pamięci wirtualnej tak, by były liniowo od starego adresu.


Albo (jeśli nie możliwe jest przepisanie mapowania stron pamięci):

Skopiowanie krótszego fragmentu tablicy od nowego początku do początku lub końca tablicy do bufora,

przekopiowanie pamięci od nowego początku tablicy,

skopiowanie fragmentu tablicy z bufora na koniec lub początek.


Albo (jeśli również brak pamięci wirtualnej):

Rezerwacja maksimum dostępnej wielokrotności bloków jako tymczasowej pamięci,

przekopiowywanie kolejnych fragmentów tablicy od nowego początku tablicy na początek tablicy,
zachowując je w tymczasowej pamięci, podczas gdy przekopiowuje się na ich miejsce fragment tablicy, przygotowując miejsce na ich zapisanie.


Albo (jeśli ma być wolne, bo tak żąda zleceniodawca ;> ):

Przenoszenie danych w pętli przy pomocy pojedynczego słowa maszynowego za każdym razem.


Albo (jeśli ma być szczególnie wolne, bo to poprzednie było zbyt szybkie ;>> ):

Użycie w tym celu instrukcji maszynowych służących do przesuwania o podaną liczbę bitów,

utworzenie zależności w pętli w taki sposób, by nie mogła być rozwinięta,

wymuszenie zliczania kopiowanych słów, by powstała konieczność obliczania licznika.


Jeśli potrzebne coś wolniejszego, to „zrób to sam”, na pewno coś wymyślisz lepiej.
-- 
 qo   |)      CPL: cs[0..1] (ss[0..1]) p lvl of curr code!
    _x/ ,     RPL: seg_sel[0..1] privilege lvl of seg_sel!
    |    ng  __ -- __ -- __ -- __ -- __ -- __ -- __ -x86-,
,__ -- __ -- DPL: 2._word_of_seg_desc[13..14]:`f seg_desc ,
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