2015-10-21 14 views
5

Jak działa MOVSX instrukcja montażu w tym przykładzie:Jak działa instrukcja montażu MOVSX?

MOVSX ECX,BYTE PTR DS:[EDX]

W tym przypadku, oto stan rejestrów:
ECX = 0000000F
EDX = 0012FD9F

Z tego, co myślałem, pobiera ostatnie bajty [EDX] = 9F, przenosi je do ECX, a następnie znak rozszerza, aby dopasować 16 bitów = 0000009F. Jednak rzeczywisty wynik to 00000016. Czy ktoś może pomóc mi wyjaśnić, gdzie się mylę?

Odpowiedz

4

To częściowo poprawne. Jednak:

BYTE PTR DS:[EDX] uzyskuje bajt o adresie znajdujący się pod adresem przechowywanym w EDX. Ten bajt jest kopiowany do ECX na najmniej znaczący bajt, a reszta jest wypełniona znakiem bajtu.

Dla nieoczekiwany wynik, oznacza to, że pod adresem pamięci 0x12FD9F bajt 0x16 znajduje.


Uwagi:

  • Segment Zastąp Prefiks DS: nie jest tu konieczna. [EDX] automatycznie odnosi się do DS.

„adres pamięci” odnosi się zarówno wirtualne lub pamięci fizycznej tutaj

1

Wiele instrukcje Intel/AMD x86 dostępne są w formacie „modrm” - mają dwa operandy, z których jeden musi być rejestrem, z których drugim może być rejestr lub odniesienie do pamięci, którego adres jest określany przez bajt modrm kodowania instrukcji, i ewentualnie przez kolejne bajty instrukcji, takie jak sib (skalowany bajt indeksu) i natychmiastowe przesunięcie stałej/pamięci. A także bajt z możliwym segmentem segmentu.

Zazwyczaj są REG instrukcje reg/mem, formy

rsrcdst += rsrc 
or 
    rsrcdst += Memory[ ... addressessing mode ...] 

Ale kod montażowej x86 nie posiada osobne opcodes/mnemoniki Instrukcja do reg, reg i reg, mem form tych instrukcji. To, czy operand jest rejestrem, czy lokalizacją pamięci, jest wskazywane w asemblerze przez składnię złożenia.

W tym przypadku kod montaż jest

MOVSX ECX, BYTE PTR DS: [EDX]

Dyspozycja opcode jest MOVSX.

Argumentem docelowym jest rejestracja ECX.

Argument źródłowy to "BYTE PTR DS: [EDX]". To jest odniesienie do pamięci wskazane przez kilka rzeczy: (1) nawiasy kwadratowe wokół "[EDX]" - nawiasy kwadratowe są skrótem dla Memory [...adres...]. (2) prefiks "DS:", który wskazuje, że znajduje się w segmencie danych. Rejestrowane operandy nie mają takiego przedrostka segmentu. (3) "BYTE PTR" - który mówi "weź adres pamięci określony przez" DS: [EDX] "i zinterpretuj go jako odwołujący się do 8-bitowego bajtu w pamięci".

Podejrzewam, że to, co naprawdę chcesz to

MOVSX ECX,DL 

„DL” jest nazwą dla niskich 8 bitów 32-bitowego rejestru EDX. To znaczy. DL = EDX.bits [7: 0]. Niestety, monterzy x86 zwykle don; t przyjąć składnię jak „EDX.bits [7: 0]” (chyba, że ​​napisał je), więc trzeba wiedzieć, historycznych nazw rejestrów podrzędnych:

AL = EAX.bits[7:0] 
AH = EAX.bits[15:8] 
AX = EAX.bits[15:0] 
EAX = 32 bit register that "covers" all of the above 

i tak w dniu: BL, CL, DL, DI, ...