| 
									
										
										
										
											2025-04-12 23:46:05 +03:00
										 |  |  | namespace X86Disassembler.X86.Handlers.ArithmeticUnary; | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /// <summary> | 
					
						
							|  |  |  | /// Handler for NOT r/m32 instruction (0xF7 /2) | 
					
						
							|  |  |  | /// </summary> | 
					
						
							| 
									
										
										
										
											2025-04-12 23:03:07 +03:00
										 |  |  | public class NotRm32Handler : InstructionHandler | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  | { | 
					
						
							|  |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Initializes a new instance of the NotRm32Handler class | 
					
						
							|  |  |  |     /// </summary> | 
					
						
							|  |  |  |     /// <param name="codeBuffer">The buffer containing the code to decode</param> | 
					
						
							|  |  |  |     /// <param name="decoder">The instruction decoder that owns this handler</param> | 
					
						
							|  |  |  |     /// <param name="length">The length of the buffer</param> | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  |     public NotRm32Handler(byte[] codeBuffer, InstructionDecoder decoder, int length) | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         : base(codeBuffer, decoder, length) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Checks if this handler can decode the given opcode | 
					
						
							|  |  |  |     /// </summary> | 
					
						
							|  |  |  |     /// <param name="opcode">The opcode to check</param> | 
					
						
							|  |  |  |     /// <returns>True if this handler can decode the opcode</returns> | 
					
						
							|  |  |  |     public override bool CanHandle(byte opcode) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         // This handler only handles opcode 0xF7 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         if (opcode != 0xF7) | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         // Check if the reg field of the ModR/M byte is 2 (NOT) | 
					
						
							|  |  |  |         int position = Decoder.GetPosition(); | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  |         if (!Decoder.CanReadByte()) | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         byte modRM = CodeBuffer[position]; | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  |         byte reg = (byte) ((modRM & 0x38) >> 3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         return reg == 2; // 2 = NOT | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Decodes a NOT r/m32 instruction | 
					
						
							|  |  |  |     /// </summary> | 
					
						
							|  |  |  |     /// <param name="opcode">The opcode of the instruction</param> | 
					
						
							|  |  |  |     /// <param name="instruction">The instruction object to populate</param> | 
					
						
							|  |  |  |     /// <returns>True if the instruction was successfully decoded</returns> | 
					
						
							|  |  |  |     public override bool Decode(byte opcode, Instruction instruction) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  |         if (!Decoder.CanReadByte()) | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         // Read the ModR/M byte | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |         var (mod, reg, rm, destOperand) = ModRMDecoder.ReadModRM(); | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         // Verify this is a NOT instruction | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |         if (reg != RegisterIndex.C) | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         // Set the mnemonic | 
					
						
							|  |  |  |         instruction.Mnemonic = "not"; | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         // For direct register addressing (mod == 3), the r/m field specifies a register | 
					
						
							|  |  |  |         if (mod == 3) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |             destOperand = ModRMDecoder.GetRegisterName(rm, 32); | 
					
						
							| 
									
										
										
										
											2025-04-12 21:48:41 +03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         // Set the operands | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |         instruction.Operands = destOperand; | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-12 20:13:01 +03:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  | } |