home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 July & August / PCWorld_2002-07-08_cd.bin / Software / Topware / hackman / _SETUP.1 / ModuleC.dat < prev    next >
Text File  |  2000-04-22  |  51KB  |  937 lines

  1. <CALL>
  2. [1]
  3. "CALL: Call Procedure"
  4. ""
  5. "Saves procedure linking information on the stack and branches to the procedure (called proce-dure) specified with the destination (target) operand. The target operand specifies the address of the first instruction in the called procedure. This operand can be an immediate value, a general-purpose register, or a memory location."
  6. "This instruction can be used to execute four different types of calls:"
  7. ""
  8. "ò Near callùA call to a procedure within the current code segment (the segment currently pointed to by the CS register), sometimes referred to as an intrasegment call."
  9. "ò Far callùA call to a procedure located in a different segment than the current code segment, sometimes referred to as an intersegment call."
  10. "ò Inter-privilege-level far callùA far call to a procedure in a segment at a different privilege level than that of the currently executing program or procedure."
  11. "ò Task switchùA call to a procedure located in a different task."
  12. ""
  13. "The latter two call types (inter-privilege-level call and task switch) can only be executed in protected mode."
  14. ""
  15. "Near Call."
  16. ""
  17. "When executing a near call, the processor pushes the value of the EIP register (which contains the offset of the instruction following the CALL instruction) onto the stack (for use later as a return-instruction pointer). The processor then branches to the address in the current code segment specified with the target operand. The target operand specifies either an absolute offset in the code segment (that is an offset from the base of the code segment) or a relative offset (a signed displacement relative to the current value of the instruction pointer in the EIP register, which points to the instruction following the CALL instruction). The CS register is not changed on near calls."
  18. "For a near call, an absolute offset is specified indirectly in a general-purpose register or a memory location (r/m16 or r/m32). The operand-size attribute determines the size of the target operand (16 or 32 bits). Absolute offsets are loaded directly into the EIP register. If the operand-size attribute is 16, the upper two bytes of the EIP register are cleared to 0s, resulting in a maximum instruction pointer size of 16 bits. (When accessing an absolute offset indirectly using the stack pointer [ESP] as a base register, the base value used is the value of the ESP before the instruction executes.)"
  19. "A relative offset (rel16 or rel32) is generally specified as a label in assembly code, but at the machine code level, it is encoded as a signed, 16- or 32-bit immediate value. This value is added to the value in the EIP register. As with absolute offsets, the operand-size attribute determines the size of the target operand (16 or 32 bits)."
  20. ""
  21. "Far Calls in Real-Address or Virtual-8086 Mode."
  22. ""
  23. "When executing a far call in real-address or virtual-8086 mode, the processor pushes the current value of both the CS and EIP registers onto the stack for use as a return-instruction pointer. The processor then performs a ôfar branchö to the code segment and offset specified with the target operand for the called proce-dure. Here the target operand specifies an absolute far address either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a memory location (m16:16 or m16:32). With the pointer method, the segment and offset of the called procedure is encoded in the instruction, using a 4-byte (16-bit operand size) or 6-byte (32-bit operand size) far address immediate. With the indirect method, the target operand specifies a memory location that contains a 4-byte (16-bit operand size) or 6-byte (32-bit operand size) far address."
  24. "The operand-size attribute determines the size of the offset (16 or 32 bits) in the far address. The far address is loaded directly into the CS and EIP registers. If the operand-size attribute is 16, the upper two bytes of the EIP register are cleared to 0s."
  25. ""
  26. "Far Calls in Protected Mode."
  27. ""
  28. "When the processor is operating in protected mode, the CALL instruction can be used to perform the following three types of far calls:"
  29. "ò Far call to the same privilege level."
  30. "ò Far call to a different privilege level (inter-privilege level call)."
  31. "ò Task switch (far call to another task)."
  32. "In protected mode, the processor always uses the segment selector part of the far address to access the corresponding descriptor in the GDT or LDT. The descriptor type (code segment, call gate, task gate, or TSS) and access rights determine the type of call operation to be performed. If the selected descriptor is for a code segment, a far call to a code segment at the same privilege level is performed. (If the selected code segment is at a different privilege level and the code segment is non-conforming, a general-protection exception is generated.) A far call to the same privilege level in protected mode is very similar to one carried out in real-address or virtual-8086 mode. The target operand specifies an absolute far address either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a memory location (m16:16 or m16:32)."
  33. "The operand-size attribute determines the size of the offset (16 or 32 bits) in the far address. The new code segment selector and its descriptor are loaded into CS register, and the offset from the instruction is loaded into the EIP register."
  34. "Note that a call gate (described in the next paragraph) can also be used to perform far call to a code segment at the same privilege level. Using this mechanism provides an extra level of indirection and is the preferred method of making calls between 16-bit and 32-bit code segments. When executing an inter-privilege-level far call, the code segment for the procedure being called must be accessed through a call gate. The segment selector specified by the target operand identifies the call gate. Here again, the target operand can specify the call gate segment selector either directly with a pointer (ptr16:16 or ptr16:32) or indirectly with a memory location (m16:16 or m16:32). The processor obtains the segment selector for the new code segment and the new instruction pointer (offset) from the call gate descriptor."
  35. "(The offset from the target operand is ignored when a call gate is used.) On inter-privilege-level calls, the processor switches to the stack for the privilege level of the called procedure. The segment selector for the new stack segment is specified in the TSS for the currently running task. The branch to the new code segment occurs after the stack switch. (Note that when using a call gate to perform a far call to a segment at the same privilege level, no stack switch occurs.) On the new stack, the processor pushes the segment selector and stack pointer for the calling procedureÆs stack, an (optional) set of parameters from the calling procedures stack, and the segment selector and instruction pointer for the calling procedureÆs code segment."
  36. "(A value in the call gate descriptor determines how many parameters to copy to the new stack.) Finally, the processor branches to the address of the procedure being called within the new code segment."
  37. "Executing a task switch with the CALL instruction, is somewhat similar to executing a call through a call gate. Here the target operand specifies the segment selector of the task gate for the task being switched to (and the offset in the target operand is ignored.) The task gate in turn points to the TSS for the task, which contains the segment selectors for the taskÆs code and stack segments. The TSS also contains the EIP value for the next instruction that was to be executed before the task was suspended. This instruction pointer value is loaded into EIP register so that the task begins executing again at this next instruction. The CALL instruction can also specify the segment selector of the TSS directly, which eliminates the indirection of the task gate."
  38. "Note that when you execute at task switch with a CALL instruction, the nested task flag (NT) is set in the EFLAGS register and the new TSSÆs previous task link field is loaded with the old tasks TSS selector. Code is expected to suspend this nested task by executing an IRET instruction, which, because the NT flag is set, will automatically use the previous task link to return to the calling task. Switching tasks with the CALL instruction differs in this regard from the JMP instruction which does not set the NT flag and therefore does not expect an IRET instruction to suspend the task."
  39. ""
  40. "Mixing 16-Bit and 32-Bit Calls."
  41. ""
  42. "When making far calls between 16-bit and 32-bit code segments, the calls should be made through a call gate. If the far call is from a 32-bit code segment to a 16-bit code segment, the call should be made from the first 64 KBytes of the 32-bit code segment. This is because the operand-size attribute of the instruction is set to 16, so only a 16-bit return address offset is saved."
  43. "Also, the call should be made using a 16-bit call gate so that 16-bit values will be pushed on the stack."
  44. [2]
  45. "IF near call"
  46. "THEN IF near relative call"
  47. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  48. "THEN IF OperandSize = 32"
  49. "THEN"
  50. "IF stack not large enough for a 4-byte return address THEN #SS(0); FI;"
  51. "Push(EIP);"
  52. "EIP ¼ EIP + DEST; (* DEST is rel32 *)"
  53. "ELSE (* OperandSize = 16 *)"
  54. "IF stack not large enough for a 2-byte return address THEN #SS(0); FI;"
  55. "Push(IP);"
  56. "EIP ¼ (EIP + DEST) AND 0000FFFFH; (* DEST is rel16 *)"
  57. "FI;"
  58. "FI;"
  59. "ELSE (* near absolute call *)"
  60. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  61. "IF OperandSize = 32"
  62. "THEN"
  63. "IF stack not large enough for a 4-byte return address THEN #SS(0); FI;"
  64. "Push(EIP);"
  65. "EIP ¼ DEST; (* DEST is r/m32 *)"
  66. "ELSE (* OperandSize = 16 *)"
  67. "IF stack not large enough for a 2-byte return address THEN #SS(0); FI;"
  68. "Push(IP);"
  69. "EIP ¼ DEST AND 0000FFFFH; (* DEST is r/m16 *)"
  70. "FI;"
  71. "FI:"
  72. "FI;"
  73. "IF far call AND (PE = 0 OR (PE = 1 AND VM = 1)) (* real-address or virtual-8086 mode *)"
  74. "THEN"
  75. "IF OperandSize = 32"
  76. "THEN"
  77. "IF stack not large enough for a 6-byte return address THEN #SS(0); FI;"
  78. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  79. "Push(CS); (* padded with 16 high-order bits *)"
  80. "Push(EIP);"
  81. "CS ¼ DEST[47:32]; (* DEST is ptr16:32 or [ m16:32] *)"
  82. "EIP ¼ DEST[31:0]; (* DEST is ptr16:32 or [ m16:32] *)"
  83. "ELSE (* OperandSize = 16 *)"
  84. "IF stack not large enough for a 4-byte return address THEN #SS(0); FI;"
  85. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  86. "Push(CS);"
  87. "Push(IP);"
  88. "CS ¼ DEST[31:16]; (* DEST is ptr16:16 or [ m16:16] *)"
  89. "EIP ¼ DEST[15:0]; (* DEST is ptr16:16 or [ m16:16] *)"
  90. "EIP ¼ EIP AND 0000FFFFH; (* clear upper 16 bits *)"
  91. "FI;"
  92. "FI;"
  93. "IF far call AND (PE = 1 AND VM = 0) (* Protected mode, not virtual-8086 mode *)"
  94. "THEN"
  95. "IF segment selector in target operand null THEN #GP(0); FI;"
  96. "IF segment selector index not within descriptor table limits"
  97. "THEN #GP(new code segment selector);"
  98. "FI;"
  99. "Read type and access rights of selected segment descriptor;"
  100. "IF segment type is not a conforming or nonconforming code segment, call gate, task gate, or TSS THEN #GP(segment selector); FI;"
  101. "Depending on type and access rights"
  102. "GO TO CONFORMING-CODE-SEGMENT;"
  103. "GO TO NONCONFORMING-CODE-SEGMENT;"
  104. "GO TO CALL-GATE;"
  105. "GO TO TASK-GATE;"
  106. "GO TO TASK-STATE-SEGMENT;"
  107. "FI;"
  108. ""
  109. "CONFORMING-CODE-SEGMENT:"
  110. "IF DPL > CPL THEN #GP(new code segment selector); FI;"
  111. "IF segment not present THEN #NP(new code segment selector); FI;"
  112. "IF OperandSize = 32"
  113. "THEN"
  114. "IF stack not large enough for a 6-byte return address THEN #SS(0); FI;"
  115. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  116. "Push(CS); (* padded with 16 high-order bits *)"
  117. "Push(EIP);"
  118. "CS ¼ DEST(NewCodeSegmentSelector);"
  119. "(* segment descriptor information also loaded *)"
  120. "CS(RPL) ¼ CPL"
  121. "EIP ¼ DEST(offset);"
  122. "ELSE (* OperandSize = 16 *):
  123. "IF stack not large enough for a 4-byte return address THEN #SS(0); FI;"
  124. "IF the instruction pointer is not within code segment limit THEN #GP(0); FI;"
  125. "Push(CS);"
  126. "Push(IP);"
  127. "CS ¼ DEST(NewCodeSegmentSelector);"
  128. "(* segment descriptor information also loaded *)"
  129. "CS(RPL) ¼ CPL"
  130. "EIP ¼ DEST(offset) AND 0000FFFFH; (* clear upper 16 bits *)"
  131. "FI;"
  132. "END;"
  133. ""
  134. "NONCONFORMING-CODE-SEGMENT:"
  135. "IF (RPL > CPL) OR (DPL ╣ CPL) THEN #GP(new code segment selector); FI;"
  136. "IF segment not present THEN #NP(new code segment selector); FI;"
  137. "IF stack not large enough for return address THEN #SS(0); FI;"
  138. "tempEIP ¼ DEST(offset)"
  139. "IF OperandSize=16"
  140. "THEN"
  141. "tempEIP ¼ tempEIP AND 0000FFFFH; (* clear upper 16 bits *)"
  142. "FI;"
  143. "IF tempEIP outside code segment limit THEN #GP(0); FI;"
  144. "IF OperandSize = 32"
  145. "THEN"
  146. "Push(CS); (* padded with 16 high-order bits *)"
  147. "Push(EIP);"
  148. "CS ¼ DEST(NewCodeSegmentSelector);"
  149. "(* segment descriptor information also loaded *)"
  150. "CS(RPL) ¼ CPL;"
  151. "EIP ¼ tempEIP;"
  152. "ELSE (* OperandSize = 16 *)"
  153. "Push(CS);"
  154. "Push(IP);"
  155. "CS ¼ DEST(NewCodeSegmentSelector);"
  156. "(* segment descriptor information also loaded *)"
  157. "CS(RPL) ¼ CPL;"
  158. "EIP ¼ tempEIP;"
  159. "FI;"
  160. "END;"
  161. ""
  162. "CALL-GATE:"
  163. "IF call gate DPL < CPL or RPL THEN #GP(call gate selector); FI;"
  164. "IF call gate not present THEN #NP(call gate selector); FI;"
  165. "IF call gate code-segment selector is null THEN #GP(0); FI;"
  166. "IF call gate code-segment selector index is outside descriptor table limits"
  167. "THEN #GP(code segment selector); FI;"
  168. "Read code segment descriptor;"
  169. "IF code-segment segment descriptor does not indicate a code segment"
  170. "OR code-segment segment descriptor DPL > CPL"
  171. "THEN #GP(code segment selector); FI;"
  172. "IF code segment not present THEN #NP(new code segment selector); FI;"
  173. "IF code segment is non-conforming AND DPL < CPL"
  174. "THEN go to MORE-PRIVILEGE;"
  175. "ELSE go to SAME-PRIVILEGE;"
  176. "FI;"
  177. "END;"
  178. ""
  179. "MORE-PRIVILEGE:"
  180. "IF current TSS is 32-bit TSS"
  181. "THEN"
  182. "TSSstackAddress ¼ new code segment (DPL * 8) + 4"
  183. "IF (TSSstackAddress + 7) > TSS limit"
  184. "THEN #TS(current TSS selector); FI;"
  185. "newSS ¼ TSSstackAddress + 4;"
  186. "newESP ¼ stack address;"
  187. "ELSE (* TSS is 16-bit *)"
  188. "TSSstackAddress ¼ new code segment (DPL * 4) + 2"
  189. "IF (TSSstackAddress + 4) > TSS limit"
  190. "THEN #TS(current TSS selector); FI;"
  191. "newESP ¼ TSSstackAddress;"
  192. "newSS ¼ TSSstackAddress + 2;"
  193. "FI;"
  194. "IF stack segment selector is null THEN #TS(stack segment selector); FI;"
  195. "IF stack segment selector index is not within its descriptor table limits"
  196. "THEN #TS(SS selector); FI"
  197. "Read code segment descriptor;"
  198. "IF stack segment selector's RPL ╣ DPL of code segment"
  199. "OR stack segment DPL ╣ DPL of code segment"
  200. "OR stack segment is not a writable data segment"
  201. "THEN #TS(SS selector); FI"
  202. "IF stack segment not present THEN #SS(SS selector); FI;"
  203. "IF CallGateSize = 32"
  204. "THEN"
  205. "IF stack does not have room for parameters plus 16 bytes"
  206. "THEN #SS(SS selector); FI;"
  207. "IF CallGate(InstructionPointer) not within code segment limit THEN #GP(0); FI;"
  208. "SS ¼ newSS;"
  209. "(* segment descriptor information also loaded *)"
  210. "ESP ¼ newESP;"
  211. "CS:EIP ¼ CallGate(CS:InstructionPointer);"
  212. "(* segment descriptor information also loaded *)"
  213. "Push(oldSS:oldESP); (* from calling procedure *)"
  214. "temp ¼ parameter count from call gate, masked to 5 bits;"
  215. "Push(parameters from calling procedureÆs stack, temp)"
  216. "Push(oldCS:oldEIP); (* return address to calling procedure *)"
  217. "ELSE (* CallGateSize = 16 *)"
  218. "IF stack does not have room for parameters plus 8 bytes"
  219. "THEN #SS(SS selector); FI;"
  220. "IF (CallGate(InstructionPointer) AND FFFFH) not within code segment limit"
  221. "THEN #GP(0); FI;"
  222. "SS ¼ newSS;"
  223. "(* segment descriptor information also loaded *)"
  224. "ESP ¼ newESP;"
  225. "CS:IP ¼ CallGate(CS:InstructionPointer);"
  226. "(* segment descriptor information also loaded *)"
  227. "Push(oldSS:oldESP); (* from calling procedure *)"
  228. "temp ¼ parameter count from call gate, masked to 5 bits;"
  229. "Push(parameters from calling procedureÆs stack, temp)"
  230. "Push(oldCS:oldEIP); (* return address to calling procedure *)"
  231. "FI;"
  232. "CPL ¼ CodeSegment(DPL)"
  233. "CS(RPL) ¼ CPL"
  234. "END;"
  235. ""
  236. "SAME-PRIVILEGE:"
  237. "IF CallGateSize = 32"
  238. "THEN"
  239. "IF stack does not have room for 8 bytes"
  240. "THEN #SS(0); FI;"
  241. "IF EIP not within code segment limit then #GP(0); FI;"
  242. "CS:EIP ¼ CallGate(CS:EIP) (* segment descriptor information also loaded *)"
  243. "Push(oldCS:oldEIP); (* return address to calling procedure *)"
  244. "ELSE (* CallGateSize = 16 *)"
  245. "IF stack does not have room for parameters plus 4 bytes"
  246. "THEN #SS(0); FI;"
  247. "IF IP not within code segment limit THEN #GP(0); FI;"
  248. "CS:IP ¼ CallGate(CS:instruction pointer)"
  249. "(* segment descriptor information also loaded *)"
  250. "Push(oldCS:oldIP); (* return address to calling procedure *)"
  251. "FI;"
  252. "CS(RPL) ¼ CPL"
  253. "END;"
  254. ""
  255. "TASK-GATE:"
  256. "IF task gate DPL < CPL or RPL"
  257. "THEN #GP(task gate selector);"
  258. "FI;"
  259. "IF task gate not present"
  260. "THEN #NP(task gate selector);"
  261. "FI;"
  262. "Read the TSS segment selector in the task-gate descriptor;"
  263. "IF TSS segment selector local/global bit is set to local"
  264. "OR index not within GDT limits"
  265. "THEN #GP(TSS selector);"
  266. "FI;"
  267. "Access TSS descriptor in GDT;"
  268. "IF TSS descriptor specifies that the TSS is busy (low-order 5 bits set to 00001)"
  269. "THEN #GP(TSS selector);"
  270. "FI;"
  271. "IF TSS not present"
  272. "THEN #NP(TSS selector);"
  273. "FI;"
  274. "SWITCH-TASKS (with nesting) to TSS;"
  275. "IF EIP not within code segment limit"
  276. "THEN #GP(0);"
  277. "FI;"
  278. "END;"
  279. ""
  280. "TASK-STATE-SEGMENT:"
  281. "IF TSS DPL < CPL or RPL"
  282. "OR TSS descriptor indicates TSS not available"
  283. "THEN #GP(TSS selector);"
  284. "FI;"
  285. "IF TSS is not present"
  286. "THEN #NP(TSS selector);"
  287. "FI;"
  288. "SWITCH-TASKS (with nesting) to TSS"
  289. "IF EIP not within code segment limit"
  290. "THEN #GP(0);"
  291. "FI;"
  292. "END;"
  293. [3]
  294. "All flags are affected if a task switch occurs; no flags are affected if a task switch does not occur."
  295. [4]
  296. "Protected Mode Exceptions"
  297. ""
  298. "#GP(0)"
  299. "If target offset in destination operand is beyond the new code segment limit. If the segment selector in the destination operand is null. If the code segment selector in the gate is null."
  300. "If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register is used to access memory and it contains a null segment selector."
  301. "#GP(selector)"
  302. "If code segment or gate or TSS selector index is outside descriptor table limits. If the segment descriptor pointed to by the segment selector in the destination operand is not for a conforming-code segment, noncon-forming-code segment, call gate, task gate, or task state segment."
  303. "If the DPL for a nonconforming-code segment is not equal to the CPL or the RPL for the segmentÆs segment selector is greater than the CPL. If the DPL for a conforming-code segment is greater than the CPL. If the DPL from a call-gate, task-gate, or TSS segment descriptor is less than the CPL or than the RPL of the call-gate, task-gate, or TSSÆs segment selector."
  304. "If the segment descriptor for a segment selector from a call gate does not indicate it is a code segment. If the segment selector from a call gate is beyond the descriptor table limits. If the DPL for a code-segment obtained from a call gate is greater than the CPL."
  305. "If the segment selector for a TSS has its local/global bit set for local. If a TSS segment descriptor specifies that the TSS is busy or not available."
  306. "#SS(0)"
  307. If pushing the return address, parameters, or stack segment pointer onto the stack exceeds the bounds of the stack segment, when no stack switch occurs. If a memory operand effective address is outside the SS segment limit."
  308. #SS(selector)"
  309. "If pushing the return address, parameters, or stack segment pointer onto the stack exceeds the bounds of the stack segment, when a stack switch occurs."
  310. "If the SS register is being loaded as part of a stack switch and the segment pointed to is marked not present. If stack segment does not have room for the return address, parameters, or stack segment pointer, when stack switch occurs."
  311. "#NP(selector)"
  312. "If a code segment, data segment, stack segment, call gate, task gate, or TSS is not present."
  313. "#TS(selector)"
  314. "If the new stack segment selector and ESP are beyond the end of the TSS. If the new stack segment selector is null. If the RPL of the new stack segment selector in the TSS is not equal to the DPL of the code segment being accessed."
  315. "If DPL of the stack segment descriptor for the new stack segment is not equal to the DPL of the code segment descriptor. If the new stack segment is not a writable data segment. If segment-selector index for stack segment is outside descriptor table limits."
  316. "#PF(fault-code)"
  317. "If a page fault occurs."
  318. "#AC(0)"
  319. "If an unaligned memory access occurs when the CPL is 3 and alignment checking is enabled."
  320. ""
  321. "Real-Address Mode Exceptions"
  322. ""
  323. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the target offset is beyond the code segment limit."
  324. ""
  325. "Virtual-8086 Mode Exceptions"
  326. ""
  327. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the target offset is beyond the code segment limit."
  328. "#PF(fault-code) If a page fault occurs."
  329. "#AC(0) If an unaligned memory access occurs when alignment checking is enabled."
  330. [5]
  331. "E8 cw CALL rel16 Call near, relative, displacement relative to next instruction"
  332. "E8 cd CALL rel32 Call near, relative, displacement relative to next instruction"
  333. "FF /2 CALL r/m16 Call near, absolute indirect, address given in r/m16"
  334. "FF /2 CALL r/m32 Call near, absolute indirect, address given in r/m32"
  335. "9A cd CALL ptr16:16 Call far, absolute, address given in operand"
  336. "9A cp CALL ptr16:32 Call far, absolute, address given in operand"
  337. "FF /3 CALL m16:16 Call far, absolute indirect, address given in m16:16"
  338. "FF /3 CALL m16:32 Call far, absolute indirect, address given in m16:32"
  339. [6]
  340. </CALL>
  341. <CBW>
  342. <CWDE>
  343. [1]
  344. "CBW/CWDEùConvert Byte to Word/Convert Word to Doubleword"
  345. ""
  346. "Double the size of the source operand by means of sign extension. The CBW (convert byte to word) instruction copies the sign (bit 7) in the source operand into every bit in the AH register. The CWDE (convert word to doubleword) instruction copies the sign (bit 15) of the word in the AX register into the higher 16 bits of the EAX register."
  347. "The CBW and CWDE mnemonics reference the same opcode. The CBW instruction is intended for use when the operand-size attribute is 16 and the CWDE instruction for when the operand-size attribute is 32. Some assemblers may force the operand size to 16 when CBW is used and to 32 when CWDE is used. Others may treat these mnemonics as synonyms (CBW/CWDE) and use the current setting of the operand-size attribute to determine the size of values to be converted, regardless of the mnemonic used."
  348. "The CWDE instruction is different from the CWD (convert word to double) instruction. The CWD instruction uses the DX:AX register pair as a destination operand; whereas, the CWDE instruction uses the EAX register as a destination."
  349. [2]
  350. "IF OperandSize = 16 (* instruction = CBW *)"
  351. "THEN AX ¼ SignExtend(AL);"
  352. "ELSE (* OperandSize = 32, instruction = CWDE *)"
  353. "EAX ¼ SignExtend(AX);"
  354. "FI;"
  355. [3]
  356. "None."
  357. [4]
  358. "(All Operating Modes)"
  359. "None."
  360. [5]
  361. "98 CBW AX ¼ sign-extend of AL"
  362. "98 CWDE EAX ¼ sign-extend of AX"
  363. [6]
  364. </CBW>
  365. </CWDE>
  366. <CLC>
  367. [1]
  368. "CLC: Clear Carry Flag"
  369. ""
  370. "Clears the CF flag in the EFLAGS register."
  371. [2]
  372. "CF ¼ 0;"
  373. [3]
  374. "The CF flag is cleared to 0. The OF, ZF, SF, AF, and PF flags are unaffected."
  375. [4]
  376. "(All Operating Modes)"
  377. "None."
  378. [5]
  379. "F8 CLC Clear CF flag"
  380. [6]
  381. </CLC>
  382. <CLD>
  383. [1]
  384. "CLD: Clear Direction Flag"
  385. ""
  386. "Clears the DF flag in the EFLAGS register. When the DF flag is set to 0, string operations increment the index registers (ESI and/or EDI)."
  387. [2]
  388. "DF ¼ 0;"
  389. [3]
  390. "The DF flag is cleared to 0. The CF, OF, ZF, SF, AF, and PF flags are unaffected."
  391. [4]
  392. "(All Operating Modes)"
  393. "None."
  394. [5]
  395. "FC CLD Clear DF flag"
  396. [6]
  397. </CLD>
  398. <CLI>
  399. [1]
  400. "CLI: Clear Interrupt Flag"
  401. ""
  402. "Clears the IF flag in the EFLAGS register. No other flags are affected. Clearing the IF flag causes the processor to ignore maskable external interrupts. The IF flag and the CLI and STI instruction have no affect on the generation of exceptions and NMI interrupts."
  403. [2]
  404. "IF PE = 0 (* Executing in real-address mode *)"
  405. "THEN"
  406. "IF ¼ 0;"
  407. "ELSE"
  408. "IF VM = 0 (* Executing in protected mode *)"
  409. "THEN"
  410. "IF CPL ú IOPL"
  411. "THEN"
  412. "IF ¼ 0;"
  413. "ELSE"
  414. "#GP(0);"
  415. "FI;"
  416. "FI;"
  417. "ELSE (* Executing in Virtual-8086 mode *)"
  418. "IF IOPL = 3"
  419. "THEN"
  420. "IF ¼ 0"
  421. "ELSE"
  422. "#GP(0);"
  423. "FI;"
  424. "FI;"
  425. "FI;"
  426. [3]
  427. "The IF is cleared to 0 if the CPL is equal to or less than the IOPL; otherwise, it is not affected. The other flags in the EFLAGS register are unaffected."
  428. [4]
  429. "Protected Mode Exceptions"
  430. ""
  431. "#GP(0) If the CPL is greater (has less privilege) than the IOPL of the current program or procedure."
  432. ""
  433. "Real-Address Mode Exceptions"
  434. ""
  435. "None."
  436. ""
  437. "Virtual-8086 Mode Exceptions"
  438. ""
  439. "#GP(0) If the CPL is greater (has less privilege) than the IOPL of the current program or procedure."
  440. [5]
  441. "FA CLI Clear interrupt flag; interrupts disabled when interrupt flag cleared"
  442. [6]
  443. </CLI>
  444. <CLTS>
  445. [1]
  446. "CLTS: Clear Task-Switched Flag in CR0"
  447. ""
  448. "Clears the task-switched (TS) flag in the CR0 register. This instruction is intended for use in operating-system procedures. It is a privileged instruction that can only be executed at a CPL of 0. It is allowed to be executed in real-address mode to allow initialization for protected mode. The processor sets the TS flag every time a task switch occurs. The flag is used to synchronize the saving of FPU context in multitasking applications."
  449. [2]
  450. "CR0(TS) ¼ 0;"
  451. [3]
  452. "The TS flag in CR0 register is cleared."
  453. [4]
  454. "Protected Mode Exceptions"
  455. ""
  456. "#GP(0) If the CPL is greater than 0."
  457. ""
  458. "Real-Address Mode Exceptions"
  459. ""
  460. "None."
  461. ""
  462. "Virtual-8086 Mode Exceptions"
  463. ""
  464. "#GP(0) If the CPL is greater than 0."
  465. [5]
  466. "0F 06 CLTS Clears TS flag in CR0"
  467. [6]
  468. </CLTS>
  469. <CMC>
  470. [1]
  471. "CMC: Complement Carry Flag"
  472. ""
  473. "Complements the CF flag in the EFLAGS register."
  474. [2]
  475. "CF ¼ NOT CF;"
  476. [3]
  477. "The CF flag contains the complement of its original value. The OF, ZF, SF, AF, and PF flags are unaffected."
  478. [4]
  479. "(All Operating Modes)"
  480. "None."
  481. [5]
  482. "F5 CMC Complement CF flag"
  483. [6]
  484. </CMC>
  485. <CMOV>
  486. <CMOVO>
  487. <CMOVNO>
  488. <CMOVB>
  489. <CMOVC>
  490. <CMONVNAE>
  491. <CMONAE>
  492. <CMOVNB>
  493. <CMOVNC>
  494. <CMOVE>
  495. <CMOVZ>
  496. <CMOVNZ>
  497. <CMOVNE>
  498. <CMOVBE>
  499. <CMOVNA>
  500. <CMOVA>
  501. <CMOVNBE>
  502. <CMOVS>
  503. <CMOVNS>
  504. <CMOVP>
  505. <CMOVPE>
  506. <CMOVNP>
  507. <CMOVPO>
  508. <CMOVL>
  509. <CMOVNGE>
  510. <CMOVGE>
  511. <CMOVNL>
  512. <CMOVLE>
  513. <CMOVNG>
  514. <CMOVG>
  515. <CMOVNLE>
  516. [1]
  517. "CMOV cc: Conditional Move"
  518. ""
  519. "The CMOVcc instructions check the state of one or more of the status flags in the EFLAGS register (CF, OF, PF, SF, and ZF) and perform a move operation if the flags are in a specified state (or condition). A condition code (cc) is associated with each instruction to indicate the condition being tested for. If the condition is not satisfied, a move is not performed and execution continues with the instruction following the CMOVcc instruction."
  520. "These instructions can move a 16- or 32-bit value from memory to a general-purpose register or from one general-purpose register to another. Conditional moves of 8-bit register operands are not supported."
  521. "The conditions for each CMOVcc mnemonic is given in the description column of the opcode table. The terms 'less' and 'greater' are used for comparisons of signed integers and the terms 'above' and 'below' are used for unsigned integers."
  522. "Because a particular state of the status flags can sometimes be interpreted in two ways, two mnemonics are defined for some opcodes. For example, the CMOVA (conditional move if above) instruction and the CMOVNBE (conditional move if not below or equal) instruction are alternate mnemonics for the opcode 0F 47H."
  523. "The CMOVcc instructions are new for the Pentium Pro processor family; however, they may not be supported by all the processors in the family. Software can determine if the CMOVcc instructions are supported by checking the processorÆs feature information with the CPUID instruction."
  524. [2]
  525. "temp ¼ DEST"
  526. "IF condition TRUE"
  527. "THEN"
  528. "DEST ¼ SRC"
  529. "ELSE"
  530. "DEST ¼ temp"
  531. "FI;"
  532. [3]
  533. "None."
  534. [4]
  535. "Protected Mode Exceptions"
  536. ""
  537. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector. "
  538. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  539. "#PF(fault-code) If a page fault occurs."
  540. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3."
  541. ""
  542. "Real-Address Mode Exceptions"
  543. ""
  544. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  545. "#SS If a memory operand effective address is outside the SS segment limit."
  546. ""
  547. "Virtual-8086 Mode Exceptions"
  548. ""
  549. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  550. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  551. "#PF(fault-code) If a page fault occurs."
  552. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made."
  553. [5]
  554. "0F 47 /r CMOVA r16, r/m16 Move if above (CF=0 and ZF=0)"
  555. "0F 47 /r CMOVA r32, r/m32 Move if above (CF=0 and ZF=0)"
  556. "0F 43 /r CMOVAE r16, r/m16 Move if above or equal (CF=0)"
  557. "0F 43 /r CMOVAE r32, r/m32 Move if above or equal (CF=0)"
  558. "0F 42 /r CMOVB r16, r/m16 Move if below (CF=1)"
  559. "0F 42 /r CMOVB r32, r/m32 Move if below (CF=1)"
  560. "0F 46 /r CMOVBE r16, r/m16 Move if below or equal (CF=1 or ZF=1)"
  561. "0F 46 /r CMOVBE r32, r/m32 Move if below or equal (CF=1 or ZF=1)"
  562. "0F 42 /r CMOVC r16, r/m16 Move if carry (CF=1)"
  563. "0F 42 /r CMOVC r32, r/m32 Move if carry (CF=1)"
  564. "0F 44 /r CMOVE r16, r/m16 Move if equal (ZF=1)"
  565. "0F 44 /r CMOVE r32, r/m32 Move if equal (ZF=1)"
  566. "0F 4F /r CMOVG r16, r/m16 Move if greater (ZF=0 and SF=OF)"
  567. "0F 4F /r CMOVG r32, r/m32 Move if greater (ZF=0 and SF=OF)"
  568. "0F 4D /r CMOVGE r16, r/m16 Move if greater or equal (SF=OF)"
  569. "0F 4D /r CMOVGE r32, r/m32 Move if greater or equal (SF=OF)"
  570. "0F 4C /r CMOVL r16, r/m16 Move if less (SF<>OF)"
  571. "0F 4C /r CMOVL r32, r/m32 Move if less (SF<>OF)"
  572. "0F 4E /r CMOVLE r16, r/m16 Move if less or equal (ZF=1 or SF<>OF)"
  573. "0F 4E /r CMOVLE r32, r/m32 Move if less or equal (ZF=1 or SF<>OF)"
  574. "0F 46 /r CMOVNA r16, r/m16 Move if not above (CF=1 or ZF=1)"
  575. "0F 46 /r CMOVNA r32, r/m32 Move if not above (CF=1 or ZF=1)"
  576. "0F 42 /r CMOVNAE r16, r/m16 Move if not above or equal (CF=1)"
  577. "0F 42 /r CMOVNAE r32, r/m32 Move if not above or equal (CF=1)"
  578. "0F 43 /r CMOVNB r16, r/m16 Move if not below (CF=0)"
  579. "0F 43 /r CMOVNB r32, r/m32 Move if not below (CF=0)"
  580. "0F 47 /r CMOVNBE r16, r/m16 Move if not below or equal (CF=0 and ZF=0)"
  581. "0F 47 /r CMOVNBE r32, r/m32 Move if not below or equal (CF=0 and ZF=0)"
  582. "0F 43 /r CMOVNC r16, r/m16 Move if not carry (CF=0)"
  583. "0F 43 /r CMOVNC r32, r/m32 Move if not carry (CF=0)"
  584. "0F 45 /r CMOVNE r16, r/m16 Move if not equal (ZF=0)"
  585. "0F 45 /r CMOVNE r32, r/m32 Move if not equal (ZF=0)"
  586. "0F 4E /r CMOVNG r16, r/m16 Move if not greater (ZF=1 or SF<>OF)"
  587. "0F 4E /r CMOVNG r32, r/m32 Move if not greater (ZF=1 or SF<>OF)"
  588. "0F 4C /r CMOVNGE r16, r/m16 Move if not greater or equal (SF<>OF)"
  589. "0F 4C /r CMOVNGE r32, r/m32 Move if not greater or equal (SF<>OF)"
  590. "0F 4D /r CMOVNL r16, r/m16 Move if not less (SF=OF)"
  591. "0F 4D /r CMOVNL r32, r/m32 Move if not less (SF=OF)"
  592. "0F 4F /r CMOVNLE r16, r/m16 Move if not less or equal (ZF=0 and SF=OF)"
  593. "0F 4F /r CMOVNLE r32, r/m32 Move if not less or equal (ZF=0 and SF=OF)"
  594. "0F 41 /r CMOVNO r16, r/m16 Move if not overflow (OF=0)"
  595. "0F 41 /r CMOVNO r32, r/m32 Move if not overflow (OF=0)"
  596. "0F 4B /r CMOVNP r16, r/m16 Move if not parity (PF=0)"
  597. "0F 4B /r CMOVNP r32, r/m32 Move if not parity (PF=0)"
  598. "0F 49 /r CMOVNS r16, r/m16 Move if not sign (SF=0)"
  599. "0F 49 /r CMOVNS r32, r/m32 Move if not sign (SF=0)"
  600. "0F 45 /r CMOVNZ r16, r/m16 Move if not zero (ZF=0)"
  601. "0F 45 /r CMOVNZ r32, r/m32 Move if not zero (ZF=0)"
  602. "0F 40 /r CMOVO r16, r/m16 Move if overflow (OF=0)"
  603. "0F 40 /r CMOVO r32, r/m32 Move if overflow (OF=0)"
  604. "0F 4A /r CMOVP r16, r/m16 Move if parity (PF=1)"
  605. "0F 4A /r CMOVP r32, r/m32 Move if parity (PF=1)"
  606. "0F 4A /r CMOVPE r16, r/m16 Move if parity even (PF=1)"
  607. "0F 4A /r CMOVPE r32, r/m32 Move if parity even (PF=1)"
  608. "0F 4B /r CMOVPO r16, r/m16 Move if parity odd (PF=0)"
  609. "0F 4B /r CMOVPO r32, r/m32 Move if parity odd (PF=0)"
  610. "0F 48 /r CMOVS r16, r/m16 Move if sign (SF=1)"
  611. "0F 48 /r CMOVS r32, r/m32 Move if sign (SF=1)"
  612. "0F 44 /r CMOVZ r16, r/m16 Move if zero (ZF=1)"
  613. "0F 44 /r CMOVZ r32, r/m32 Move if zero (ZF=1)"
  614. [6]
  615. </CMOV>
  616. </CMOVO>
  617. </CMOVNO>
  618. </CMOVB>
  619. </CMOVC>
  620. </CMONVNAE>
  621. </CMONAE>
  622. </CMOVNB>
  623. </CMOVNC>
  624. </CMOVE>
  625. </CMOVZ>
  626. </CMOVNZ>
  627. </CMOVNE>
  628. </CMOVBE>
  629. </CMOVNA>
  630. </CMOVA>
  631. </CMOVNBE>
  632. </CMOVS>
  633. </CMOVNS>
  634. </CMOVP>
  635. </CMOVPE>
  636. </CMOVNP>
  637. </CMOVPO>
  638. </CMOVL>
  639. </CMOVNGE>
  640. </CMOVGE>
  641. </CMOVNL>
  642. </CMOVLE>
  643. </CMOVNG>
  644. </CMOVG>
  645. </CMOVNLE>
  646. <CMP>
  647. [1]
  648. "CMP: Compare Two Operands"
  649. ""
  650. "Compares the first source operand with the second source operand and sets the status flags in the EFLAGS register according to the results. The comparison is performed by subtracting the second operand from the first operand and then setting the status flags in the same manner as the SUB instruction. When an immediate value is used as an operand, it is sign-extended to the length of the first operand."
  651. "The CMP instruction is typically used in conjunction with a conditional jump (Jcc), condition move (CMOVcc), or SETcc instruction. The condition codes used by the Jcc, CMOVcc, and SETcc instructions are based on the results of a CMP instruction."
  652. [2]
  653. "temp ¼ SRC1 - SignExtend(SRC2);"
  654. "ModifyStatusFlags; (* Modify status flags in the same manner as the SUB instruction*)"
  655. [3]
  656. "The CF, OF, SF, ZF, AF, and PF flags are set according to the result."
  657. [4]
  658. "Protected Mode Exceptions"
  659. ""
  660. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector."
  661. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  662. "#PF(fault-code) If a page fault occurs."
  663. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3."
  664. ""
  665. "Real-Address Mode Exceptions"
  666. ""
  667. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  668. "#SS If a memory operand effective address is outside the SS segment limit."
  669. ""
  670. "Virtual-8086 Mode Exceptions"
  671. ""
  672. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  673. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  674. "#PF(fault-code) If a page fault occurs."
  675. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made."
  676. [5]
  677. "3C ib CMP AL, imm8 Compare imm8 with AL"
  678. "3D iw CMP AX, imm16 Compare imm16 with AX"
  679. "3D id CMP EAX, imm32 Compare imm32 with EAX"
  680. "80 /7 ib CMP r/m8, imm8 Compare imm8 with r/m8"
  681. "81 /7 iw CMP r/m16, imm16 Compare imm16 with r/m16"
  682. "81 /7 id CMP r/m32,imm32 Compare imm32 with r/m32"
  683. "83 /7 ib CMP r/m16,imm8 Compare imm8 with r/m16"
  684. "83 /7 ib CMP r/m32,imm8 Compare imm8 with r/m32"
  685. "38 / r CMP r/m8,r8 Compare r8 with r/m8"
  686. "39 / r CMP r/m16,r16 Compare r16 with r/m16"
  687. "39 / r CMP r/m32,r32 Compare r32 with r/m32"
  688. "3A / r CMP r8,r/m8 Compare r/m8 with r8"
  689. "3B / r CMP r16,r/m16 Compare r/m16 with r16"
  690. "3B / r CMP r32,r/m32 Compare r/m32 with r32"
  691. [6]
  692. </CMP>
  693. <CMPS>
  694. <CMPSB>
  695. <CMPSW>
  696. <CMPSD>
  697. [1]
  698. "CMPS/CMPSB/CMPSW/CMPSD: Compare String Operands"
  699. ""
  700. "Compares the byte, word, or double word specified with the first source operand with the byte, word, or double word specified with the second source operand and sets the status flags in the EFLAGS register according to the results. Both the source operands are located in memory. The address of the first source operand is read from either the DS:ESI or the DS:SI registers (depending on the address-size attribute of the instruction, 32 or 16, respectively). The address of the second source operand is read from either the ES:EDI or the ES:DI registers (again depending on the address-size attribute of the instruction). The DS segment may be overridden with a segment override prefix, but the ES segment cannot be overridden."
  701. "At the assembly-code level, two forms of this instruction are allowed: the ôexplicit-operandsö form and the ôno-operandsö form. The explicit-operands form (specified with the CMPS mnemonic) allows the two source operands to be specified explicitly. Here, the source operands should be symbols that indicate the size and location of the source values. This explicit-operands form is provided to allow documentation; however, note that the documentation provided by this form can be misleading. That is, the source operand symbols must specify the correct type (size) of the operands (bytes, words, or doublewords), but they do not have to specify the correct location."
  702. "The locations of the source operands are always specified by the DS:(E)SI and ES:(E)DI registers, which must be loaded correctly before the compare string instruction is executed."
  703. "The no-operands form provides ôshort formsö of the byte, word, and doubleword versions of the CMPS instructions. Here also the DS:(E)SI and ES:(E)DI registers are assumed by the processor to specify the location of the source operands. The size of the source operands is selected with the mnemonic: CMPSB (byte comparison), CMPSW (word comparison), or CMPSD (double-word comparison)."
  704. "After the comparison, the (E)SI and (E)DI registers are incremented or decremented automatically according to the setting of the DF flag in the EFLAGS register. (If the DF flag is 0, the (E)SI and (E)DI register are incremented; if the DF flag is 1, the (E)SI and (E)DI registers are decremented.) The registers are incremented or decremented by 1 for byte operations, by 2 for word operations, or by 4 for doubleword operations."
  705. "The CMPS, CMPSB, CMPSW, and CMPSD instructions can be preceded by the REP prefix for block comparisons of ECX bytes, words, or doublewords. More often, however, these instructions will be used in a LOOP construct that takes some action based on the setting of the status flags before the next comparison is made."
  706. [2]
  707. "temp ¼SRC1 - SRC2;"
  708. "SetStatusFlags(temp);"
  709. "IF (byte comparison)"
  710. "THEN IF DF = 0"
  711. "THEN"
  712. "(E)SI ¼ (E)SI + 1;"
  713. "(E)DI ¼ (E)DI + 1;"
  714. "ELSE"
  715. "(E)SI ¼ (E)SI û 1;"
  716. "(E)DI ¼ (E)DI û 1;"
  717. "FI;"
  718. "ELSE IF (word comparison)"
  719. "THEN IF DF = 0"
  720. "(E)SI ¼ (E)SI + 2;"
  721. "(E)DI ¼ (E)DI + 2;"
  722. "ELSE"
  723. "(E)SI ¼ (E)SI û 2;"
  724. "(E)DI ¼ (E)DI û 2;"
  725. "FI;"
  726. "ELSE (* doubleword comparison*)"
  727. "THEN IF DF = 0"
  728. "(E)SI ¼ (E)SI + 4;"
  729. "(E)DI ¼ (E)DI + 4;"
  730. "ELSE"
  731. "(E)SI ¼ (E)SI û 4;"
  732. "(E)DI ¼ (E)DI û 4;"
  733. "FI;"
  734. "FI;"
  735. [3]
  736. "The CF, OF, SF, ZF, AF, and PF flags are set according to the temporary result of the comparison."
  737. [4]
  738. "Protected Mode Exceptions"
  739. ""
  740. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector."
  741. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  742. "#PF(fault-code) If a page fault occurs."
  743. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3."
  744. ""
  745. "Real-Address Mode Exceptions"
  746. ""
  747. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  748. "#SS If a memory operand effective address is outside the SS segment limit."
  749. ""
  750. "Virtual-8086 Mode Exceptions"
  751. ""
  752. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  753. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  754. "#PF(fault-code) If a page fault occurs."
  755. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made."
  756. [5]
  757. "A6 CMPS m8, m8 Compares byte at address DS:(E)SI with byte at address ES:(E)DI and sets the status flags accordingly"
  758. "A7 CMPS m16, m16 Compares word at address DS:(E)SI with word at address ES:(E)DI and sets the status flags accordingly"
  759. "A7 CMPS m32, m32 Compares doubleword at address DS:(E)SI with doubleword at address ES:(E)DI and sets the status flags accordingly"
  760. "A6 CMPSB Compares byte at address DS:(E)SI with byte at address ES:(E)DI and sets the status flags accordingly"
  761. "A7 CMPSW Compares word at address DS:(E)SI with word at address ES:(E)DI and sets the status flags accordingly"
  762. "A7 CMPSD Compares doubleword at address DS:(E)SI with doubleword at address ES:(E)DI and sets the status flags accordingly"
  763. [6]
  764. </CMPS>
  765. </CMPSB>
  766. </CMPSW>
  767. </CMPSD>
  768. <CMPXCHG>
  769. [1]
  770. "CMPXCHG: Compare and Exchange"
  771. ""
  772. "Compares the value in the AL, AX, or EAX register (depending on the size of the operand) with the first operand (destination operand). If the two values are equal, the second operand (source operand) is loaded into the destination operand. Otherwise, the destination operand is loaded into the AL, AX, or EAX register."
  773. "This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. To simplify the interface to the processorÆs bus, the destination operand receives a write cycle without regard to the result of the comparison. The destination operand is written back if the comparison fails; otherwise, the source operand is written into the destination. (The processor never produces a locked read without also producing a locked write.)"
  774. ""
  775. "Intel Architecture Compatibility"
  776. ""
  777. "This instruction is not supported on Intel processors earlier than the Intel486 processors."
  778. [2]
  779. "(* accumulator = AL, AX, or EAX, depending on whether *)"
  780. "(* a byte, word, or doubleword comparison is being performed*)"
  781. "IF accumulator = DEST"
  782. "THEN"
  783. "ZF ¼ 1"
  784. "DEST ¼ SRC"
  785. "ELSE"
  786. "ZF ¼ 0"
  787. "accumulator ¼ DEST"
  788. "FI;"
  789. [3]
  790. "The ZF flag is set if the values in the destination operand and register AL, AX, or EAX are equal; otherwise it is cleared. The CF, PF, AF, SF, and OF flags are set according to the results of the comparison operation."
  791. [4]
  792. "Protected Mode Exceptions"
  793. ""
  794. "#GP(0) If the destination is located in a nonwritable segment. If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector."
  795. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  796. "#PF(fault-code) If a page fault occurs."
  797. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3."
  798. ""
  799. "Real-Address Mode Exceptions"
  800. ""
  801. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  802. "#SS If a memory operand effective address is outside the SS segment limit."
  803. ""
  804. "Virtual-8086 Mode Exceptions"
  805. ""
  806. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  807. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  808. "#PF(fault-code) If a page fault occurs."
  809. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made."
  810. [5]
  811. "0F B0/ r CMPXCHG r/m8,r8 Compare AL with r/m8. If equal, ZF is set and r8 is loaded into r/m8. Else, clear ZF and load r/m8 into AL."
  812. "0F B1/ r CMPXCHG r/m16,r16 Compare AX with r/m16. If equal, ZF is set and r16 is loaded into r/m16. Else, clear ZF and load r/m16 into AL."
  813. "0F B1/ r CMPXCHG r/m32,r32 Compare EAX with r/m32. If equal, ZF is set and r32 is loaded into r/m32. Else, clear ZF and load r/m32 into AL."
  814. [6]
  815. </CMPXCHG>
  816. <CMPXCHG8B>
  817. [1]
  818. "CMPXCHG8B: Compare and Exchange 8 Bytes"
  819. ""
  820. "Compares the 64-bit value in EDX:EAX with the operand (destination operand). If the values are equal, the 64-bit value in ECX:EBX is stored in the destination operand. Otherwise, the value in the destination operand is loaded into EDX:EAX. The destination operand is an 8-byte memory location. For the EDX:EAX and ECX:EBX register pairs, EDX and ECX contain the high-order 32 bits and EAX and EBX contain the low-order 32 bits of a 64-bit value."
  821. "This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. To simplify the interface to the processorÆs bus, the destination operand receives a write cycle without regard to the result of the comparison. The destination operand is written back if the comparison fails; otherwise, the source operand is written into the destination. (The processor never produces a locked read without also producing a locked write.)"
  822. ""
  823. "Intel Architecture Compatibility"
  824. ""
  825. "This instruction is not supported on Intel processors earlier than the Pentium processors."
  826. [2]
  827. "IF (EDX:EAX = DEST)"
  828. "ZF ¼ 1"
  829. "DEST ¼ ECX:EBX"
  830. "ELSE"
  831. "ZF ¼ 0"
  832. "EDX:EAX ¼ DEST"
  833. [3]
  834. "The ZF flag is set if the destination operand and EDX:EAX are equal; otherwise it is cleared. The CF, PF, AF, SF, and OF flags are unaffected."
  835. [4]
  836. "Protected Mode Exceptions"
  837. ""
  838. "#UD If the destination operand is not a memory location."
  839. "#GP(0) If the destination is located in a nonwritable segment. If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a null segment selector."
  840. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  841. "#PF(fault-code) If a page fault occurs."
  842. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3."
  843. ""
  844. "Real-Address Mode Exceptions"
  845. ""
  846. "#UD If the destination operand is not a memory location."
  847. "#GP If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  848. "#SS If a memory operand effective address is outside the SS segment limit."
  849. ""
  850. "Virtual-8086 Mode Exceptions"
  851. ""
  852. "#UD If the destination operand is not a memory location."
  853. "#GP(0) If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit."
  854. "#SS(0) If a memory operand effective address is outside the SS segment limit."
  855. "#PF(fault-code) If a page fault occurs."
  856. "#AC(0) If alignment checking is enabled and an unaligned memory reference is made."
  857. [5]
  858. "0F C7 /1 m64 CMPXCHG8B m64 Compare EDX:EAX with m64. If equal, set ZF and load ECX:EBX into m64. Else, clear ZF and load m64 into EDX:EAX."
  859. [6]
  860. </CMPXCHG8B>
  861. <CWD>
  862. <CDQ>
  863. [1]
  864. "CWD/CDQ: Convert Word to Doubleword/Convert Doubleword to Quadword"
  865. ""
  866. "Doubles the size of the operand in register AX or EAX (depending on the operand size) by means of sign extension and stores the result in registers DX:AX or EDX:EAX, respectively."
  867. "The CWD instruction copies the sign (bit 15) of the value in the AX register into every bit position in the DX register. The CDQ instruction copies the sign (bit 31) of the value in the EAX register into every bit position in the EDX register. The CWD instruction can be used to produce a doubleword dividend from a word before a word division, and the CDQ instruction can be used to produce a quadword dividend from a double-word before doubleword division."
  868. "The CWD and CDQ mnemonics reference the same opcode. The CWD instruction is intended for use when the operand-size attribute is 16 and the CDQ instruction for when the operand-size attribute is 32. Some assemblers may force the operand size to 16 when CWD is used and to 32 when CDQ is used. Others may treat these mnemonics as synonyms (CWD/CDQ) and use the current setting of the operand-size attribute to determine the size of values to be converted, regardless of the mnemonic used."
  869. [2]
  870. "IF OperandSize = 16 (* CWD instruction *)"
  871. "THEN DX ¼ SignExtend(AX);"
  872. "ELSE (* OperandSize = 32, CDQ instruction *)"
  873. "EDX ¼ SignExtend(EAX);"
  874. "FI;"
  875. [3]
  876. "None."
  877. [4]
  878. "(All Operating Modes)"
  879. "None."
  880. [5]
  881. "99 CWD DX:AX ¼ sign-extend of AX"
  882. "99 CDQ EDX:EAX ¼ sign-extend of EAX"
  883. [6]
  884. </CWD>
  885. </CDQ>
  886. <CPUID>
  887. [1]
  888. "CPUIDùCPU Identification"
  889. ""
  890. "Provides processor identification information in registers EAX, EBX, ECX, and EDX. This information identifies Intel as the vendor, gives the family, model, and stepping of processor, feature information, and cache information. An input value loaded into the EAX register determines what information is returned."
  891. "The CPUID instruction can be executed at any privilege level to serialize instruction execution. Serializing instruction execution guarantees that any modifications to flags, registers, and memory for previous instructions are completed before the next instruction is fetched and executed. When the input value in register EAX is 0, the processor returns the highest value the CPUID instruction recognizes in the EAX register. A vendor identification string is returned in the EBX, EDX, and ECX registers. For Intel processors, the vendor identification string is ôGenuineIntelö as follows:"
  892. ""
  893. "EBX ¼ 756e6547h (* 'Genu', with G in the low nibble of BL *)"
  894. "EDX ¼ 49656e69h (* 'ineI', with i in the low nibble of DL *)"
  895. "ECX ¼ 6c65746eh (* 'ntel', with n in the low nibble of CL *)"
  896. ""
  897. "Intel Architecture Compatibility"
  898. ""
  899. "The CPUID instruction is not supported in early models of the Intel486 processor or in any Intel Architecture processor earlier than the Intel486 processor. The ID flag in the EFLAGS register can be used to determine if this instruction is supported. If a procedure is able to set or clear this flag, the CPUID is supported by the processor running the procedure."
  900. [2]
  901. "CASE (EAX) OF"
  902. "EAX = 0:"
  903. "EAX ¼ highest input value understood by CPUID; (* 2 for Pentium Pro processor *)"
  904. "EBX ¼ Vendor identification string;"
  905. "EDX ¼ Vendor identification string;"
  906. "ECX ¼ Vendor identification string;"
  907. "BREAK;"
  908. "EAX = 1:"
  909. "EAX[3:0] ¼ Stepping ID;"
  910. "EAX[7:4] ¼ Model;"
  911. "EAX[11:8] ¼ Family;"
  912. "EAX[13:12] ¼ Processor type;"
  913. "EAX[31:12] ¼ Reserved;"
  914. "EBX ¼ Reserved;"
  915. [3]
  916. "None."
  917. [4]
  918. "(All Operating Modes)"
  919. "None."
  920. [5]
  921. "0FA2 CPUID"
  922. [6]
  923. </CPUID>
  924. <CS:>
  925. [1]
  926. "Internal disassembler's symbol which indicates that the next command is used with the CS: segment."
  927. [2]
  928. "═/┴"
  929. [3]
  930. "═/┴"
  931. [4]
  932. "═/┴"
  933. [5]
  934. "N/A"
  935. [6]
  936. </CS:>
  937.