
    gQ                     T   U d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ed         Z
i dej        ej        ej        ej        gdej        ej        ej        ej        gd	ej        ej        ej        ej        gd
ej        ej        ej        ej        gdej        ej        ej        ej        gdej        ej         ej!        ej"        gdej#        ej$        ej%        ej&        gdej'        ej(        ej)        ej*        gdej+        ej,        ej-        ej.        gdej/        ej0        ej1        ej2        gdej3        ej4        ej5        ej6        gdej7        ej8        ej9        ej:        gdej;        ej<        ej=        ej>        gdej?        ej@        ejA        ejB        gdejC        ejD        ejE        ejF        gdejG        ejH        ejI        ejJ        gZKeLeMeNe         f         eOd<    G d dejP                  ZQ G d dejP                  ZR G d dejP                  ZSe G d d                      ZTe G d  d!                      ZUe G d" d#                      ZVe G d$ d%                      ZWe G d& d'                      ZXd(efd)ZYd*e
d+ed,         d-eZdz  fd.Z[dS )/z<This module provides types for representing x86 machine code    N)	dataclass)Literal)Register)	RexPrefix)r                        r   r   r	   r
   r   r   r      	   
                  REGISTER_CODESc                       e Zd ZdZdZdZdZdS )AddressingModer   r   r   r	   N)__name__
