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, ...