Advertisement
Guest User

Untitled

a guest
Feb 6th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.98 KB | None | 0 0
  1. proc OperateCrDrRegister OperationType: Word ; OptionalData: LongWord|Uint64
  2. ; CH = NN - Номер действия [rCR:20h, wCR:22h, rDR:21h, wDR:23h]
  3. ; CL = XX - Номер регистра [0..15]
  4. ; rDX = Опциональные данные для записи (если CH = 22h или 23h)
  5.  
  6. ; XX - Номер регистра: [[C0, C8, D0, D8, E0, E8, F0, F8]]
  7. ; NN - Действие (r/w) и регистр (CR/DR) : [[rCR:20h, wCR:22h, rDR:21h, wDR:23h]]
  8.  
  9. ; 0F NN XX | x86|x64 | mov rAX, xR0..xR7 | mov xR0..xR7 , rAX
  10. ; F0 0F NN C0 | x86 | mov EAX, xR8..xR15 | mov xR8..xR15, EAX
  11. ; 44 0F NN XX | x64 | mov RAX, xR8..xR15 | mov xR8..xR15, RAX
  12.  
  13. ; Проверяем NN на валидность:
  14. @ActionChecking:
  15. mov eax, 23212220h ; Перебираем все варианты: 20h, 22h, 21h и 23h
  16. cmp ch, al
  17. je @ValidationSuccessful
  18. shr eax, 8
  19. test eax, eax
  20. jz @ValidationFailed
  21.  
  22. @ValidationSuccessful:
  23.  
  24. ; Проверяем на валидность номер регистра
  25. cmp cl, 15
  26. jg @ValidationFailed ; Если номер регистра > 15 - невалидный номер
  27.  
  28. cmp cl, 7
  29. jg @NumberIsGreaterThan7 ; Если номер [8..15] - четырёхбайтовый машинный код
  30.  
  31. ; Высчитываем байт, определяющий номер регистра:
  32. mov al, cl
  33. mov cl, 8 ; Байты, определяющие номер регистра, идут со смещением 8
  34. mul cl
  35. mov cl, al
  36. add cl, 0C0h ; CL = 0xC0 + ByteNumber * 8 - байт, определяющий номер регистра
  37.  
  38. ; Путинская многоходовочка!
  39. mov ax, 900Fh ; В CH - номер операции, в AH - NOP
  40. xchg ah, ch ; Поменяем их местами: в CH - NOP, в AH - номер операции
  41.  
  42. ; AX = NN0Fh | AH = NN | AL = 0F |
  43. ; CX = 90XXh | CH = 90 | CL = XX |
  44. ; Lo Hi
  45. mov word [InstructionBlock + 0], ax ; 0F NN
  46. mov word [InstructionBlock + 2], cx ; XX 90
  47. jmp @ExecuteInstruction
  48.  
  49. @NumberIsGreaterThan7:
  50. if defined x64
  51. mov al, cl
  52. mov cl, 8 ; Байты, определяющие номер регистра, идут со смещением 8
  53. mul cl
  54. add al, 0C0h ; CH = 0xC0 + ByteNumber * 8 - байт, определяющий номер регистра
  55. mov cl, al
  56. xchg ah, al
  57. mov ax, 0F44h
  58.  
  59. ; AX = 0F44h | AH = 0F | AL = 44 |
  60. ; CX = XXNNh | CH = XX | CL = NN |
  61. ; Lo Hi
  62. mov word [InstructionBlock + 0], ax ; 44 0F
  63. mov word [InstructionBlock + 2], cx ; NN XX
  64. else
  65. xchg ch, cl
  66. shl cx, 16
  67. mov cx, 0FF0h ; ECX = XXNN0FF0h
  68. mov eax, ecx
  69. mov dword [InstructionBlock], eax ; F0 0F NN XX
  70. end if
  71.  
  72. @ExecuteInstruction:
  73.  
  74. if defined x64
  75. mov rax, rdx
  76. else
  77. mov eax, edx
  78. end if
  79.  
  80. InstructionBlock db 4 dup 90h ; Резервируем место под инструкцию
  81.  
  82. @ValidationFailed:
  83. ret
  84.  
  85. endp
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement