Source code of Windows XP (NT5)
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.

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