jakie działanie ma rozkaz asemblera cs:

0

mam zapytanie w temacie kodowania w asemblerze
jakie działanie ma rozkaz np CS:
a drugie pytanie czy mozliwe jest zmiana wartości IP, lecz nie poprzez RIP
pozdrawiam

0

jakie działanie ma rozkaz np CS:

http://ref.x86asm.net/coder32.html

czy mozliwe jest zmiana wartości IP, lecz nie poprzez RIP

jmp / call

0

czy mozliwe jest zmiana wartości IP, lecz nie poprzez RIP

Nie rozumiem pytania. Zmiana instruction pointera jest powodowana operacjami skoków, więc wszelkie jmp, jle, je, jne... oraz call. Ale pytanie jest bez sensu, bo IP nie zmienisz "bezpośrednio" jakimś movem.

1

Brzmi jakby ktoś dostał wejściówke na zajęciach z architektury komputerów :D

0

Kiedyś tam używało się adresacji SEGMENT:OFFSET, CS: to wskazanie offsetu w ramach segmentu "Code Segment".

0

Ponieważ kod jest zawsze pobierany z CS: (i pobierany przez JMP/CALL etc) , to PREFIX CS mógłby wpływać na pobieranie jakiejś stałej (danej) z segmentu kodu.
CS jest prefixem, a nie jest samodzielnym rozkazem.

1
  1. rejestry segmentowe (wszystkie 16-bitowe) - tych najlepiej nie dotykać w Linuksie:

♦ segment kodu CS - mówi procesorowi, gdzie znajdują się dla niego instrukcje.
♦ segment danych DS - ten najczęściej pokazuje na miejsce, gdzie trzymamy nasze zmienne.
♦ segment stosu SS - dzięki niemu wiemy, w którym segmencie jest nasz stos. O tym, czym w
ogóle jest stos, powiem w następnej części.
♦ segment dodatkowy ES - zazwyczaj pokazuje na to samo, co DS - na nasze zmienne.
♦ FS i GS - nie mają specjalnego przeznaczenia. Są tu na wypadek, gdyby zabrakło nam innych
rejestrów segmentowych.

...

• zapis CS : SI (rejestr segmentowy + dowolny zwykły) będzie najczęściej oznaczać wskaźnik do
jakiegoś obiektu w pamięci (o pamięci opowiem następnym razem). Rejestr segmentowy zawiera
oczywiście segment, w którym znajduje się ów obiekt, a rejestr zwykły - offset (przesunięcie, adres w
tym segmencie) tegoż obiektu.

Źródło: http://www.student.chemia.uj.edu.pl/~mrozek/USl/oprogramowanie/dokumentacja/asm_pdf_linux.pdf

Proponuję tego pdf'a przeczytać "od deski do deski". Odsyłam także m.in. do:
https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

1
  1. Nie ma jednego assemblera. Każdy procesor ma swoją listę rozkazów, a jeszcze dla każdej architektury znajdziesz co najmniej kilka wariantów ich zapisu (np. Intel, AT&T, FASM). Co więcej często wchodzą w grę niuanse związane z systemem operacyjnym. Tak więc nauczcie się podawać choć architekturę i system operacyjny.

  2. Zakładając, że piszesz o x86, to CS nie jest rozkazem tylko rejestrem. Żeby było zabawniej, w kodzie 64-bitowym (dla którego typowy jest rejstr RIP, który wspominasz) rejstru CS się raczej nie używa. Pamiętam, że systemy operacyjne używają rejestrów segmentowych w różny sposób, ale to raczej mało istotne szczegóły. Rejestr CS był używany w architekturze 16bitowej, aby rozwiązać problem z adresacją pamięci - 16bitów pozwala zaadresować tylko 64kB pamięci, więc wprowadzono rejestry segmentowe aby rozszerzyć przestrzeń adresową (szczegóły przytoczono wyżej). We współczesnych procesorach x86 ten rejestr wciąż istnieje ze względu na kompatybilność wsteczną. To trochę zabawne, ale te procesory zaraz po włączeniu zasilania działają w trybie 16bitowym (tzw. real-mode) i obowiązuje je taka adresacja, ale odkąd mamy UEFI, przejście w tryb chroniony (32/64-bity) jest jedną z pierwszych rzeczy jakie w ogóle się dzieją, więc można raczej już o tym zapomnieć jeśli nie planujesz dłubać w firmwarze czy SMM.

  3. Dalej ciągnąc hipotezę, że mówimy o x86_64, rejestr RIP i rejestr IP nie są odrębne od siebie. IP to najniższe 16-bitów rejestru RIP, ale i to nie ma wielkiego znaczenia, bo RIP nie jest rejestrem ogólnego przeznaczenia (jak RAX, RBX, RSI, RDI, itd.), więc nigdy nie zmieniamy go za pomocą instrukcji mov, add, itd. Chyba jedyną instrukcją, która pozwala ustawić wartość rejestru RIP, na takiej zasadzie jak mov jest jmp i nie ma tu mowy o wyborze tylko najniższych 16-bitów. Podobnie inne instrukcje: je, ja, jb, ret, itd zawsze traktują RIP jako całość. Zatem odpowiedź na drugie pytanie zasadniczo brzmi nie. No, chyba, że mówimy o wariancie jmp z trybu rzeczywistego (który jak najbardziej jest częścią x86_64), wówczas tylko najniższe 16-bitów tego rejestru się zmienia. ;) Jest też wariant jmp z adresem względym, 16-bitowym, tu też może zajść sytuacja, że zmieni się tylko najniższe 16-bitów tego rejestru. :D

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