• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Asembler - nawiasy kwadratowe w poleceniu

0 głosów
903 wizyt
pytanie zadane 23 października 2018 w Assembler przez aram100 Użytkownik (500 p.)
Hej

Czym w asemblerze różni się polecenie:

mov eax, ebx

od

mov [eax], ebx

 

Mógłby ktoś łopatologicznie wytłumaczyć?

2 odpowiedzi

+2 głosów
odpowiedź 23 października 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 24 października 2018 przez aram100
 
Najlepsza

Użyte jest tu odwołanie do pamięci (pośrednie, adres w rejestrze eax). W skrócie, w komórce pamięci o adresie określonej w rejestrze eax, umieszczana jest wartość z rejestru ebx. W pierwszym przypadku natomiast zawartość ebx jest umieszczana w rejestrze eax, a nie w pamięci.

0 głosów
odpowiedź 24 października 2018 przez aram100 Użytkownik (500 p.)
Dzięki wielkie za odpowiedź, mam jeszcze jedno pytanie

ESI wskazuje na adres tekstu w little endian , a ECX zawiera jego liczbę znaków - przekonwertuj tekst na big endian tak aby rejestr EDI wskazywał na jego początek

Coś takiego?

BSWAP ESI
mov EDI, [ECX]
mov EDI, ESI

 

- nie wiem czy to ostatnie polecenie zrobi to o co chodzi
komentarz 24 października 2018 przez aram100 Użytkownik (500 p.)
Albo coś z OFFSET kombinować?...
komentarz 24 października 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Wykonując BSWAP na ESI dokonujesz zmiany kolejności bitów adresu stringa, który jest zapisany w ESI, a nie kolejności bitów w bajtach tego stringa.

Musisz przejść po każdym bajcie stringa i zmienić "endianowość" każdego bajtu bswapem.

Przykładowy pseudokod:

dopóki ECX > 0:
     zamień kolejność bitów w aktualnym bajcie
     przesuń wskaźnik ESI do następnego bajtu stringa
     zmniejsz ECX

Oczywiście warto na początku skopiować sobie zawartość ESI do EDI, żeby zapamiętać sobie początek naszego stringa (w powyższym algorytmie tracimy informację o początku, bo przesuwamy ESI).

Tracimy też informację o rozmiarze napisu, więc możesz sobie tę pętlę zorganizować inaczej (np. użyć jakiegoś rejestru jako zmiennej licznikowej i zwiększać ją, dopóki będzie ona mniejsza od rozmiaru stringa, czyli ECX). 

PS Podczas rozpatrywania kolejnych bajtów przesuwać wskaźnik możesz sobie dodając 1 do adresu w ESI lub używając insturkcji LEA. 

PPS Możliwości na rozwiązanie zadania jest oczywiście kilka, to tylko jedna z nich.

Podobne pytania

0 głosów
0 odpowiedzi 189 wizyt
pytanie zadane 1 grudnia 2023 w Assembler przez hutsalo1998 Użytkownik (540 p.)
0 głosów
3 odpowiedzi 867 wizyt
pytanie zadane 23 listopada 2023 w Assembler przez hutsalo1998 Użytkownik (540 p.)
0 głosów
1 odpowiedź 803 wizyt
pytanie zadane 12 maja 2020 w Assembler przez evela Nowicjusz (120 p.)

93,605 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,096 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...