| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  | namespace X86Disassembler.X86.Handlers.Or; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// <summary> | 
					
						
							|  |  |  | /// Handler for OR r/m8, r8 instruction (0x08) | 
					
						
							|  |  |  | /// </summary> | 
					
						
							|  |  |  | public class OrRm8R8Handler : InstructionHandler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Initializes a new instance of the OrRm8R8Handler 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> | 
					
						
							|  |  |  |     public OrRm8R8Handler(byte[] codeBuffer, InstructionDecoder decoder, int length)  | 
					
						
							|  |  |  |         : base(codeBuffer, decoder, length) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return opcode == 0x08; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Decodes an OR r/m8, r8 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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Set the mnemonic | 
					
						
							|  |  |  |         instruction.Mnemonic = "or"; | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-04-14 00:30:53 +03:00
										 |  |  |         // Check if we have enough bytes for the ModR/M byte | 
					
						
							|  |  |  |         if (!Decoder.CanReadByte()) | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-04-14 00:30:53 +03:00
										 |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-04-14 00:30:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Read the ModR/M byte and decode the operands | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |         var (mod, reg, rm, destOperand) = ModRMDecoder.ReadModRM(); | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |          | 
					
						
							|  |  |  |         // The register operand is in the reg field (8-bit register) | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |         string regOperand = ModRMDecoder.GetRegisterName(reg, 8); | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |          | 
					
						
							|  |  |  |         // Handle the r/m operand based on mod field | 
					
						
							|  |  |  |         string rmOperand; | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         if (mod == 3) // Register-to-register | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // Direct register addressing | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |             rmOperand = ModRMDecoder.GetRegisterName(rm, 8); | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |         } | 
					
						
							|  |  |  |         else // Memory addressing | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             // Replace "dword ptr" with "byte ptr" for 8-bit operands | 
					
						
							| 
									
										
										
										
											2025-04-13 23:06:52 +03:00
										 |  |  |             rmOperand = destOperand.Replace("dword ptr", "byte ptr"); | 
					
						
							| 
									
										
										
										
											2025-04-13 02:35:48 +03:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Set the operands (r/m8, r8 format) | 
					
						
							|  |  |  |         instruction.Operands = $"{rmOperand}, {regOperand}"; | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |