| 
									
										
										
										
											2025-04-12 22:18:46 +03:00
										 |  |  | namespace X86Disassembler.X86.Handlers.Ret; | 
					
						
							| 
									
										
										
										
											2025-04-12 19:57:42 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /// <summary> | 
					
						
							|  |  |  | /// Handler for RET instruction with immediate operand (0xC2) | 
					
						
							|  |  |  | /// </summary> | 
					
						
							|  |  |  | public class RetImmHandler : InstructionHandler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Initializes a new instance of the RetImmHandler 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 RetImmHandler(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 == 0xC2; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     /// <summary> | 
					
						
							|  |  |  |     /// Decodes a RET instruction with immediate operand | 
					
						
							|  |  |  |     /// </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 = "ret"; | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2025-04-14 01:08:14 +03:00
										 |  |  |         if (!Decoder.CanReadUShort()) | 
					
						
							| 
									
										
										
										
											2025-04-12 19:57:42 +03:00
										 |  |  |         { | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         // Read the immediate value | 
					
						
							| 
									
										
										
										
											2025-04-13 23:22:30 +03:00
										 |  |  |         ushort imm16 = Decoder.ReadUInt16(); | 
					
						
							| 
									
										
										
										
											2025-04-12 19:57:42 +03:00
										 |  |  |          | 
					
						
							|  |  |  |         // Set the operands | 
					
						
							|  |  |  |         instruction.Operands = $"0x{imm16:X4}"; | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |