[ASM + Delphi]

0
  1. Czy wstawki asm w delphi od razu 'widza' zdeklarowane w pascalu zmienne, czy mozna sie w ogóle jakos do nich odwolac?
  2. Jak wykonac petle for w takiej wstawce na stworzonej w pascalu tablicy?
0
  1. Czy wstawki asm w delphi od razu 'widza' zdeklarowane w pascalu zmienne, czy mozna sie w ogóle jakos do nich odwolac?

Tak widzą. Przy czym trzeba bardzo uważać na rozmiary zmiennych. Asm automatycznie nie przekonwertuje Byte na Word jak to Delphi robi.

  1. Jak wykonac petle for w takiej wstawce na stworzonej w pascalu tablicy?

Tablica jest najczęściej zadeklarowana jako ciąg następujących po sobie komórek pamięci (choć tak nie musi być). Znając adres pierwszego elementu można się odwołać do pozostałych.
Teoretycznie mając wskaźnik do pierwszego elementu możesz odwołać się w asm do dowolnego innego korzystając ze wzoru:
adres := AdrPierwszej + NrKom*RozmKom;
Jednak jeżeli tablica jest zdefiniowana na zewnątrz to nigdy pewności nie ma, że jest ona ciągiem przylegających komórek (ale z tego co się orientuję to w Pascalu tak jest). Jeszcze gorzej jest z tablicami wielowymiarowymi (różne kompilatory inaczej przedstawiają je w pamięci).

Prymitywna pętelka dodająca 5 do każdego elementu (pewnie można to zrobić lepiej, ale asma to się dopiero uczę)
[b]asm[/b]
[b]push [/b]ecx; //to jakby coś tam siedziało...
[b]push [/b]ebx
[b]push [/b]edx
[b]push [/b]eax
[b]mov [/b]ecx, LiczbaPrzejscPetli
[b]lea [/b]ebx, WskDoPierwszegoElem
@Petla:
[b]mov [/b]eax, [ebx]
[b]add [/b]eax, 5
[b]mov [/b][ebx], eax
[b]inc [/b]ebx
[b]dec [/b]ecx
[b]jnz [/b]@Petla
[b]push [/b]eax; //i z powrotem
[b]push [/b]edx
[b]push [/b]ebx
[b]push [/b]ecx
[b]end[/b];

0

[b]asm[/b]
[b]push [/b]ecx; //to jakby coś tam siedziało...
[b]push [/b]ebx
[b]push [/b]edx
[b]push [/b]eax
[b]mov [/b]edx, LiczbaPrzejscPetli
[b]lea [/b]ebx, WskDoPierwszegoElem
@Petla:
[b]mov [/b]eax, [ebx]
[b]add [/b]eax, 5
[b]mov [/b][ebx], eax
[b]inc [/b]ebx
[b]loop [/b]@Petla
[b]push [/b]eax; //i z powrotem
[b]push [/b]edx
[b]push [/b]ebx
[b]push [/b]ecx
[b]end[/b];

Tak mnie zastanawia, czy ta wersja też ruszy :) Z moim asmem jest gorzej niż z Twoim, Dryo :P

0

Tak mnie zastanawia, czy ta wersja też ruszy :) Z moim asmem jest gorzej niż z Twoim, Dryo :P

Oj chyba znacznie lepiej. Ja swoją odpaliłem i coś nie poszło :)
Jeszcze muszę duuuuuuużo się uczyć.

0

uuuu lala, sytuacja nie wyglada najlepiej bo chcialem to uzyc do tablicy z recordem :)

ostro studiuje teraz asm'a wiec moze cos jeszcze doloze od siebie, ale wielkie dzieki za pomoc!

0

uuuu lala, sytuacja nie wyglada najlepiej bo chcialem to uzyc do tablicy z recordem :)

Z rekordem to jest tylko taka różnica, że trzeba odpowiednio zwiększyć "skoki" do kolejnych elementów.
A tak swoją drogą, to dlaczego akurat potrzebujesze dostępu do tablic ze wstawek asm w Delphi? Co w ten sposób uzyskasz?

0

praktycznie nic, chcialbym po prostu zaczac sie w tym szkolic, a wstawki sa dobrym poczatkiem :)

0

praktycznie nic, chcialbym po prostu zaczac sie w tym szkolic, a wstawki sa dobrym poczatkiem :)

Czy ja wiem. Wstawki są bardzo ograniczone. Właśnie takie problemy występują: czy tablica jest tak przedstawiona czy inaczej. Wstawki w językach wyższego rzędu warto używać jedynie do obliczeń matematycznych. Odwołania do różnego rodziaju struktur jest dosyć niewygodne. Ale jak chcesz.

0

hmm ale np. taka petla teoretycznie powinna dzialac szybciej :)

0

hmm ale np. taka petla teoretycznie powinna dzialac szybciej :)

Tylko jesli twoja znajomosc asm jest lepsza niz znajomosc asm tworcow kompilatora Delphi :)))

0

[b]asm[/b]
[b]push [/b]ecx; //to jakby coś tam siedziało...
[b]push [/b]ebx
[b]push [/b]edx
[b]push [/b]eax
[b]mov [/b]edx, LiczbaPrzejscPetli
[b]lea [/b]ebx, WskDoPierwszegoElem
@Petla:
[b]mov [/b]eax, [ebx]
[b]add [/b]eax, 5
[b]mov [/b][ebx], eax
[b]inc [/b]ebx
[b]loop [/b]@Petla
[b]push [/b]eax; //i z powrotem
[b]push [/b]edx
[b]push [/b]ebx
[b]push [/b]ecx
[b]end[/b];

Tak mnie zastanawia, czy ta wersja też ruszy :) Z moim asmem jest gorzej niż z Twoim, Dryo :P

Witam! W końcu ASM :d
Awięc:
Jeśli chodzi o poprawkę Vogela, to to nie pójdzie, ponieważ instrukcja loop label robi co następuje:
dec cx lub ecx (zależnie od tego, czy aplikacja działa w trybie rzeczywistym, czy chronionym)
jnz label
więc linijka
[b]mov [/b]edx, LiczbaPrzejscPetli
nie ma sensu przy użyciu instrukcji loop.

Natomiast kodzik Dryo jest znacznie szybszy na komputerach Pentium+ ponieważ instrukcje
dec ecx
jnz @Petla
są parowalne i po dobrej optymalizacji wykonają się w jednym cyklu procesora (podczas gdy loop nie jest parowalna w żadnym kanale i zajmuje (o ile mnie pamięć nie myli) 5 do 8 cykli).

I jeszcze jedno:
mov eax, [ebx]
add eax, 5
mov [ebx], eax

można oczywiście zamienić na jedną instrukcję:
add [ebx],5

I na konieć:
Do zwiększenia licznika (indexu elementu w tablicy) została użyta instrukcja:
inc ebx
nie muszę chyba mówić, że jest to prawidłowe tylko dla tablicy, której elementami są bajty (dla elementów typu int należałoby dodać do ebx liczbę 4).
To tyle :d

0

Jeśli chodzi o poprawkę Vogela, to to nie pójdzie, ponieważ instrukcja loop label robi co następuje:
dec cx lub ecx (zależnie od tego, czy aplikacja działa w trybie rzeczywistym, czy chronionym)
jnz label

Przepraszam [wstyd] Tam miało być ecx, ale nie wiem dlaczego wyszło edx [wstyd]

1 użytkowników online, w tym zalogowanych: 0, gości: 1