2015-07-03 37 views
7

byłem debugowanie kodu CLR w montażu i dostał się do liniiCo qword ptr [hexvalue] znaczy bez podstawy zarejestrować

mov rax, qword ptr [ff4053c0h] 

myślę qword ptr [ff4053c0h] odnosi się do łańcucha, który mnie interesuje, ale ff4053c0h nie jest prawidłową lokalizacją pamięci. Czytanie o numerze qword ptr wydaje się odwoływać do adresu opartego na rejestrze podstawowym (np. qword ptr [rsp+30h] ma 30 bajtów na stosie), ale nie mogę znaleźć tego, co to znaczy bez rejestru bazowego.

+0

Odnosi się do lokalizacji adresu wskazanej przez 'ff4053c0h' jako słowo czterokrotne (64 bity). Cokolwiek 64-bitowa wartość znajduje się pod tym adresem, zostanie załadowane do 'rax'. Jeśli adres nie jest prawidłowy, oznacza to problem. Jesteś pewien, że to nie jest prawidłowe? – lurker

Odpowiedz

7

Gdy nie podano rejestru podstawowego, oznacza to data segment (http://www.osdata.com/system/physical/memory.htm). W twoim kodzie mov rax, qword ptr [ff4053c0h] oznacza "weź 8 bajtów z przesunięcia segmentu danych FF4053C0h i umieść je w RAX".

Podczas prawidłowego wskazywania obecność rejestru podstawowego, takiego jak rsp, wyraźnie wskazuje segment stosu. W twoim przypadku żaden rejestr podstawowy nie oznacza segmentu danych.

Teraz, o dużej liczbie "FF4053C0h", która jest "4 282 405 824", możliwe jest posiadanie 4 Gb adresowalnej pamięci (http://wiki.osdev.org/Protected_Mode), która potwierdza, że ​​linia kodu może być poprawna i ma dostęp do przesunięcia FF4053C0h w dużym segmencie danych (http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html).

Inne źródło = Assembly: Using the Data Segment Register (DS).

+0

Powiedziałem, że adres jest nieprawidłowy, ponieważ gdy go szukam w oknie pamięci w Visual Studio Debugger pokazał on mapowanie pamięci (? Zamiast zawartości). Okno pamięci powinno domyślnie wyświetlać segment danych, więc nie jestem pewien, czego mi brakuje, sprawdzę to później. – Rattle

+0

@Rattle, system operacyjny może zabezpieczyć dostęp do pamięci przez inne procesy, więc te procesy nie widzą chronionej pamięci. –

5

bez komplikowania rzeczy bez powodu:

Oznacza to, że wartość 64-bitowa jest odczytywany z adresu 0ff4053c0h do rejestru RAX.

Adres musi być ważny, sprawdź ponownie.
Parametr QWORD PTR to tylko specyfikator rozmiaru (tutaj redundantny, ale poprawia czytelność), nie jest powiązany z rejestrowaniem bazy.

Jeśli naprawdę interesują Cię różne tryby adresowania, jakie posiada procesor, możesz przeczytać podręczniki Intel (w tym Google).

0

Przenosisz wartość 64-bitową z pamięci do rejestru rax. Wartość odczytuje się z adresu ff4053c0h. qword ptr jest podpowiedzią dla asemblera, aby utworzył kod operacji (kod maszynowy) za pomocą stałego adresu 64-bitowego. Podana wartość to wartość 32-bitowa (8 cyfr szesnastkowych => 8 razy cyfra szesnastkowa/litera => 8 * 4bit => 32-bitowa).

Istnieją ruchome kody operacyjne, które obsługują operacje 32-bitowe, ale (najprawdopodobniej sprawdzają specyfikacje dla procesora/trybu), a nie do ładowania pamięci do rejestru 64-bitowego. Tak więc qword jest potrzebny, aby zapewnić asemblerowi, który naprawdę chce wyrazić adres 64-bitowy.

Aby uzyskać komentarz na temat adresu wskazującego na niezdefiniowaną pamięć (patrz komentarze na aceptowaną odpowiedź), należy rozumieć, że w dzisiejszych czasach każdy proces ma przydzieloną tabelę pamięci wirtualnej. Pamięć wirtualna zasadniczo odwzorowuje adres logiczny na adres w prawdziwej pamięci. Zapobiega wyświetlaniu i zmienianiu pamięci, która nie należy do procesu, zapewniając dużą stabilność działającego systemu.

Mając dwa procesy, które dzielą część pamięci, możliwe jest, że każdy proces będzie widział tę samą pamięć fizyczną pod różnymi adresami logicznymi. System operacyjny decyduje o tym, jak wygląda pamięć wirtualna każdego procesu.

Mapowanie odbywa się na poziomie strony (np. Strona = 4KB), a procesor wykonuje wewnętrzne mapowanie.

Ta koncepcja dotyczy mapowania plików w pamięci i współużytkowania pamięci między różnymi procesami. W ten sposób możesz zmapować plik 2GB do pamięci i mieć 10 procesów pracujących równocześnie z tym samym zmapowanym plikiem, podczas gdy zużywa się tylko (co najwyżej) 2 GB pamięci rzeczywistej. Jest to sposób, w jaki plik cache-caching jest najczęściej wykonywany na poziomie systemu operacyjnego.