__module____qualname__INDIRECTINDIRECT_WITH_BYTE_DISPLACEMENT#INDIRECT_WITH_FOUR_BYTE_DISPACEMENTDIRECT     Q/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/encoding/machine.pyr   r   %   s$        H&'#*+'FFFr!   r   c                       e Zd ZdZdZdZdS )InstructionPrefixr         N)r   r   r   LOCKREPEAT_NOT_EQUALREPEAT_EQUALr    r!   r"   r$   r$   +   s        DLLLr!   r$   c                       e Zd ZdZdZdZdZdS )SegmentOverridePrefix6   >   .   &   N)r   r   r   STACKDATACODEEXTRAr    r!   r"   r+   r+   0   s"        EDDEEEr!   r+   c                   `    e Zd ZU edz  ed<   eed<   eed<   edz  ed<   ed             Zd Z	dS )InstructionPrefixesNinstruction_prefixaddress_size_overrideoperand_size_overridesegment_overridec                  &    t          d ddd           S )NF)r5   r    r!   r"   nonezInstructionPrefixes.none=   s    "4t<<<r!   c                    t                      }| j        r|t          | j        g          z  }| j        r|t          dg          z  }| j        r|t          dg          z  }| j        r|t          | j        g          z  }|S )Ng   f   )bytesr6   r7   r8   r9   )selfresults     r"   	__bytes__zInstructionPrefixes.__bytes__A   s    " 	7eT45666F% 	$eTFmm#F% 	$eTFmm#F  	5eT23444Fr!   )
r   r   r   r$   __annotations__boolr+   staticmethodr;   rB   r    r!   r"   r5   r5   6   sx         )D0000+d2222= = \=    r!   r5   c                   V    e Zd ZU eed<   eed<   edefd            Zd Z	d Z
e
Zd ZdS )Opcodeexpansion_prefixvaluec                 B    t          |d         dk    |d                   S )Nr   r   )rG   )clsrI   s     r"   
from_byteszOpcode.from_bytesT   s    eAh$&b	222r!   c                 0    t          | j        dz            S )Nr   rD   rI   r@   s    r"   get_direction_bitzOpcode.get_direction_bitX       DJ+,,,r!   c                 0    t          | j        dz            S )Nr   rO   rP   s    r"   get_register_size_bitzOpcode.get_register_size_bit[   rR   r!   c                 ^    t          dg          | j        z  t          | j        g          z   S )Nr   )r?   rH   rI   rP   s    r"   rB   zOpcode.__bytes___   s)    dV}}d33eTZL6I6IIIr!   N)r   r   r   rD   rC   intclassmethodr?   rM   rQ   rT   get_immediate_size_bitrB   r    r!   r"   rG   rG   O   s         JJJ3u 3 3 3 [3- - -- - - 3J J J J Jr!   rG   c                   @    e Zd ZU eed<   eed<   eed<   d ZdefdZdS )ModRegRMmodregrmc                 b    t          | j        j        dz  | j        dz  z  | j        z  g          S Nr   r	   )r?   r[   rI   r\   r]   rP   s    r"   rB   zModRegRM.__bytes__h   s.    dhn)DHM9DGCDEEEr!   returnc                 B    d| j         j         d| j         d| j         dS N[ ])r[   namer\   r]   rP   s    r"   __str__zModRegRM.__str__k   s+    848=884888dg8888r!   N)	r   r   r   r   rC   	ThreeBitsrB   strrg   r    r!   r"   rZ   rZ   b   sa         		NNNMMMF F F9 9 9 9 9 9 9r!   rZ   c                   L    e Zd ZU ed         ed<   eed<   eed<   d ZdefdZdS )	ScaleIndexByte)r   r   r   r	   scaleindexbasec                 X    t          | j        dz  | j        dz  z  | j        z  g          S r_   )r?   rl   rm   rn   rP   s    r"   rB   zScaleIndexByte.__bytes__t   s+    djAo
a7$)CDEEEr!   r`   c                 8    d| j          d| j         d| j         dS rb   )rl   rm   rn   rP   s    r"   rg   zScaleIndexByte.__str__w   s)    94:99
99TY9999r!   N)	r   r   r   r   rC   rh   rB   ri   rg   r    r!   r"   rk   rk   n   si         :
OOOF F F: : : : : : :r!   rk   c                   z    e Zd ZU edz  ed<   eed<   eed<   edz  ed<   edz  ed<   e	ed<   e	ed<   d	 Z
d
 Zd ZdS )X86MachineInstructionN
rex_prefixprefixesopcode
mod_reg_rmsibdisplacement	immediatec                 ~   d}| j         r$|t          t          | j                             z  }|t          t          | j                  t          | j                  z             z  }| j        r$|t          t          | j                            z  }| j        r$|t          t          | j                            z  }|S Nr   )rs   lenr?   rt   ru   rv   rw   )r@   rm   s     r"   get_displacement_indexz,X86MachineInstruction.get_displacement_index   s    ? 	1St//000EU4=))E$+,>,>>???? 	1St//000E8 	*Stx)))Er!   c                 T    |                                  t          | j                  z   S N)r}   r|   rx   rP   s    r"   get_immediate_indexz)X86MachineInstruction.get_immediate_index   s$    **,,s43D/E/EEEr!   c                 Z   t                      }| j        r|t          | j                  z  }|t          | j                  z  }|t          | j                  z  }| j        r|t          | j                  z  }| j        r|t          | j                  z  }|| j        z  }|| j        z  }|S r   )r?   rs   rt   ru   rv   rw   rx   ry   )r@   machine_codes     r"   rB   zX86MachineInstruction.__bytes__   s    ww? 	3E$/222Ldm,,,dk***? 	3E$/222L8 	,E$(OO+L))&r!   )r   r   r   r   rC   r5   rG   rZ   rk   r?   r}   r   rB   r    r!   r"   rr   rr   |   s         D    !!!!NNN4	$	  F F F    r!   rr   registerc                 @    t           D ]}| t           |         v r|c S dS r{   )r   )r   codes     r"   get_register_coder      s6      ~d+++KKK , qr!   	reg_fieldsize)r          @   rex_reg_extentionc                 t   d }t           ||nddz  | z           D ]}|j        j        |k    r|} nt          d          t          j        t          j        t          j        t          j        t          j	        t          j
        t          j        t          j        i}||                                v r||         S |S )Nr   r	   zUnreachable code (Uh Oh!))r   rI   r   
ValueErrorr   AHSPLCLBPLDLSILBLDILkeys)r   r   r   r   r\   "map_registers_unreachable_with_rexs         r"   register_from_coder      s     $H4E4Q00WX]^^ajjk 6 69>T!!HE " 4555 	X\X\X\X\	D& 5::<<<<1(;;Or!   )\__doc__enumdataclassesr   typingr   x86.registerr   x86.encoding.rexr   rh   ALAXEAXRAXr   CXECXRCXr   DXEDXRDXr   BXEBXRBXr   SPESPRSPCHBPEBPRBPDHSIESIRSIBHDIEDIRDIR8LR8WR8DR8R9LR9WR9DR9R10LR10WR10DR10R11LR11WR11DR11R12LR12WR12DR12R13LR13WR13DR13R14LR14WR14DR14R15LR15WR15DR15r   dictrV   listrC   IntEnumr   r$   r+   r5   rG   rZ   rk   rr   r   rD   r   r    r!   r"   <module>r      sK   > > >  ! ! ! ! ! !       ! ! ! ! ! ! & & & & & & *+	-x|hlC- x|hlC- x|hlC	-
 x|hlC- x|hlC- x|hlC- x|hlC- x|hlC- x|hkB- x|hkB- x}hlC- x}hlC- x}hlC- x}hlC-  x}hlC!-" x}hlC#-S$x.()   (    T\          
    DL           0 J J J J J J J J$ 	9 	9 	9 	9 	9 	9 	9 	9 	: 	: 	: 	: 	: 	: 	: 	: ' ' ' ' ' ' ' 'R    ) 7=3I ^bei^i      r!   