Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1685 lines
67 KiB

  1. #include "ntsdp.hpp"
  2. #include "i386_asm.h"
  3. PUCHAR X86SearchOpcode(PUCHAR);
  4. // type and size table is ordered on enum of operand types
  5. OPNDTYPE mapOpndType[] = {
  6. { typAX, sizeB }, // opnAL - AL register - byte
  7. { typAX, sizeW }, // opnAX - AX register - word
  8. { typAX, sizeV }, // opneAX - eAX register - (d)word
  9. { typCL, sizeB }, // opnCL - CX register - byte
  10. { typDX, sizeW }, // opnDX - DX register - word (DX)
  11. { typAbs, sizeV }, // opnAp - absolute pointer (16:16/32)
  12. { typExp, sizeB }, // opnEb - expression (mem/reg) - byte
  13. { typExp, sizeW }, // opnEw - expression (mem/reg) - word
  14. { typExp, sizeV }, // opnEv - expression (mem/reg) - (d)word
  15. { typGen, sizeB }, // opnGb - general register - byte
  16. { typGen, sizeW }, // opnGw - general register - word
  17. { typGen, sizeV }, // opnGv - general register - (d)word
  18. { typGen, sizeD }, // opnGd - general register - dword
  19. { typIm1, sizeB }, // opnIm1 - immediate - value 1
  20. { typIm3, sizeB }, // opnIm3 - immediate - value 3
  21. { typImm, sizeB }, // opnIb - immediate - byte
  22. { typImm, sizeW }, // opnIw - immediate - word
  23. { typImm, sizeV }, // opnIv - immediate - (d)word
  24. { typJmp, sizeB }, // opnJb - relative jump - byte
  25. { typJmp, sizeV }, // opnJv - relative jump - (d)word
  26. { typMem, sizeX }, // opnM - memory pointer - nosize
  27. { typMem, sizeA }, // opnMa - memory pointer - (16:16, 32:32)
  28. { typMem, sizeB }, // opnMb - memory pointer - byte
  29. { typMem, sizeW }, // opnMw - memory pointer - word
  30. { typMem, sizeD }, // opnMd - memory pointer - dword
  31. { typMem, sizeP }, // opnMp - memory pointer - (d)(f)word
  32. { typMem, sizeS }, // opnMs - memory pointer - sword
  33. { typMem, sizeQ }, // opnMq - memory pointer - qword
  34. { typMem, sizeT }, // opnMt - memory pointer - ten-byte
  35. { typMem, sizeV }, // opnMv - memory pointer - (d)word
  36. { typCtl, sizeD }, // opnCd - control register - dword
  37. { typDbg, sizeD }, // opnDd - debug register - dword
  38. { typTrc, sizeD }, // opnTd - trace register - dword
  39. { typReg, sizeD }, // opnRd - general register - dword
  40. { typSt, sizeT }, // opnSt - floating point top-of-stack
  41. { typSti, sizeT }, // opnSti - floating point index-on-stack
  42. { typSeg, sizeW }, // opnSeg - segment register - PUSH / POP
  43. { typSgr, sizeW }, // opnSw - segment register - MOV
  44. { typXsi, sizeB }, // opnXb - string source - byte
  45. { typXsi, sizeV }, // opnXv - string source - (d)word
  46. { typYdi, sizeB }, // opnYb - string destination - byte
  47. { typYdi, sizeV }, // opnYv - string destination - (d)word
  48. { typOff, sizeB }, // opnOb - memory offset - byte
  49. { typOff, sizeV }, // opnOv - memory offset - (d)word
  50. { typImmEx, sizeB }, // opnIbe - immediate - sign-extended byte
  51. };
  52. UCHAR szAAA[] = {
  53. 'a', 'a', 'a', '\0',
  54. 0x37, asNone + tEnd + eEnd };
  55. UCHAR szAAD[] = {
  56. 'a', 'a', 'd', '\0',
  57. 0xd5, as0x0a + tEnd + eEnd };
  58. UCHAR szAAM[] = {
  59. 'a', 'a', 'm', '\0',
  60. 0xd4, as0x0a + tEnd + eEnd };
  61. UCHAR szAAS[] = {
  62. 'a', 'a', 's', '\0',
  63. 0x3f, asNone + tEnd + eEnd };
  64. UCHAR szADC[] = {
  65. 'a', 'd', 'c', '\0',
  66. 0x14, opnAL, opnIb + tEnd,
  67. 0x15, opneAX, opnIv + tEnd,
  68. 0x80, asReg2, opnEb, opnIb + tEnd,
  69. 0x83, asReg2, opnEv, opnIbe + tEnd,
  70. 0x81, asReg2, opnEv, opnIv + tEnd,
  71. 0x10, opnEb, opnGb + tEnd,
  72. 0x11, opnEv, opnGv + tEnd,
  73. 0x12, opnGb, opnEb + tEnd,
  74. 0x13, opnGv, opnEv + tEnd + eEnd };
  75. UCHAR szADD[] = {
  76. 'a', 'd', 'd', '\0',
  77. 0x04, opnAL, opnIb + tEnd,
  78. 0x05, opneAX, opnIv + tEnd,
  79. 0x80, asReg0, opnEb, opnIb + tEnd,
  80. 0x83, asReg0, opnEv, opnIbe + tEnd,
  81. 0x81, asReg0, opnEv, opnIv + tEnd,
  82. 0x00, opnEb, opnGb + tEnd,
  83. 0x01, opnEv, opnGv + tEnd,
  84. 0x02, opnGb, opnEb + tEnd,
  85. 0x03, opnGv, opnEv + tEnd + eEnd };
  86. UCHAR szAND[] = {
  87. 'a', 'n', 'd', '\0',
  88. 0x24, opnAL, opnIb + tEnd,
  89. 0x25, opneAX, opnIv + tEnd,
  90. 0x80, asReg4, opnEb, opnIb + tEnd,
  91. 0x83, asReg4, opnEv, opnIb + tEnd,
  92. 0x81, asReg4, opnEv, opnIv + tEnd,
  93. 0x20, opnEb, opnGb + tEnd,
  94. 0x21, opnEv, opnGv + tEnd,
  95. 0x22, opnGb, opnEb + tEnd,
  96. 0x23, opnGv, opnEv + tEnd + eEnd };
  97. UCHAR szARPL[] = {
  98. 'a', 'r', 'p', 'l', '\0',
  99. 0x63, opnEw, opnGw + tEnd + eEnd };
  100. UCHAR szBOUND[] = {
  101. 'b', 'o', 'u', 'n', 'd', '\0',
  102. 0x62, opnGv, opnMa + tEnd + eEnd };
  103. UCHAR szBSF[] = {
  104. 'b', 's', 'f', '\0',
  105. 0x0f, 0xbc, opnGv, opnEv + tEnd + eEnd };
  106. UCHAR szBSR[] = {
  107. 'b', 's', 'r', '\0',
  108. 0x0f, 0xbd, opnGv, opnEv + tEnd + eEnd };
  109. UCHAR szBSWAP[] = {
  110. 'b', 's', 'w', 'a', 'p', '\0',
  111. 0x0f, 0xc8, asOpRg, opnGd + tEnd + eEnd };
  112. UCHAR szBT[] = {
  113. 'b', 't', '\0',
  114. 0x0f, 0xa3, opnEv, opnGv + tEnd,
  115. 0x0f, 0xba, asReg4, opnEv, opnIb + tEnd + eEnd };
  116. UCHAR szBTC[] = {
  117. 'b', 't', 'c', '\0',
  118. 0x0f, 0xbb, opnEv, opnGv + tEnd,
  119. 0x0f, 0xba, asReg7, opnEv, opnIb + tEnd + eEnd };
  120. UCHAR szBTR[] = {
  121. 'b', 't', 'r', '\0',
  122. 0x0f, 0xb3, opnEv, opnGv + tEnd,
  123. 0x0f, 0xba, asReg6, opnEv, opnIb + tEnd + eEnd };
  124. UCHAR szBTS[] = {
  125. 'b', 't', 's', '\0',
  126. 0x0f, 0xab, opnEv, opnGv + tEnd,
  127. 0x0f, 0xba, asReg5, opnEv, opnIb + tEnd + eEnd };
  128. UCHAR szCALL[] = {
  129. 'c', 'a', 'l', 'l', '\0',
  130. 0xe8, opnJv + tEnd,
  131. 0xff, asReg2, asMpNx, opnEv + tEnd,
  132. 0xff, asReg3, opnMp + tEnd,
  133. 0x9a, opnAp + tEnd + eEnd };
  134. UCHAR szCBW[] = {
  135. 'c', 'b', 'w', '\0',
  136. 0x98, asSiz0 + tEnd + eEnd };
  137. UCHAR szCDQ[] = {
  138. 'c', 'd', 'q', '\0',
  139. 0x99, asSiz1 + tEnd + eEnd };
  140. UCHAR szCLC[] = {
  141. 'c', 'l', 'c', '\0',
  142. 0xf8, asNone + tEnd + eEnd };
  143. UCHAR szCLD[] = {
  144. 'c', 'l', 'd', '\0',
  145. 0xfc, asNone + tEnd + eEnd };
  146. UCHAR szCLI[] = {
  147. 'c', 'l', 'i', '\0',
  148. 0xfa, asNone + tEnd + eEnd };
  149. UCHAR szCLTS[] = {
  150. 'c', 'l', 't', 's', '\0',
  151. 0x0f, 0x06, asNone + tEnd + eEnd };
  152. UCHAR szCMC[] = {
  153. 'c', 'm', 'c', '\0',
  154. 0xf5, asNone + tEnd + eEnd };
  155. UCHAR szCMP[] = {
  156. 'c', 'm', 'p', '\0',
  157. 0x3c, opnAL, opnIb + tEnd,
  158. 0x3d, opneAX, opnIv + tEnd,
  159. 0x80, asReg7, opnEb, opnIb + tEnd,
  160. 0x83, asReg7, opnEv, opnIb + tEnd,
  161. 0x81, asReg7, opnEv, opnIv + tEnd,
  162. 0x38, opnEb, opnGb + tEnd,
  163. 0x39, opnEv, opnGv + tEnd,
  164. 0x3a, opnGb, opnEb + tEnd,
  165. 0x3b, opnGv, opnEv + tEnd + eEnd };
  166. UCHAR szCMPS[] = {
  167. 'c', 'm', 'p', 's', '\0',
  168. 0xa6, opnXb, opnYb + tEnd,
  169. 0xa7, opnXv, opnYv + tEnd + eEnd };
  170. UCHAR szCMPSB[] = {
  171. 'c', 'm', 'p', 's', 'b', '\0',
  172. 0xa6, asNone + tEnd + eEnd };
  173. UCHAR szCMPSD[] = {
  174. 'c', 'm', 'p', 's', 'd', '\0',
  175. 0xa7, asSiz1 + tEnd + eEnd };
  176. UCHAR szCMPSW[] = {
  177. 'c', 'm', 'p', 's', 'w', '\0',
  178. 0xa7, asSiz0 + tEnd + eEnd };
  179. UCHAR szCMPXCHG[] = {
  180. 'c', 'm', 'p', 'x', 'c', 'h', 'g', '\0',
  181. 0x0f, 0xb0, opnEb, opnGb + tEnd,
  182. 0x0f, 0xb1, opnEv, opnGv + tEnd + eEnd };
  183. UCHAR szCMPXCHG8B[] = {
  184. 'c', 'm', 'p', 'x', 'c', 'h', 'g', '8', 'b', '\0',
  185. 0x0f, 0xc7, asReg1, opnMq + tEnd + eEnd };
  186. UCHAR szCPUID[] = {
  187. 'c', 'p', 'u', 'i', 'd', '\0',
  188. 0x0f, 0xa2, asNone + tEnd + eEnd };
  189. UCHAR szCS[] = {
  190. 'c', 's', ':', '\0',
  191. 0x2e, asPrfx + tEnd + eEnd };
  192. UCHAR szCWD[] = {
  193. 'c', 'w', 'd', '\0',
  194. 0x99, asSiz0 + tEnd + eEnd };
  195. UCHAR szCWDE[] = {
  196. 'c', 'w', 'd', 'e', '\0',
  197. 0x98, asSiz1 + tEnd + eEnd };
  198. UCHAR szDAA[] = {
  199. 'd', 'a', 'a', '\0',
  200. 0x27, asNone + tEnd + eEnd };
  201. UCHAR szDAS[] = {
  202. 'd', 'a', 's', '\0',
  203. 0x2f, asNone + tEnd + eEnd };
  204. UCHAR szDEC[] = {
  205. 'd', 'e', 'c', '\0',
  206. 0x48, asOpRg, opnGv + tEnd,
  207. 0xfe, asReg1, opnEb + tEnd,
  208. 0xff, asReg1, opnEv + tEnd + eEnd };
  209. UCHAR szDIV[] = {
  210. 'd', 'i', 'v', '\0',
  211. 0xf6, asReg6, opnEb + tEnd,
  212. 0xf7, asReg6, opnEv + tEnd,
  213. 0xf6, asReg6, opnAL, opnEb + tEnd,
  214. 0xf7, asReg6, opneAX, opnEv + tEnd + eEnd };
  215. UCHAR szDS[] = {
  216. 'd', 's', ':', '\0',
  217. 0x3e, asPrfx + tEnd + eEnd };
  218. UCHAR szENTER[] = {
  219. 'e', 'n', 't', 'e', 'r', '\0',
  220. 0xc8, opnIw, opnIb + tEnd + eEnd };
  221. UCHAR szES[] = {
  222. 'e', 's', ':', '\0',
  223. 0x36, asPrfx + tEnd + eEnd };
  224. UCHAR szF2XM1[] = {
  225. 'f', '2', 'x', 'm', '1', '\0',
  226. 0xd8, 0xf0, asNone + tEnd + eEnd };
  227. UCHAR szFABS[] = {
  228. 'f', 'a', 'b', 's', '\0',
  229. 0xd9, 0xe1, asNone + tEnd + eEnd };
  230. UCHAR szFADD[] = {
  231. 'f', 'a', 'd', 'd', '\0',
  232. 0xd8, asReg0, opnMd, asFSiz + tEnd,
  233. 0xdc, asReg0, opnMq + tEnd,
  234. 0xd8, 0xc0, opnSt, opnSti + tEnd,
  235. 0xdc, 0xc0, opnSti, opnSt + tEnd,
  236. 0xdc, 0xc1, asNone + tEnd + eEnd };
  237. UCHAR szFADDP[] = {
  238. 'f', 'a', 'd', 'd', 'p', '\0',
  239. 0xde, 0xc0, opnSti, opnSt + tEnd + eEnd };
  240. UCHAR szFBLD[] = {
  241. 'f', 'b', 'l', 'd', '\0',
  242. 0xdf, asReg4, opnMt + tEnd + eEnd };
  243. UCHAR szFBSTP[] = {
  244. 'f', 'b', 's', 't', 'p', '\0',
  245. 0xdf, asReg6, opnMt + tEnd + eEnd };
  246. UCHAR szFCHS[] = {
  247. 'f', 'c', 'h', 's', '\0',
  248. 0xd9, 0xe0, asNone + tEnd + eEnd };
  249. UCHAR szFCLEX[] = {
  250. 'f', 'c', 'l', 'e', 'x', '\0',
  251. 0xdb, 0xe2, asWait + tEnd + eEnd };
  252. UCHAR szFCOM[] = {
  253. 'f', 'c', 'o', 'm', '\0',
  254. 0xd8, 0xd1, asNone + tEnd,
  255. 0xd8, 0xd0, opnSti + tEnd,
  256. 0xd8, asReg2, opnMd, asFSiz + tEnd,
  257. 0xdc, asReg2, opnMq + tEnd + eEnd };
  258. UCHAR szFCOMP[] = {
  259. 'f', 'c', 'o', 'm', 'p', '\0',
  260. 0xd8, 0xd9, asNone + tEnd,
  261. 0xd8, 0xd8, opnSti + tEnd,
  262. 0xd8, asReg3, opnMd, asFSiz + tEnd,
  263. 0xdc, asReg3, opnMq + tEnd + eEnd };
  264. UCHAR szFCOMPP[] = {
  265. 'f', 'c', 'o', 'm', 'p', 'p', '\0',
  266. 0xde, 0xd9, asNone + tEnd + eEnd };
  267. UCHAR szFCOS[] = {
  268. 'f', 'c', 'o', 's', '\0',
  269. 0xd9, 0xff, asNone + tEnd + eEnd };
  270. UCHAR szFDECSTP[] = {
  271. 'f', 'd', 'e', 'c', 's', 't', 'p', '\0',
  272. 0xd9, 0xf6, asWait + tEnd + eEnd };
  273. UCHAR szFDISI[] = {
  274. 'f', 'd', 'i', 's', 'i', '\0',
  275. 0xdb, 0xe1, asWait + tEnd + eEnd };
  276. UCHAR szFDIV[] = {
  277. 'f', 'd', 'i', 'v', '\0',
  278. 0xdc, 0xf9, asNone + tEnd,
  279. 0xd8, asReg6, opnMd, asFSiz + tEnd,
  280. 0xdc, asReg6, opnMq + tEnd,
  281. 0xd8, 0xf0, opnSt, opnSti + tEnd,
  282. 0xdc, 0xf8, opnSti, opnSt + tEnd + eEnd };
  283. UCHAR szFDIVP[] = {
  284. 'f', 'd', 'i', 'v', 'p', '\0',
  285. 0xde, 0xf8, opnSti, opnSt + tEnd + eEnd };
  286. UCHAR szFDIVR[] = {
  287. 'f', 'd', 'i', 'v', 'r', '\0',
  288. 0xde, 0xf1, asNone + tEnd,
  289. 0xd8, asReg7, opnMd, asFSiz + tEnd,
  290. 0xdc, asReg7, opnMq + tEnd,
  291. 0xd8, 0xf8, opnSt, opnSti + tEnd,
  292. 0xdc, 0xf0, opnSti, opnSt + tEnd + eEnd };
  293. UCHAR szFDIVRP[] = {
  294. 'f', 'd', 'i', 'v', 'r', 'p', '\0',
  295. 0xde, 0xf0, opnSti, opnSt + tEnd + eEnd };
  296. UCHAR szFENI[] = {
  297. 'f', 'e', 'n', 'i', '\0',
  298. 0xdb, 0xe0, asWait + tEnd + eEnd };
  299. UCHAR szFFREE[] = {
  300. 'f', 'f', 'r', 'e', 'e', '\0',
  301. 0xdd, 0xc0, asWait, opnSti + tEnd + eEnd };
  302. UCHAR szFIADD[] = {
  303. 'f', 'i', 'a', 'd', 'd', '\0',
  304. 0xde, asReg0, opnMw, asFSiz + tEnd,
  305. 0xda, asReg0, opnMd + tEnd + eEnd };
  306. UCHAR szFICOM[] = {
  307. 'f', 'i', 'c', 'o', 'm', '\0',
  308. 0xde, asReg2, opnMw, asFSiz + tEnd,
  309. 0xda, asReg2, opnMd + tEnd + eEnd };
  310. UCHAR szFICOMP[] = {
  311. 'f', 'i', 'c', 'o', 'm', 'p', '\0',
  312. 0xde, asReg3, opnMw, asFSiz + tEnd,
  313. 0xda, asReg3, opnMd + tEnd + eEnd };
  314. UCHAR szFIDIV[] = {
  315. 'f', 'i', 'd', 'i', 'v', '\0',
  316. 0xde, asReg6, opnMw, asFSiz + tEnd,
  317. 0xda, asReg6, opnMd + tEnd + eEnd };
  318. UCHAR szFIDIVR[] = {
  319. 'f', 'i', 'd', 'i', 'v', 'r', '\0',
  320. 0xde, asReg7, opnMw, asFSiz + tEnd,
  321. 0xda, asReg7, opnMd + tEnd + eEnd };
  322. UCHAR szFILD[] = {
  323. 'f', 'i', 'l', 'd', '\0',
  324. 0xdf, asReg0, opnMw, asFSiz + tEnd,
  325. 0xdb, asReg0, opnMd + tEnd,
  326. 0xdf, asReg5, opnMq + tEnd + eEnd };
  327. UCHAR szFIMUL[] = {
  328. 'f', 'i', 'm', 'u', 'l', '\0',
  329. 0xde, asReg1, opnMw, asFSiz + tEnd,
  330. 0xda, asReg1, opnMd + tEnd + eEnd };
  331. UCHAR szFINCSTP[] = {
  332. 'f', 'i', 'n', 'c', 's', 't', 'p', '\0',
  333. 0xd9, 0xf7, asWait + tEnd + eEnd };
  334. UCHAR szFINIT[] = {
  335. 'f', 'i', 'n', 'i', 't', '\0',
  336. 0xdb, 0xe3, asWait + tEnd + eEnd };
  337. UCHAR szFIST[] = {
  338. 'f', 'i', 's', 't', '\0',
  339. 0xdf, asReg2, opnMw, asFSiz + tEnd,
  340. 0xdb, asReg2, opnMd + tEnd + eEnd };
  341. UCHAR szFISTP[] = {
  342. 'f', 'i', 's', 't', 'p', '\0',
  343. 0xdf, asReg3, opnMw, asFSiz + tEnd,
  344. 0xdb, asReg3, opnMd + tEnd,
  345. 0xdf, asReg7, opnMq + tEnd + eEnd };
  346. UCHAR szFISUB[] = {
  347. 'f', 'i', 's', 'u', 'b', '\0',
  348. 0xde, asReg4, opnMw, asFSiz + tEnd,
  349. 0xda, asReg4, opnMd + tEnd + eEnd };
  350. UCHAR szFISUBR[] = {
  351. 'f', 'i', 's', 'u', 'b', 'r', '\0',
  352. 0xde, asReg5, opnMw, asFSiz + tEnd,
  353. 0xda, asReg5, opnMd + tEnd + eEnd };
  354. UCHAR szFLD[] = {
  355. 'f', 'l', 'd', '\0',
  356. 0xd9, asReg0, opnMd, asFSiz + tEnd,
  357. 0xdd, asReg0, opnMq + tEnd,
  358. 0xdb, asReg5, opnMt + tEnd,
  359. 0xd9, 0xc0, opnSti + tEnd + eEnd };
  360. UCHAR szFLD1[] = {
  361. 'f', 'l', 'd', '1', '\0',
  362. 0xd9, 0xe8, asNone + tEnd + eEnd };
  363. UCHAR szFLDCW[] = {
  364. 'f', 'l', 'd', 'c', 'w', '\0',
  365. 0xd9, asWait, asReg5, opnMw + tEnd + eEnd };
  366. UCHAR szFLDENV[] = {
  367. 'f', 'l', 'd', 'e', 'n', 'v', '\0',
  368. 0xd9, asWait, asReg4, opnMw + tEnd + eEnd };
  369. UCHAR szFLDL2E[] = {
  370. 'f', 'l', 'd', 'l', '2', 'e', '\0',
  371. 0xd9, 0xea, asNone + tEnd + eEnd };
  372. UCHAR szFLDL2T[] = {
  373. 'f', 'l', 'd', 'l', '2', 't', '\0',
  374. 0xd9, 0xe9, asNone + tEnd + eEnd };
  375. UCHAR szFLDLG2[] = {
  376. 'f', 'l', 'd', 'l', 'g', '2', '\0',
  377. 0xd9, 0xec, asNone + tEnd + eEnd };
  378. UCHAR szFLDLN2[] = {
  379. 'f', 'l', 'd', 'l', 'n', '2', '\0',
  380. 0xd9, 0xed, asNone + tEnd + eEnd };
  381. UCHAR szFLDPI[] = {
  382. 'f', 'l', 'd', 'p', 'i', '\0',
  383. 0xd9, 0xeb, asNone + tEnd + eEnd };
  384. UCHAR szFLDZ[] = {
  385. 'f', 'l', 'd', 'z', '\0',
  386. 0xd9, 0xee, asNone + tEnd + eEnd };
  387. UCHAR szFMUL[] = {
  388. 'f', 'm', 'u', 'l', '\0',
  389. 0xde, 0xc9, asNone + tEnd,
  390. 0xd8, asReg1, opnMd, asFSiz + tEnd,
  391. 0xdc, asReg1, opnMq + tEnd,
  392. 0xd8, 0xc8, opnSt, opnSti + tEnd,
  393. 0xdc, 0xc8, opnSti, opnSt + tEnd + eEnd };
  394. UCHAR szFMULP[] = {
  395. 'f', 'm', 'u', 'l', 'p', '\0',
  396. 0xde, 0xc8, opnSti, opnSt + tEnd + eEnd };
  397. UCHAR szFNCLEX[] = {
  398. 'f', 'n', 'c', 'l', 'e', 'x', '\0',
  399. 0xdb, 0xe2, asNone + tEnd + eEnd };
  400. UCHAR szFNDISI[] = {
  401. 'f', 'n', 'd', 'i', 's', 'i', '\0',
  402. 0xdb, 0xe1, asNone + tEnd + eEnd };
  403. UCHAR szFNENI[] = {
  404. 'f', 'n', 'e', 'n', 'i', '\0',
  405. 0xdb, 0xe0, asNone + tEnd + eEnd };
  406. UCHAR szFNINIT[] = {
  407. 'f', 'n', 'i', 'n', 'i', 't', '\0',
  408. 0xdb, 0xe3, asNone + tEnd + eEnd };
  409. UCHAR szFNOP[] = {
  410. 'f', 'n', 'o', 'p', '\0',
  411. 0xd9, 0xd0, asNone + tEnd + eEnd };
  412. UCHAR szFNSAVE[] = {
  413. 'f', 'n', 's', 'a', 'v', 'e', '\0',
  414. 0xdd, asReg6, opnM + tEnd + eEnd };
  415. UCHAR szFNSTCW[] = {
  416. 'f', 'n', 's', 't', 'c', 'w', '\0',
  417. 0xd9, asReg7, opnMw + tEnd + eEnd };
  418. UCHAR szFNSTENV[] = {
  419. 'f', 'n', 's', 't', 'e', 'n', 'v', '\0',
  420. 0xd9, asReg6, opnM + tEnd + eEnd };
  421. UCHAR szFNSTSW[] = {
  422. 'f', 'n', 's', 't', 's', 'w', '\0',
  423. 0xdf, 0xe0, asNone + tEnd,
  424. 0xdf, 0xe0, opnAX + tEnd,
  425. 0xdf, asReg7, opnMw + tEnd + eEnd };
  426. UCHAR szFPATAN[] = {
  427. 'f', 'p', 'a', 't', 'a', 'n', '\0',
  428. 0xd9, 0xf3, asNone + tEnd + eEnd };
  429. UCHAR szFPREM[] = {
  430. 'f', 'p', 'r', 'e', 'm', '\0',
  431. 0xd9, 0xf8, asNone + tEnd + eEnd };
  432. UCHAR szFPREM1[] = {
  433. 'f', 'p', 'r', 'e', 'm', '1', '\0',
  434. 0xd9, 0xf5, asNone + tEnd + eEnd };
  435. UCHAR szFPTAN[] = {
  436. 'f', 'p', 't', 'a', 'n', '\0',
  437. 0xd9, 0xf2, asNone + tEnd + eEnd };
  438. UCHAR szFRNDINT[] = {
  439. 'f', 'r', 'n', 'd', 'i', 'n', 't', '\0',
  440. 0xd9, 0xfc, asNone + tEnd + eEnd };
  441. UCHAR szFRSTOR[] = {
  442. 'f', 'r', 's', 't', 'o', 'r', '\0',
  443. 0xdd, asWait, asReg4, opnM + tEnd + eEnd };
  444. UCHAR szFS[] = {
  445. 'f', 's', ':', '\0',
  446. 0x64, asPrfx + tEnd + eEnd };
  447. UCHAR szFSAVE[] = {
  448. 'f', 's', 'a', 'v', 'e', '\0',
  449. 0xdd, asWait, asReg6, opnM + tEnd + eEnd };
  450. UCHAR szFSCALE[] = {
  451. 'f', 's', 'c', 'a', 'l', 'e', '\0',
  452. 0xd9, 0xfd, asNone + tEnd + eEnd };
  453. UCHAR szFSETPM[] = {
  454. 'f', 's', 'e', 't', 'p', 'm', '\0',
  455. 0xdb, 0xe4, asWait + tEnd + eEnd };
  456. UCHAR szFSIN[] = {
  457. 'f', 's', 'i', 'n', '\0',
  458. 0xd9, 0xfe, asNone + tEnd + eEnd };
  459. UCHAR szFSINCOS[] = {
  460. 'f', 's', 'i', 'n', 'c', 'o', 's', '\0',
  461. 0xd9, 0xfb, asNone + tEnd + eEnd };
  462. UCHAR szFSQRT[] = {
  463. 'f', 's', 'q', 'r', 't', '\0',
  464. 0xd9, 0xfa, asNone + tEnd + eEnd };
  465. UCHAR szFST[] = {
  466. 'f', 's', 't', '\0',
  467. 0xd9, asReg2, opnMd, asFSiz + tEnd,
  468. 0xdd, asReg2, opnMq + tEnd,
  469. 0xdd, 0xd0, opnSti + tEnd + eEnd };
  470. UCHAR szFSTCW[] = {
  471. 'f', 's', 't', 'c', 'w', '\0',
  472. 0xd9, asWait, asReg7, opnMw + tEnd + eEnd };
  473. UCHAR szFSTENV[] = {
  474. 'f', 's', 't', 'e', 'n', 'v', '\0',
  475. 0xd9, asWait, asReg6, opnM + tEnd + eEnd };
  476. UCHAR szFSTP[] = {
  477. 'f', 's', 't', 'p', '\0',
  478. 0xd9, asReg3, opnMd, asFSiz + tEnd,
  479. 0xdd, asReg3, opnMq + tEnd,
  480. 0xdb, asReg7, opnMt + tEnd,
  481. 0xdd, 0xd8, opnSti + tEnd + eEnd };
  482. UCHAR szFSTSW[] = {
  483. 'f', 's', 't', 's', 'w', '\0',
  484. 0xdf, 0xe0, asWait + tEnd,
  485. 0xdf, 0xe0, asWait, opnAX + tEnd,
  486. 0xdd, asWait, asReg7, opnMw + tEnd + eEnd };
  487. UCHAR szFSUB[] = {
  488. 'f', 's', 'u', 'b', '\0',
  489. 0xde, 0xe9, asNone + tEnd,
  490. 0xd8, asReg4, opnMd, asFSiz + tEnd,
  491. 0xdc, asReg4, opnMq + tEnd,
  492. 0xd8, 0xe0, opnSt, opnSti + tEnd,
  493. 0xdc, 0xe8, opnSti, opnSt + tEnd + eEnd };
  494. UCHAR szFSUBP[] = {
  495. 'f', 's', 'u', 'b', 'p', '\0',
  496. 0xde, 0xe8, opnSti, opnSt + tEnd + eEnd };
  497. UCHAR szFSUBR[] = {
  498. 'f', 's', 'u', 'b', 'r', '\0',
  499. 0xde, 0xe1, asNone + tEnd,
  500. 0xd8, asReg5, opnMd, asFSiz + tEnd,
  501. 0xdc, asReg5, opnMq + tEnd,
  502. 0xd8, 0xe8, opnSt, opnSti + tEnd,
  503. 0xdc, 0xe0, opnSti, opnSt + tEnd + eEnd };
  504. UCHAR szFSUBRP[] = {
  505. 'f', 's', 'u', 'b', 'r', 'p', '\0',
  506. 0xde, 0xe0, opnSti, opnSt + tEnd + eEnd };
  507. UCHAR szFTST[] = {
  508. 'f', 't', 's', 't', '\0',
  509. 0xd9, 0xe4, asNone + tEnd + eEnd };
  510. UCHAR szFUCOM[] = {
  511. 'f', 'u', 'c', 'o', 'm', '\0',
  512. 0xdd, 0xe1, asNone, + tEnd,
  513. 0xdd, 0xe0, opnSti + tEnd + eEnd };
  514. UCHAR szFUCOMP[] = {
  515. 'f', 'u', 'c', 'o', 'm', 'p', '\0',
  516. 0xdd, 0xe9, asNone + tEnd,
  517. 0xdd, 0xe8, opnSti + tEnd + eEnd };
  518. UCHAR szFUCOMPP[] = {
  519. 'f', 'u', 'c', 'o', 'm', 'p', 'p', '\0',
  520. 0xda, 0xe9, asNone + tEnd + eEnd };
  521. UCHAR szFWAIT[] = { // same as WAIT
  522. 'f', 'w', 'a', 'i', 't', '\0',
  523. 0x9b, asPrfx + tEnd + eEnd };
  524. UCHAR szFXAM[] = {
  525. 'f', 'x', 'a', 'm', '\0',
  526. 0xd9, 0xe5, asNone + tEnd + eEnd };
  527. UCHAR szFXCH[] = {
  528. 'f', 'x', 'c', 'h', '\0',
  529. 0xd9, 0xc9, asNone + tEnd,
  530. 0xd9, 0xc8, opnSti + tEnd + eEnd };
  531. UCHAR szFXTRACT[] = {
  532. 'f', 'x', 't', 'r', 'a', 'c', 't', '\0',
  533. 0xd9, 0xf4, asNone + tEnd + eEnd };
  534. UCHAR szFYL2X[] = {
  535. 'f', 'y', 'l', '2', 'x', '\0',
  536. 0xd9, 0xf1, asNone + tEnd + eEnd };
  537. UCHAR szFYL2XP1[] = {
  538. 'f', 'y', 'l', '2', 'x', 'p', '1', '\0',
  539. 0xd9, 0xf9, asNone + tEnd + eEnd };
  540. UCHAR szGS[] = {
  541. 'g', 's', ':', '\0',
  542. 0x65, asPrfx + tEnd + eEnd };
  543. UCHAR szHLT[] = {
  544. 'h', 'l', 't', '\0',
  545. 0xf4, asNone + tEnd + eEnd };
  546. UCHAR szIDIV[] = {
  547. 'i', 'd', 'i', 'v', '\0',
  548. 0xf6, asReg7, opnEb + tEnd,
  549. 0xf7, asReg7, opnEv + tEnd,
  550. 0xf6, asReg7, opnAL, opnEb + tEnd,
  551. 0xf7, asReg7, opneAX, opnEv + tEnd + eEnd };
  552. UCHAR szIMUL[] = {
  553. 'i', 'm', 'u', 'l', '\0',
  554. 0xf6, asReg5, opnEb + tEnd,
  555. 0xf7, asReg5, opnEv + tEnd,
  556. 0xf6, asReg5, opnAL, opnEb + tEnd,
  557. 0xf7, asReg5, opneAX, opnEv + tEnd,
  558. 0x0f, 0xaf, opnGv, opnEv + tEnd,
  559. 0x6b, opnGv, opnIbe + tEnd,
  560. 0x69, opnGv, opnIv + tEnd,
  561. 0x6b, opnGv, opnEv, opnIbe + tEnd,
  562. 0x69, opnGv, opnEv, opnIv + tEnd + eEnd };
  563. UCHAR szIN[] = {
  564. 'i', 'n', '\0',
  565. 0xe4, opnAL, opnIb + tEnd,
  566. 0xe5, opneAX, opnIb + tEnd,
  567. 0xec, opnAL, opnDX + tEnd,
  568. 0xed, opneAX, opnDX + tEnd + eEnd };
  569. UCHAR szINC[] = {
  570. 'i', 'n', 'c', '\0',
  571. 0x40, asOpRg, opnGv + tEnd,
  572. 0xfe, asReg0, opnEb + tEnd,
  573. 0xff, asReg0, opnEv + tEnd + eEnd };
  574. UCHAR szINS[] = {
  575. 'i', 'n', 's', '\0',
  576. 0x6c, opnYb, opnDX + tEnd,
  577. 0x6d, opnYv, opnDX + tEnd + eEnd };
  578. UCHAR szINSB[] = {
  579. 'i', 'n', 's', 'b', '\0',
  580. 0x6c, asNone + tEnd + eEnd };
  581. UCHAR szINSD[] = {
  582. 'i', 'n', 's', 'd', '\0',
  583. 0x6d, asSiz1 + tEnd + eEnd };
  584. UCHAR szINSW[] = {
  585. 'i', 'n', 's', 'w', '\0',
  586. 0x6d, asSiz0 + tEnd + eEnd };
  587. UCHAR szINT[] = {
  588. 'i', 'n', 't', '\0',
  589. 0xcc, opnIm3 + tEnd,
  590. 0xcd, opnIb + tEnd + eEnd };
  591. UCHAR szINTO[] = {
  592. 'i', 'n', 't', 'o', '\0',
  593. 0xce, asNone + tEnd + eEnd };
  594. UCHAR szINVD[] = {
  595. 'i', 'n', 'v', 'd', '\0',
  596. 0x0f, 0x08, asNone + tEnd + eEnd };
  597. UCHAR szINVLPG[] = {
  598. 'i', 'n', 'v', 'l', 'p', 'g', '\0',
  599. 0x0f, 0x01, asReg7, opnM + tEnd + eEnd };
  600. UCHAR szIRET[] = {
  601. 'i', 'r', 'e', 't', '\0',
  602. 0xcf, asSiz0 + tEnd + eEnd };
  603. UCHAR szIRETD[] = {
  604. 'i', 'r', 'e', 't', 'd', '\0',
  605. 0xcf, asSiz1 + tEnd + eEnd };
  606. UCHAR szJA[] = { // same as JNBE
  607. 'j', 'a', '\0',
  608. 0x77, opnJb + tEnd,
  609. 0x0f, 0x87, opnJv + tEnd + eEnd };
  610. UCHAR szJAE[] = { // same as JNB, JNC
  611. 'j', 'a', 'e', '\0',
  612. 0x73, opnJb + tEnd,
  613. 0x0f, 0x83, opnJv + tEnd + eEnd };
  614. UCHAR szJB[] = { // same as JC, JNAE
  615. 'j', 'b', '\0',
  616. 0x72, opnJb + tEnd,
  617. 0x0f, 0x82, opnJv + tEnd + eEnd };
  618. UCHAR szJBE[] = { // same as JNA
  619. 'j', 'b', 'e', '\0',
  620. 0x76, opnJb + tEnd,
  621. 0x0f, 0x86, opnJv + tEnd + eEnd };
  622. UCHAR szJC[] = { // same as JB, JNAE
  623. 'j', 'c', '\0',
  624. 0x72, opnJb + tEnd,
  625. 0x0f, 0x82, opnJv + tEnd + eEnd };
  626. UCHAR szJCXZ[] = {
  627. 'j', 'c', 'x', 'z', '\0',
  628. 0xe3, asSiz0, opnJb + tEnd + eEnd };
  629. UCHAR szJECXZ[] = {
  630. 'j', 'e', 'c', 'x', 'z', '\0',
  631. 0xe3, asSiz1, opnJb + tEnd + eEnd };
  632. UCHAR szJE[] = { // same as JZ
  633. 'j', 'e', '\0',
  634. 0x74, opnJb + tEnd,
  635. 0x0f, 0x84, opnJv + tEnd + eEnd };
  636. UCHAR szJG[] = { // same as JNLE
  637. 'j', 'g', '\0',
  638. 0x7f, opnJb + tEnd,
  639. 0x0f, 0x8f, opnJv + tEnd + eEnd };
  640. UCHAR szJGE[] = { // same as JNL
  641. 'j', 'g', 'e', '\0',
  642. 0x7d, opnJb + tEnd,
  643. 0x0f, 0x8d, opnJv + tEnd + eEnd };
  644. UCHAR szJL[] = { // same as JNGE
  645. 'j', 'l', '\0',
  646. 0x7c, opnJb + tEnd,
  647. 0x0f, 0x8c, opnJv + tEnd + eEnd };
  648. UCHAR szJLE[] = { // same as JNG
  649. 'j', 'l', 'e', '\0',
  650. 0x7e, opnJb + tEnd,
  651. 0x0f, 0x8e, opnJv + tEnd + eEnd };
  652. UCHAR szJMP[] = {
  653. 'j', 'm', 'p', '\0',
  654. 0xeb, opnJb + tEnd,
  655. 0xe9, opnJv + tEnd,
  656. 0xff, asReg4, opnEv, asMpNx + tEnd,
  657. 0xff, asReg5, opnMp + tEnd,
  658. 0xea, opnAp + tEnd, + eEnd };
  659. UCHAR szJNA[] = { // same as JBE
  660. 'j', 'n', 'a', '\0',
  661. 0x76, opnJb + tEnd,
  662. 0x0f, 0x86, opnJv + tEnd + eEnd };
  663. UCHAR szJNAE[] = { // same as JB, JC
  664. 'j', 'n', 'a', 'e','\0',
  665. 0x72, opnJb + tEnd,
  666. 0x0f, 0x82, opnJv + tEnd + eEnd };
  667. UCHAR szJNB[] = { // same as JAE, JNC
  668. 'j', 'n', 'b', '\0',
  669. 0x73, opnJb + tEnd,
  670. 0x0f, 0x83, opnJv + tEnd + eEnd };
  671. UCHAR szJNBE[] = { // same as JA
  672. 'j', 'n', 'b', 'e', '\0',
  673. 0x77, opnJb + tEnd,
  674. 0x0f, 0x87, opnJv + tEnd + eEnd };
  675. UCHAR szJNC[] = { // same as JAE, JNB
  676. 'j', 'n', 'c', '\0',
  677. 0x73, opnJb + tEnd,
  678. 0x0f, 0x83, opnJv + tEnd + eEnd };
  679. UCHAR szJNG[] = { // same as JLE
  680. 'j', 'n', 'g', '\0',
  681. 0x7e, opnJb + tEnd,
  682. 0x0f, 0x8e, opnJv + tEnd + eEnd };
  683. UCHAR szJNGE[] = { // same as JNL
  684. 'j', 'n', 'g', 'e', '\0',
  685. 0x7c, opnJb + tEnd,
  686. 0x0f, 0x8c, opnJv + tEnd + eEnd };
  687. UCHAR szJNE[] = { // same as JNZ
  688. 'j', 'n', 'e', '\0',
  689. 0x75, opnJb + tEnd,
  690. 0x0f, 0x85, opnJv + tEnd + eEnd };
  691. UCHAR szJNL[] = { // same as JGE
  692. 'j', 'n', 'l', '\0',
  693. 0x7d, opnJb + tEnd,
  694. 0x0f, 0x8d, opnJv + tEnd + eEnd };
  695. UCHAR szJNLE[] = { // same as JNG
  696. 'j', 'n', 'l', 'e', '\0',
  697. 0x7f, opnJb + tEnd,
  698. 0x0f, 0x8f, opnJv + tEnd + eEnd };
  699. UCHAR szJNO[] = {
  700. 'j', 'n', 'o', '\0',
  701. 0x71, opnJb + tEnd,
  702. 0x0f, 0x81, opnJv + tEnd + eEnd };
  703. UCHAR szJNP[] = { // same as JPO
  704. 'j', 'n', 'p', '\0',
  705. 0x7b, opnJb + tEnd,
  706. 0x0f, 0x8b, opnJv + tEnd + eEnd };
  707. UCHAR szJNS[] = {
  708. 'j', 'n', 's', '\0',
  709. 0x79, opnJb + tEnd,
  710. 0x0f, 0x89, opnJv + tEnd + eEnd };
  711. UCHAR szJNZ[] = { // same as JNE
  712. 'j', 'n', 'z', '\0',
  713. 0x75, opnJb + tEnd,
  714. 0x0f, 0x85, opnJv + tEnd + eEnd };
  715. UCHAR szJO[] = {
  716. 'j', 'o', '\0',
  717. 0x70, opnJb + tEnd,
  718. 0x0f, 0x80, opnJv + tEnd + eEnd };
  719. UCHAR szJP[] = { // same as JPE
  720. 'j', 'p', '\0',
  721. 0x7a, opnJb + tEnd,
  722. 0x0f, 0x8a, opnJv + tEnd + eEnd };
  723. UCHAR szJPE[] = { // same as JP
  724. 'j', 'p', 'e', '\0',
  725. 0x7a, opnJb + tEnd,
  726. 0x0f, 0x8a, opnJv + tEnd + eEnd };
  727. UCHAR szJPO[] = { // same as JNP
  728. 'j', 'p', 'o', '\0',
  729. 0x7b, opnJb + tEnd,
  730. 0x0f, 0x8b, opnJv + tEnd + eEnd };
  731. UCHAR szJS[] = {
  732. 'j', 's', '\0',
  733. 0x78, opnJb + tEnd,
  734. 0x0f, 0x88, opnJv + tEnd + eEnd };
  735. UCHAR szJZ[] = { // same as JE
  736. 'j', 'z', '\0',
  737. 0x74, opnJb + tEnd,
  738. 0x0f, 0x84, opnJv + tEnd + eEnd };
  739. UCHAR szLAHF[] = {
  740. 'l', 'a', 'h', 'f', '\0',
  741. 0x9f, asNone + tEnd + eEnd };
  742. UCHAR szLAR[] = {
  743. 'l', 'a', 'r', '\0',
  744. 0x0f, 0x02, opnGv, opnEv + tEnd + eEnd };
  745. UCHAR szLDS[] = {
  746. 'l', 'd', 's', '\0',
  747. 0xc5, opnGv, opnMp + tEnd + eEnd };
  748. UCHAR szLEA[] = {
  749. 'l', 'e', 'a', '\0',
  750. 0x8d, opnGv, opnM + tEnd + eEnd };
  751. UCHAR szLEAVE[] = {
  752. 'l', 'e', 'a', 'v', 'e', '\0',
  753. 0xc9, asNone + tEnd + eEnd };
  754. UCHAR szLES[] = {
  755. 'l', 'e', 's', '\0',
  756. 0xc4, opnGv, opnMp + tEnd + eEnd };
  757. UCHAR szLFS[] = {
  758. 'l', 'f', 's', '\0',
  759. 0x0f, 0xb4, opnGv, opnMp + tEnd + eEnd };
  760. UCHAR szLGDT[] = {
  761. 'l', 'g', 'd', 't', '\0',
  762. 0x0f, 0x01, asReg2, opnMs + tEnd + eEnd };
  763. UCHAR szLGS[] = {
  764. 'l', 'g', 's', '\0',
  765. 0x0f, 0xb5, opnGv, opnMp + tEnd + eEnd };
  766. UCHAR szLIDT[] = {
  767. 'l', 'i', 'd', 't', '\0',
  768. 0x0f, 0x01, asReg3, opnMs + tEnd + eEnd };
  769. UCHAR szLLDT[] = {
  770. 'l', 'l', 'd', 't', '\0',
  771. 0x0f, 0x00, asReg2, opnEw + tEnd + eEnd };
  772. UCHAR szLMSW[] = {
  773. 'l', 'm', 's', 'w', '\0',
  774. 0x0f, 0x01, asReg6, opnEw + tEnd + eEnd };
  775. UCHAR szLOCK[] = {
  776. 'l', 'o', 'c', 'k', '\0',
  777. 0xf0, asPrfx + tEnd + eEnd };
  778. UCHAR szLODS[] = {
  779. 'l', 'o', 'd', 's', '\0',
  780. 0xac, opnXb + tEnd,
  781. 0xad, opnXv + tEnd + eEnd };
  782. UCHAR szLODSB[] = {
  783. 'l', 'o', 'd', 's', 'b', '\0',
  784. 0xac, asNone + tEnd + eEnd };
  785. UCHAR szLODSD[] = {
  786. 'l', 'o', 'd', 's', 'd', '\0',
  787. 0xad, asSiz1 + tEnd + eEnd };
  788. UCHAR szLODSW[] = {
  789. 'l', 'o', 'd', 's', 'w', '\0',
  790. 0xad, asSiz0 + tEnd + eEnd };
  791. UCHAR szLOOP[] = {
  792. 'l', 'o', 'o', 'p', '\0',
  793. 0xe2, opnJb + tEnd + eEnd };
  794. UCHAR szLOOPE[] = { // same as LOOPZ
  795. 'l', 'o', 'o', 'p', 'e', '\0',
  796. 0xe1, opnJb + tEnd + eEnd };
  797. UCHAR szLOOPNE[] = { // same as LOOPNZ
  798. 'l', 'o', 'o', 'p', 'n', 'e', '\0',
  799. 0xe0, opnJb + tEnd + eEnd };
  800. UCHAR szLOOPNZ[] = { // same as LOOPNE
  801. 'l', 'o', 'o', 'p', 'n', 'z', '\0',
  802. 0xe0, opnJb + tEnd + eEnd };
  803. UCHAR szLOOPZ[] = { // same as LOOPE
  804. 'l', 'o', 'o', 'p', 'z', '\0',
  805. 0xe1, opnJb + tEnd + eEnd };
  806. UCHAR szLSL[] = {
  807. 'l', 's', 'l', '\0',
  808. 0x0f, 0x03, opnGv, opnEv + tEnd + eEnd };
  809. UCHAR szLSS[] = {
  810. 'l', 's', 's', '\0',
  811. 0x0f, 0xb2, opnGv, opnMp + tEnd + eEnd };
  812. UCHAR szLTR[] = {
  813. 'l', 't', 'r', '\0',
  814. 0x0f, 0x00, asReg3, opnEw + tEnd + eEnd };
  815. UCHAR szMOV[] = {
  816. 'm', 'o', 'v', '\0',
  817. 0xa0, opnAL, opnOb + tEnd,
  818. 0xa1, opneAX, opnOv + tEnd,
  819. 0xa2, opnOb, opnAL + tEnd,
  820. 0xa3, opnOv, opneAX + tEnd,
  821. 0x8a, opnGb, opnEb + tEnd,
  822. 0x8b, opnGv, opnEv + tEnd,
  823. 0x88, opnEb, opnGb + tEnd,
  824. 0x89, opnEv, opnGv + tEnd,
  825. 0x8c, asSiz0, opnEw, opnSw + tEnd,
  826. 0x8e, asSiz0, opnSw, opnEw + tEnd,
  827. 0xb0, asOpRg, opnGb, opnIb + tEnd,
  828. 0xb8, asOpRg, opnGv, opnIv + tEnd,
  829. 0xc6, opnEb, opnIb + tEnd,
  830. 0xc7, opnEv, opnIv + tEnd,
  831. 0x0f, 0x20, opnRd, opnCd + tEnd,
  832. 0x0f, 0x21, opnRd, opnDd + tEnd,
  833. 0x0f, 0x22, opnCd, opnRd + tEnd,
  834. 0x0f, 0x23, opnDd, opnRd + tEnd,
  835. 0x0f, 0x24, opnRd, opnTd + tEnd,
  836. 0x0f, 0x26, opnTd, opnRd + tEnd + eEnd };
  837. UCHAR szMOVS[] = {
  838. 'm', 'o', 'v', 's', '\0',
  839. 0xa4, opnXb, opnYb + tEnd,
  840. 0xa5, opnXv, opnYv + tEnd + eEnd };
  841. UCHAR szMOVSB[] = {
  842. 'm', 'o', 'v', 's', 'b', '\0',
  843. 0xa4, asNone + tEnd + eEnd };
  844. UCHAR szMOVSD[] = {
  845. 'm', 'o', 'v', 's', 'd', '\0',
  846. 0xa5, asSiz1 + tEnd + eEnd };
  847. UCHAR szMOVSW[] = {
  848. 'm', 'o', 'v', 's', 'w', '\0',
  849. 0xa5, asSiz0 + tEnd + eEnd };
  850. UCHAR szMOVSX[] = {
  851. 'm', 'o', 'v', 's', 'x', '\0',
  852. 0x0f, 0xbe, opnGv, opnEb + tEnd,
  853. 0x0f, 0xbf, opnGv, opnEw + tEnd + eEnd };
  854. UCHAR szMOVZX[] = {
  855. 'm', 'o', 'v', 'z', 'x', '\0',
  856. 0x0f, 0xb6, opnGv, opnEb + tEnd,
  857. 0x0f, 0xb7, opnGv, opnEw + tEnd + eEnd };
  858. UCHAR szMUL[] = {
  859. 'm', 'u', 'l', '\0',
  860. 0xf6, asReg4, opnEb + tEnd,
  861. 0xf7, asReg4, opnEv + tEnd,
  862. 0xf6, asReg4, opnAL, opnEb + tEnd,
  863. 0xf7, asReg4, opneAX, opnEv + tEnd + eEnd };
  864. UCHAR szNEG[] = {
  865. 'n', 'e', 'g', '\0',
  866. 0xf6, asReg3, opnEb + tEnd,
  867. 0xf7, asReg3, opnEv + tEnd + eEnd };
  868. UCHAR szNOP[] = {
  869. 'n', 'o', 'p', '\0',
  870. 0x90, asNone + tEnd };
  871. UCHAR szNOT[] = {
  872. 'n', 'o', 't', '\0',
  873. 0xf6, asReg2, opnEb + tEnd,
  874. 0xf7, asReg2, opnEv + tEnd + eEnd };
  875. UCHAR szOR[] = {
  876. 'o', 'r', '\0',
  877. 0x0c, opnAL, opnIb + tEnd,
  878. 0x0d, opneAX, opnIv + tEnd,
  879. 0x80, asReg1, opnEb, opnIb + tEnd,
  880. 0x83, asReg1, opnEv, opnIb + tEnd,
  881. 0x81, asReg1, opnEv, opnIv + tEnd,
  882. 0x08, opnEb, opnGb + tEnd,
  883. 0x09, opnEv, opnGv + tEnd,
  884. 0x0a, opnGb, opnEb + tEnd,
  885. 0x0b, opnGv, opnEv + tEnd + eEnd };
  886. UCHAR szOUT[] = {
  887. 'o', 'u', 't', '\0',
  888. 0xe6, opnIb, opnAL + tEnd,
  889. 0xe7, opnIb, opneAX + tEnd,
  890. 0xee, opnDX, opnAL + tEnd,
  891. 0xef, opnDX, opneAX + tEnd + eEnd };
  892. UCHAR szOUTS[] = {
  893. 'o', 'u', 't', 's', '\0',
  894. 0x6e, opnDX, opnYb + tEnd,
  895. 0x6f, opnDX, opnYv + tEnd + eEnd };
  896. UCHAR szOUTSB[] = {
  897. 'o', 'u', 't', 's', 'b', '\0',
  898. 0x6e, asNone + tEnd + eEnd };
  899. UCHAR szOUTSD[] = {
  900. 'o', 'u', 't', 's', 'd', '\0',
  901. 0x6f, asSiz1 + tEnd + eEnd };
  902. UCHAR szOUTSW[] = {
  903. 'o', 'u', 't', 's', 'w', '\0',
  904. 0x6f, asSiz0 + tEnd + eEnd };
  905. UCHAR szPOP[] = {
  906. 'p', 'o', 'p', '\0',
  907. 0x58, asOpRg, opnGv + tEnd,
  908. 0x8f, asReg0, opnMv + tEnd,
  909. 0x1f, opnSeg, segDS, asNone+ tEnd,
  910. 0x07, opnSeg, segES, asNone+ tEnd,
  911. 0x17, opnSeg, segSS, asNone+ tEnd,
  912. 0x0f, 0xa1, opnSeg, segFS, asNone+ tEnd,
  913. 0x0f, 0xa9, opnSeg, segGS, asNone+ tEnd + eEnd };
  914. UCHAR szPOPA[] = {
  915. 'p', 'o', 'p', 'a', '\0',
  916. 0x61, asSiz0 + tEnd + eEnd };
  917. UCHAR szPOPAD[] = {
  918. 'p', 'o', 'p', 'a', 'd', '\0',
  919. 0x61, asSiz1 + tEnd + eEnd };
  920. UCHAR szPOPF[] = {
  921. 'p', 'o', 'p', 'f', '\0',
  922. 0x9d, asSiz0 + tEnd + eEnd };
  923. UCHAR szPOPFD[] = {
  924. 'p', 'o', 'p', 'f', 'd', '\0',
  925. 0x9d, asSiz1 + tEnd + eEnd };
  926. UCHAR szPUSH[] = {
  927. 'p', 'u', 's', 'h', '\0',
  928. 0x50, asOpRg, opnGv + tEnd,
  929. 0xff, asReg6, opnMv + tEnd,
  930. 0x6a, opnIb + tEnd,
  931. 0x68, opnIv + tEnd,
  932. 0x0e, opnSeg, segCS, asNone+ tEnd,
  933. 0x1e, opnSeg, segDS, asNone+ tEnd,
  934. 0x06, opnSeg, segES, asNone+ tEnd,
  935. 0x16, opnSeg, segSS, asNone+ tEnd,
  936. 0x0f, 0xa0, opnSeg, segFS, asNone+ tEnd,
  937. 0x0f, 0xa8, opnSeg, segGS, asNone+ tEnd + eEnd };
  938. UCHAR szPUSHA[] = {
  939. 'p', 'u', 's', 'h', 'a', '\0',
  940. 0x60, asSiz0 + tEnd + eEnd };
  941. UCHAR szPUSHAD[] = {
  942. 'p', 'u', 's', 'h', 'a', 'd', '\0',
  943. 0x60, asSiz1 + tEnd + eEnd };
  944. UCHAR szPUSHF[] = {
  945. 'p', 'u', 's', 'h', 'f', '\0',
  946. 0x9c, asSiz0 + tEnd + eEnd };
  947. UCHAR szPUSHFD[] = {
  948. 'p', 'u', 's', 'h', 'f', 'd', '\0',
  949. 0x9c, asSiz1 + tEnd + eEnd };
  950. UCHAR szRCL[] = {
  951. 'r', 'c', 'l', '\0',
  952. 0xd0, asReg2, opnEb, opnIm1 + tEnd,
  953. 0xd2, asReg2, opnEb, opnCL + tEnd,
  954. 0xc0, asReg2, opnEb, opnIb + tEnd,
  955. 0xd1, asReg2, opnEv, opnIm1 + tEnd,
  956. 0xd3, asReg2, opnEv, opnCL + tEnd,
  957. 0xc1, asReg2, opnEv, opnIb + tEnd + eEnd };
  958. UCHAR szRCR[] = {
  959. 'r', 'c', 'r', '\0',
  960. 0xd0, asReg3, opnEb, opnIm1 + tEnd,
  961. 0xd2, asReg3, opnEb, opnCL + tEnd,
  962. 0xc0, asReg3, opnEb, opnIb + tEnd,
  963. 0xd1, asReg3, opnEv, opnIm1 + tEnd,
  964. 0xd3, asReg3, opnEv, opnCL + tEnd,
  965. 0xc1, asReg3, opnEv, opnIb + tEnd + eEnd };
  966. UCHAR szRDMSR[] = {
  967. 'r', 'd', 'm', 's', 'r', '\0',
  968. 0x0f, 0x32, asNone + tEnd + eEnd };
  969. UCHAR szRDTSC[] = {
  970. 'r', 'd', 't', 's', 'c', '\0',
  971. 0x0f, 0x31, asNone + tEnd + eEnd };
  972. UCHAR szREP[] = { // same as REPE, REPZ
  973. 'r', 'e', 'p', '\0',
  974. 0xf3, asPrfx + tEnd + eEnd };
  975. UCHAR szREPE[] = { // same as REP, REPZ
  976. 'r', 'e', 'p', 'e', '\0',
  977. 0xf3, asPrfx + tEnd + eEnd };
  978. UCHAR szREPZ[] = { // same as REP, REPE
  979. 'r', 'e', 'p', 'z', '\0',
  980. 0xf3, asPrfx + tEnd + eEnd };
  981. UCHAR szREPNE[] = { // same as REPNZ
  982. 'r', 'e', 'p', 'n', 'e', '\0',
  983. 0xf2, asPrfx + tEnd + eEnd };
  984. UCHAR szREPNZ[] = { // same as REPNE
  985. 'r', 'e', 'p', 'n', 'z', '\0',
  986. 0xf2, asPrfx + tEnd + eEnd };
  987. UCHAR szRET[] = { // same as RETN
  988. 'r', 'e', 't', '\0',
  989. 0xc3, asNone + tEnd,
  990. 0xc2, opnIw + tEnd + eEnd };
  991. UCHAR szRETF[] = {
  992. 'r', 'e', 't', 'f', '\0',
  993. 0xcb, asNone + tEnd,
  994. 0xca, opnIw + tEnd + eEnd };
  995. UCHAR szRETN[] = { // same as RET
  996. 'r', 'e', 't', 'n', '\0',
  997. 0xc3, asNone + tEnd,
  998. 0xc2, opnIw + tEnd + eEnd };
  999. UCHAR szROL[] = {
  1000. 'r', 'o', 'l', '\0',
  1001. 0xd0, asReg0, opnEb, opnIm1 + tEnd,
  1002. 0xd2, asReg0, opnEb, opnCL + tEnd,
  1003. 0xc0, asReg0, opnEb, opnIb + tEnd,
  1004. 0xd1, asReg0, opnEv, opnIm1 + tEnd,
  1005. 0xd3, asReg0, opnEv, opnCL + tEnd,
  1006. 0xc1, asReg0, opnEv, opnIb + tEnd + eEnd };
  1007. UCHAR szROR[] = {
  1008. 'r', 'o', 'r', '\0',
  1009. 0xd0, asReg1, opnEb, opnIm1 + tEnd,
  1010. 0xd2, asReg1, opnEb, opnCL + tEnd,
  1011. 0xc0, asReg1, opnEb, opnIb + tEnd,
  1012. 0xd1, asReg1, opnEv, opnIm1 + tEnd,
  1013. 0xd3, asReg1, opnEv, opnCL + tEnd,
  1014. 0xc1, asReg1, opnEv, opnIb + tEnd + eEnd };
  1015. UCHAR szRSM[] = {
  1016. 'r', 's', 'm', '\0',
  1017. 0x0f, 0xaa, asNone + tEnd + eEnd };
  1018. UCHAR szSAHF[] = {
  1019. 's', 'a', 'h', 'f', '\0',
  1020. 0x9e, asNone + tEnd + eEnd };
  1021. UCHAR szSAL[] = {
  1022. 's', 'a', 'l', '\0',
  1023. 0xd0, asReg4, opnEb, opnIm1 + tEnd,
  1024. 0xd2, asReg4, opnEb, opnCL + tEnd,
  1025. 0xc0, asReg4, opnEb, opnIb + tEnd,
  1026. 0xd1, asReg4, opnEv, opnIm1 + tEnd,
  1027. 0xd3, asReg4, opnEv, opnCL + tEnd,
  1028. 0xc1, asReg4, opnEv, opnIb + tEnd + eEnd };
  1029. UCHAR szSAR[] = {
  1030. 's', 'a', 'r', '\0',
  1031. 0xd0, asReg7, opnEb, opnIm1 + tEnd,
  1032. 0xd2, asReg7, opnEb, opnCL + tEnd,
  1033. 0xc0, asReg7, opnEb, opnIb + tEnd,
  1034. 0xd1, asReg7, opnEv, opnIm1 + tEnd,
  1035. 0xd3, asReg7, opnEv, opnCL + tEnd,
  1036. 0xc1, asReg7, opnEv, opnIb + tEnd + eEnd };
  1037. UCHAR szSBB[] = {
  1038. 's', 'b', 'b', '\0',
  1039. 0x1c, opnAL, opnIb + tEnd,
  1040. 0x1d, opneAX, opnIv + tEnd,
  1041. 0x80, asReg3, opnEb, opnIb + tEnd,
  1042. 0x83, asReg3, opnEv, opnIbe + tEnd,
  1043. 0x81, asReg3, opnEv, opnIv + tEnd,
  1044. 0x18, opnEb, opnGb + tEnd,
  1045. 0x19, opnEv, opnGv + tEnd,
  1046. 0x1a, opnGb, opnEb + tEnd,
  1047. 0x1b, opnGv, opnEv + tEnd + eEnd };
  1048. UCHAR szSCAS[] = {
  1049. 's', 'c', 'a', 's', '\0',
  1050. 0xae, opnYb + tEnd,
  1051. 0xaf, opnYv + tEnd + eEnd };
  1052. UCHAR szSCASB[] = {
  1053. 's', 'c', 'a', 's', 'b', '\0',
  1054. 0xae, asNone + tEnd + eEnd };
  1055. UCHAR szSCASD[] = {
  1056. 's', 'c', 'a', 's', 'd', '\0',
  1057. 0xaf, asSiz1 + tEnd + eEnd };
  1058. UCHAR szSCASW[] = {
  1059. 's', 'c', 'a', 's', 'w', '\0',
  1060. 0xaf, asSiz0 + tEnd + eEnd };
  1061. UCHAR szSETA[] = { // same as SETNBE
  1062. 's', 'e', 't', 'a', '\0',
  1063. 0x0f, 0x97, opnEb + tEnd + eEnd };
  1064. UCHAR szSETAE[] = { // same as SETNB, SETNC
  1065. 's', 'e', 't', 'a', 'e', '\0',
  1066. 0x0f, 0x93, opnEb + tEnd + eEnd };
  1067. UCHAR szSETB[] = { // same as SETC, SETNAE
  1068. 's', 'e', 't', 'b', '\0',
  1069. 0x0f, 0x92, opnEb + tEnd + eEnd };
  1070. UCHAR szSETBE[] = { // same as SETNA
  1071. 's', 'e', 't', 'b', 'e', '\0',
  1072. 0x0f, 0x96, opnEb + tEnd + eEnd };
  1073. UCHAR szSETC[] = { // same as SETB, SETNAE
  1074. 's', 'e', 't', 'c', '\0',
  1075. 0x0f, 0x92, opnEb + tEnd + eEnd };
  1076. UCHAR szSETE[] = { // same as SETZ
  1077. 's', 'e', 't', 'e', '\0',
  1078. 0x0f, 0x94, opnEb + tEnd + eEnd };
  1079. UCHAR szSETG[] = { // same as SETNLE
  1080. 's', 'e', 't', 'g', '\0',
  1081. 0x0f, 0x9f, opnEb + tEnd + eEnd };
  1082. UCHAR szSETGE[] = { // same as SETNL
  1083. 's', 'e', 't', 'g', 'e', '\0',
  1084. 0x0f, 0x9d, opnEb + tEnd + eEnd };
  1085. UCHAR szSETL[] = { // same as SETNGE
  1086. 's', 'e', 't', 'l', '\0',
  1087. 0x0f, 0x9c, opnEb + tEnd + eEnd };
  1088. UCHAR szSETLE[] = { // same as SETNG
  1089. 's', 'e', 't', 'l', 'e', '\0',
  1090. 0x0f, 0x9e, opnEb + tEnd + eEnd };
  1091. UCHAR szSETNA[] = { // same as SETBE
  1092. 's', 'e', 't', 'n', 'a', '\0',
  1093. 0x0f, 0x96, opnEb + tEnd + eEnd };
  1094. UCHAR szSETNAE[] = { // same as SETB, SETC
  1095. 's', 'e', 't', 'n', 'a', 'e', '\0',
  1096. 0x0f, 0x92, opnEb + tEnd + eEnd };
  1097. UCHAR szSETNB[] = { // same as SETAE, SETNC
  1098. 's', 'e', 't', 'n', 'b', '\0',
  1099. 0x0f, 0x93, opnEb + tEnd + eEnd };
  1100. UCHAR szSETNBE[] = { // same as SETA
  1101. 's', 'e', 't', 'n', 'b', 'e', '\0',
  1102. 0x0f, 0x97, opnEb + tEnd + eEnd };
  1103. UCHAR szSETNC[] = { // same as SETAE, SETNC
  1104. 's', 'e', 't', 'n', 'c', '\0',
  1105. 0x0f, 0x93, opnEb + tEnd + eEnd };
  1106. UCHAR szSETNE[] = { // same as SETNZ
  1107. 's', 'e', 't', 'n', 'e', '\0',
  1108. 0x0f, 0x95, opnEb + tEnd + eEnd };
  1109. UCHAR szSETNG[] = { // same as SETLE
  1110. 's', 'e', 't', 'n', 'g', '\0',
  1111. 0x0f, 0x9e, opnEb + tEnd + eEnd };
  1112. UCHAR szSETNGE[] = { // same as SETL
  1113. 's', 'e', 't', 'n', 'g', 'e', '\0',
  1114. 0x0f, 0x9c, opnEb + tEnd + eEnd };
  1115. UCHAR szSETNL[] = { // same as SETGE
  1116. 's', 'e', 't', 'n', 'l', '\0',
  1117. 0x0f, 0x9d, opnEb + tEnd + eEnd };
  1118. UCHAR szSETNLE[] = { // same as SETG
  1119. 's', 'e', 't', 'n', 'l', 'e', '\0',
  1120. 0x0f, 0x9f, opnEb + tEnd + eEnd };
  1121. UCHAR szSETNO[] = {
  1122. 's', 'e', 't', 'n', 'o', '\0',
  1123. 0x0f, 0x91, opnEb + tEnd + eEnd };
  1124. UCHAR szSETNP[] = { // same as SETPO
  1125. 's', 'e', 't', 'n', 'p', '\0',
  1126. 0x0f, 0x9b, opnEb + tEnd + eEnd };
  1127. UCHAR szSETNS[] = {
  1128. 's', 'e', 't', 'n', 's', '\0',
  1129. 0x0f, 0x99, opnEb + tEnd + eEnd };
  1130. UCHAR szSETNZ[] = { // same as SETNE
  1131. 's', 'e', 't', 'n', 'z', '\0',
  1132. 0x0f, 0x95, opnEb + tEnd + eEnd };
  1133. UCHAR szSETO[] = {
  1134. 's', 'e', 't', 'o', '\0',
  1135. 0x0f, 0x90, opnEb + tEnd + eEnd };
  1136. UCHAR szSETP[] = { // same as SETPE
  1137. 's', 'e', 't', 'p', '\0',
  1138. 0x0f, 0x9a, opnEb + tEnd + eEnd };
  1139. UCHAR szSETPE[] = { // same as SETP
  1140. 's', 'e', 't', 'p', 'e', '\0',
  1141. 0x0f, 0x9a, opnEb + tEnd + eEnd };
  1142. UCHAR szSETPO[] = { // same as SETNP
  1143. 's', 'e', 't', 'p', 'o', '\0',
  1144. 0x0f, 0x9b, opnEb + tEnd + eEnd };
  1145. UCHAR szSETS[] = {
  1146. 's', 'e', 't', 's', '\0',
  1147. 0x0f, 0x98, opnEb + tEnd + eEnd };
  1148. UCHAR szSETZ[] = { // same as SETE
  1149. 's', 'e', 't', 'z', '\0',
  1150. 0x0f, 0x94, opnEb + tEnd + eEnd };
  1151. UCHAR szSGDT[] = {
  1152. 's', 'g', 'd', 't', '\0',
  1153. 0x0f, 0x01, asReg0, opnMs + tEnd + eEnd };
  1154. UCHAR szSHL[] = {
  1155. 's', 'h', 'l', '\0',
  1156. 0xd0, asReg4, opnEb, opnIm1 + tEnd,
  1157. 0xd2, asReg4, opnEb, opnCL + tEnd,
  1158. 0xc0, asReg4, opnEb, opnIb + tEnd,
  1159. 0xd1, asReg4, opnEv, opnIm1 + tEnd,
  1160. 0xd3, asReg4, opnEv, opnCL + tEnd,
  1161. 0xc1, asReg4, opnEv, opnIb + tEnd + eEnd };
  1162. UCHAR szSHLD[] = {
  1163. 's', 'h', 'l', 'd', '\0',
  1164. 0x0f, 0xa4, opnEv, opnGv, opnIb + tEnd,
  1165. 0x0f, 0xa5, opnEv, opnGv, opnCL + tEnd + eEnd };
  1166. UCHAR szSHR[] = {
  1167. 's', 'h', 'r', '\0',
  1168. 0xd0, asReg5, opnEb, opnIm1 + tEnd,
  1169. 0xd2, asReg5, opnEb, opnCL + tEnd,
  1170. 0xc0, asReg5, opnEb, opnIb + tEnd,
  1171. 0xd1, asReg5, opnEv, opnIm1 + tEnd,
  1172. 0xd3, asReg5, opnEv, opnCL + tEnd,
  1173. 0xc1, asReg5, opnEv, opnIb + tEnd + eEnd };
  1174. UCHAR szSHRD[] = {
  1175. 's', 'h', 'r', 'd', '\0',
  1176. 0x0f, 0xac, opnEv, opnGv, opnIb + tEnd,
  1177. 0x0f, 0xad, opnEv, opnGv, opnCL + tEnd + eEnd };
  1178. UCHAR szSIDT[] = {
  1179. 's', 'i', 'd', 't', '\0',
  1180. 0x0f, 0x01, asReg1, opnMs + tEnd + eEnd };
  1181. UCHAR szSLDT[] = {
  1182. 's', 'l', 'd', 't', '\0',
  1183. 0x0f, 0x00, asReg0, opnEw + tEnd + eEnd };
  1184. UCHAR szSMSW[] = {
  1185. 's', 'm', 's', 'w', '\0',
  1186. 0x0f, 0x01, asReg4, opnEw + tEnd + eEnd };
  1187. UCHAR szSS[] = {
  1188. 's', 's', ':', '\0',
  1189. 0x26, asPrfx + tEnd + eEnd };
  1190. UCHAR szSTC[] = {
  1191. 's', 't', 'c', '\0',
  1192. 0xf9, asNone + tEnd + eEnd };
  1193. UCHAR szSTD[] = {
  1194. 's', 't', 'd', '\0',
  1195. 0xfd, asNone + tEnd + eEnd };
  1196. UCHAR szSTI[] = {
  1197. 's', 't', 'i', '\0',
  1198. 0xfb, asNone + tEnd + eEnd };
  1199. UCHAR szSTOS[] = {
  1200. 's', 't', 'o', 's', '\0',
  1201. 0xaa, opnYb + tEnd,
  1202. 0xab, opnYv + tEnd + eEnd };
  1203. UCHAR szSTOSB[] = {
  1204. 's', 't', 'o', 's', 'b', '\0',
  1205. 0xaa, asNone + tEnd + eEnd };
  1206. UCHAR szSTOSD[] = {
  1207. 's', 't', 'o', 's', 'd', '\0',
  1208. 0xab, asSiz1 + tEnd + eEnd };
  1209. UCHAR szSTOSW[] = {
  1210. 's', 't', 'o', 's', 'w', '\0',
  1211. 0xab, asSiz0 + tEnd + eEnd };
  1212. UCHAR szSTR[] = {
  1213. 's', 't', 'r', '\0',
  1214. 0x0f, 0x00, asReg1, opnEw + tEnd + eEnd };
  1215. UCHAR szSUB[] = {
  1216. 's', 'u', 'b', '\0',
  1217. 0x2c, opnAL, opnIb + tEnd,
  1218. 0x2d, opneAX, opnIv + tEnd,
  1219. 0x80, asReg5, opnEb, opnIb + tEnd,
  1220. 0x83, asReg5, opnEv, opnIbe + tEnd,
  1221. 0x81, asReg5, opnEv, opnIv + tEnd,
  1222. 0x28, opnEb, opnGb + tEnd,
  1223. 0x29, opnEv, opnGv + tEnd,
  1224. 0x2a, opnGb, opnEb + tEnd,
  1225. 0x2b, opnGv, opnEv + tEnd + eEnd };
  1226. UCHAR szTEST[] = {
  1227. 't', 'e', 's', 't', '\0',
  1228. 0xa8, opnAL, opnIb + tEnd,
  1229. 0xa9, opneAX, opnIv + tEnd,
  1230. 0xf6, asReg0, opnEb, opnIb + tEnd,
  1231. 0xf7, asReg0, opnEv, opnIv + tEnd,
  1232. 0x84, opnEb, opnGb + tEnd,
  1233. 0x85, opnEv, opnGv + tEnd + eEnd };
  1234. UCHAR szVERR[] = {
  1235. 'v', 'e', 'r', 'r', '\0',
  1236. 0x0f, 0x00, asReg4, opnEw + tEnd + eEnd };
  1237. UCHAR szVERW[] = {
  1238. 'v', 'e', 'r', 'w', '\0',
  1239. 0x0f, 0x00, asReg5, opnEw + tEnd + eEnd };
  1240. UCHAR szWAIT[] = { // same as FWAIT
  1241. 'w', 'a', 'i', 't', '\0',
  1242. 0x9b, asPrfx + tEnd + eEnd };
  1243. UCHAR szWBINVD[] = {
  1244. 'w', 'b', 'i', 'n', 'v', 'd', '\0',
  1245. 0x0f, 0x09, asNone + tEnd + eEnd };
  1246. UCHAR szWRMSR[] = {
  1247. 'w', 'r', 'm', 's', 'r', '\0',
  1248. 0x0f, 0x30, asNone + tEnd + eEnd };
  1249. UCHAR szXADD[] = {
  1250. 'x', 'a', 'd', 'd', '\0',
  1251. 0x0f, 0xc0, opnEb, opnGb + tEnd,
  1252. 0x0f, 0xc1, opnEv, opnGv + tEnd + eEnd };
  1253. UCHAR szXCHG[] = {
  1254. 'x', 'c', 'h', 'g', '\0',
  1255. 0x90, asOpRg, opneAX, opnGv + tEnd,
  1256. 0x90, asOpRg, opnGv, opneAX + tEnd,
  1257. 0x86, opnGb, opnEb + tEnd,
  1258. 0x86, opnEb, opnGb + tEnd,
  1259. 0x87, opnGv, opnEv + tEnd,
  1260. 0x87, opnEv, opnGv + tEnd + eEnd };
  1261. UCHAR szXLAT[] = {
  1262. 'x', 'l', 'a', 't', '\0',
  1263. 0xd7, asNone + tEnd,
  1264. 0xd7, asSeg, opnM + tEnd + eEnd };
  1265. UCHAR szXOR[] = {
  1266. 'x', 'o', 'r', '\0',
  1267. 0x34, opnAL, opnIb + tEnd,
  1268. 0x35, opneAX, opnIv + tEnd,
  1269. 0x80, asReg6, opnEb, opnIb + tEnd,
  1270. 0x83, asReg6, opnEv, opnIb + tEnd,
  1271. 0x81, asReg6, opnEv, opnIv + tEnd,
  1272. 0x30, opnEb, opnGb + tEnd,
  1273. 0x31, opnEv, opnGv + tEnd,
  1274. 0x32, opnGb, opnEb + tEnd,
  1275. 0x33, opnGv, opnEv + tEnd + eEnd };
  1276. PUCHAR OpTable[] = {
  1277. szAAA, szAAD, szAAM, szAAS, szADC, szADD,
  1278. szAND, szARPL, szBOUND, szBSF, szBSR, szBSWAP,
  1279. szBT, szBTC, szBTR, szBTS, szCALL, szCBW,
  1280. szCDQ, szCLC, szCLD, szCLI, szCLTS, szCMC,
  1281. szCMP, szCMPS, szCMPSB, szCMPSD, szCMPSW, szCMPXCHG,
  1282. szCMPXCHG8B, szCPUID, szCS, szCWD, szCWDE, szDAA,
  1283. szDAS, szDEC, szDIV, szDS, szENTER, szES,
  1284. szF2XM1, szFABS, szFADD, szFADDP, szFBLD, szFBSTP,
  1285. szFCHS, szFCLEX, szFCOM, szFCOMP, szFCOMPP, szFCOS,
  1286. szFDECSTP, szFDISI, szFDIV, szFDIVP, szFDIVR, szFDIVRP,
  1287. szFENI, szFFREE, szFIADD, szFICOM, szFICOMP, szFIDIV,
  1288. szFIDIVR, szFILD, szFIMUL, szFINCSTP, szFINIT, szFIST,
  1289. szFISTP, szFISUB, szFISUBR, szFLD, szFLD1, szFLDCW,
  1290. szFLDENV, szFLDL2E, szFLDL2T, szFLDLG2, szFLDLN2, szFLDPI,
  1291. szFLDZ, szFMUL, szFMULP, szFNCLEX, szFNDISI, szFNENI,
  1292. szFNINIT, szFNOP, szFNSAVE, szFNSTCW, szFNSTENV, szFNSTSW,
  1293. szFPATAN, szFPREM, szFPREM1, szFPTAN, szFRNDINT, szFRSTOR,
  1294. szFS, szFSAVE, szFSCALE, szFSETPM, szFSIN, szFSINCOS,
  1295. szFSQRT, szFST, szFSTCW, szFSTENV, szFSTP, szFSTSW,
  1296. szFSUB, szFSUBP, szFSUBR, szFSUBRP, szFTST, szFUCOM,
  1297. szFUCOMP, szFUCOMPP, szFWAIT, szFXAM, szFXCH, szFXTRACT,
  1298. szFYL2X, szFYL2XP1, szGS, szHLT, szIDIV, szIMUL,
  1299. szIN, szINC, szINS, szINSB, szINSD, szINSW,
  1300. szINT, szINTO, szINVD, szINVLPG, szIRET, szIRETD,
  1301. szJA, szJAE, szJB, szJBE, szJC, szJCXZ,
  1302. szJE, szJECXZ, szJG, szJGE, szJL, szJLE,
  1303. szJMP, szJNA, szJNAE, szJNB, szJNBE, szJNC,
  1304. szJNE, szJNG, szJNGE, szJNL, szJNLE, szJNO,
  1305. szJNP, szJNS, szJNZ, szJO, szJP, szJPE,
  1306. szJPO, szJS, szJZ, szLAHF, szLAR, szLDS,
  1307. szLEA, szLEAVE, szLES, szLFS, szLGDT, szLGS,
  1308. szLIDT, szLLDT, szLMSW, szLOCK, szLODS, szLODSB,
  1309. szLODSD, szLODSW, szLOOP, szLOOPE, szLOOPNE, szLOOPNZ,
  1310. szLOOPZ, szLSL, szLSS, szLTR, szMOV, szMOVS,
  1311. szMOVSB, szMOVSD, szMOVSW, szMOVSX, szMOVZX, szMUL,
  1312. szNEG, szNOP, szNOT, szOR, szOUT, szOUTS,
  1313. szOUTSB, szOUTSD, szOUTSW, szPOP, szPOPA, szPOPAD,
  1314. szPOPF, szPOPFD, szPUSH, szPUSHA, szPUSHAD, szPUSHF,
  1315. szPUSHFD, szRCL, szRCR, szRDMSR, szRDTSC, szREP,
  1316. szREPE, szREPNE, szREPNZ, szREPZ, szRET, szRETF,
  1317. szRETN, szROL, szROR, szRSM, szSAHF, szSAL,
  1318. szSAR, szSBB, szSCAS, szSCASB, szSCASD, szSCASW,
  1319. szSETA, szSETAE, szSETB, szSETBE, szSETC, szSETE,
  1320. szSETG, szSETGE, szSETL, szSETLE, szSETNA, szSETNAE,
  1321. szSETNB, szSETNBE, szSETNC, szSETNE, szSETNG, szSETNGE,
  1322. szSETNL, szSETNLE, szSETNO, szSETNP, szSETNS, szSETNZ,
  1323. szSETO, szSETP, szSETPE, szSETPO, szSETS, szSETZ,
  1324. szSGDT, szSHL, szSHLD, szSHR, szSHRD, szSIDT,
  1325. szSLDT, szSMSW, szSS, szSTC, szSTD, szSTI,
  1326. szSTOS, szSTOSB, szSTOSD, szSTOSW, szSTR, szSUB,
  1327. szTEST, szVERR, szVERW, szWAIT, szWBINVD, szWRMSR,
  1328. szXADD, szXCHG, szXLAT, szXOR
  1329. };
  1330. #define OPTABLESIZE (sizeof(OpTable) / sizeof(PUCHAR))
  1331. /*** X86SearchOpcode - search for opcode
  1332. *
  1333. * Purpose:
  1334. * Search the opcode table for a match with the string
  1335. * pointed by *pszOp.
  1336. *
  1337. * Input:
  1338. * *pszOp - string to search as opcode
  1339. *
  1340. * Returns:
  1341. * if not -1, index of match entry in opcode table
  1342. * if -1, not found
  1343. *
  1344. *************************************************************************/
  1345. PUCHAR X86SearchOpcode (PUCHAR pszop)
  1346. {
  1347. LONG low = 0;
  1348. LONG mid;
  1349. LONG high = OPTABLESIZE - 1;
  1350. LONG match;
  1351. while (low <= high) {
  1352. mid = (low + high) / 2;
  1353. match = (ULONG)strcmp((char *)pszop, (char *)OpTable[mid]);
  1354. if (match == -1)
  1355. high = mid - 1;
  1356. else if (match == 1)
  1357. low = mid + 1;
  1358. else
  1359. return OpTable[mid] + strlen((char *)OpTable[mid]) + 1;
  1360. }
  1361. return NULL;
  1362. }