Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- proc OperateCrDrRegister OperationType: Word ; OptionalData: LongWord|Uint64
- ; CH = NN - Номер действия [rCR:20h, wCR:22h, rDR:21h, wDR:23h]
- ; CL = XX - Номер регистра [0..15]
- ; rDX = Опциональные данные для записи (если CH = 22h или 23h)
- ; XX - Номер регистра: [[C0, C8, D0, D8, E0, E8, F0, F8]]
- ; NN - Действие (r/w) и регистр (CR/DR) : [[rCR:20h, wCR:22h, rDR:21h, wDR:23h]]
- ; 0F NN XX | x86|x64 | mov rAX, xR0..xR7 | mov xR0..xR7 , rAX
- ; F0 0F NN C0 | x86 | mov EAX, xR8..xR15 | mov xR8..xR15, EAX
- ; 44 0F NN XX | x64 | mov RAX, xR8..xR15 | mov xR8..xR15, RAX
- ; Проверяем NN на валидность:
- @ActionChecking:
- mov eax, 23212220h ; Перебираем все варианты: 20h, 22h, 21h и 23h
- cmp ch, al
- je @ValidationSuccessful
- shr eax, 8
- test eax, eax
- jz @ValidationFailed
- @ValidationSuccessful:
- ; Проверяем на валидность номер регистра
- cmp cl, 15
- jg @ValidationFailed ; Если номер регистра > 15 - невалидный номер
- cmp cl, 7
- jg @NumberIsGreaterThan7 ; Если номер [8..15] - четырёхбайтовый машинный код
- ; Высчитываем байт, определяющий номер регистра:
- mov al, cl
- mov cl, 8 ; Байты, определяющие номер регистра, идут со смещением 8
- mul cl
- mov cl, al
- add cl, 0C0h ; CL = 0xC0 + ByteNumber * 8 - байт, определяющий номер регистра
- ; Путинская многоходовочка!
- mov ax, 900Fh ; В CH - номер операции, в AH - NOP
- xchg ah, ch ; Поменяем их местами: в CH - NOP, в AH - номер операции
- ; AX = NN0Fh | AH = NN | AL = 0F |
- ; CX = 90XXh | CH = 90 | CL = XX |
- ; Lo Hi
- mov word [InstructionBlock + 0], ax ; 0F NN
- mov word [InstructionBlock + 2], cx ; XX 90
- jmp @ExecuteInstruction
- @NumberIsGreaterThan7:
- if defined x64
- mov al, cl
- mov cl, 8 ; Байты, определяющие номер регистра, идут со смещением 8
- mul cl
- add al, 0C0h ; CH = 0xC0 + ByteNumber * 8 - байт, определяющий номер регистра
- mov cl, al
- xchg ah, al
- mov ax, 0F44h
- ; AX = 0F44h | AH = 0F | AL = 44 |
- ; CX = XXNNh | CH = XX | CL = NN |
- ; Lo Hi
- mov word [InstructionBlock + 0], ax ; 44 0F
- mov word [InstructionBlock + 2], cx ; NN XX
- else
- xchg ch, cl
- shl cx, 16
- mov cx, 0FF0h ; ECX = XXNN0FF0h
- mov eax, ecx
- mov dword [InstructionBlock], eax ; F0 0F NN XX
- end if
- @ExecuteInstruction:
- if defined x64
- mov rax, rdx
- else
- mov eax, edx
- end if
- InstructionBlock db 4 dup 90h ; Резервируем место под инструкцию
- @ValidationFailed:
- ret
- endp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement