
    gI                        d Z ddlZddlmZ ddlmZ ed         Z G d dej                  Z G d d	ej                  Z	 G d
 dej                  Z
e G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Ze G d d                      Z G d dej                  ZdS )z<This module provides types for representing x86 machine code    N)	dataclass)Literal)r                        c                       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     H/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/machine.pyr   r      s$        H&'#*+'FFFr   r   c                       e Zd ZdZdZdZdS )InstructionPrefix         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!      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)r+   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   )bytesr,   r-   r.   r/   )selfresults     r   	__bytes__zInstructionPrefixes.__bytes__(   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!   staticmethodr1   r8   r   r   r   r+   r+      sx         )D0000+d2222= = \=    r   r+   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   )r=   )clsr?   s     r   
from_byteszOpcode.from_bytes;   s    eAh$&b	222r   c                 0    t          | j        dz            S )Nr   r:   r?   r6   s    r   get_direction_bitzOpcode.get_direction_bit?       DJ+,,,r   c                 0    t          | j        dz            S )Nr   rE   rF   s    r   get_register_size_bitzOpcode.get_register_size_bitB   rH   r   c                 ^    t          dg          | j        z  t          | j        g          z   S )Nr   )r5   r>   r?   rF   s    r   r8   zOpcode.__bytes__F   s)    dV}}d33eTZL6I6IIIr   N)r   r   r   r:   r9   intclassmethodr5   rC   rG   rJ   get_immediate_size_bitr8   r   r   r   r=   r=   6   s         JJJ3u 3 3 3 [3- - -- - - 3J J J J Jr   r=   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   )r5   rQ   r?   rR   rS   rF   s    r   r8   zModRegRM.__bytes__O   s.    dhn)DHM9DGCDEEEr   returnc                 B    d| j         j         d| j         d| j         dS N[ ])rQ   namerR   rS   rF   s    r   __str__zModRegRM.__str__R   s+    848=884888dg8888r   N)	r   r   r   r   r9   	ThreeBitsr8   strr]   r   r   r   rP   rP   I   sa         		NNNMMMF F F9 9 9 9 9 9 9r   rP   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 rU   )r5   rb   rc   rd   rF   s    r   r8   zScaleIndexByte.__bytes__[   s+    djAo
a7$)CDEEEr   rV   c                 8    d| j          d| j         d| j         dS rX   )rb   rc   rd   rF   s    r   r]   zScaleIndexByte.__str__^   s)    94:99
99TY9999r   N)	r   r   r   r   r9   r^   r8   r_   r]   r   r   r   ra   ra   U   si         :
OOOF F F: : : : : : :r   ra   c                   ^    e Zd ZU 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S )	X86InstructionprefixesopcodeN
mod_reg_rmsibdisplacement	immediatec                 `   t                      }| j        r|t          | j                  z  }|t          | j                  z  }| j        r|t          | j                  z  }| j        r|t          | j                  z  }|t          | j                  z  }|t          | j                  z  }|S N)r5   ri   rj   rk   rl   rm   rn   )r6   machine_codes     r   r8   zX86Instruction.__bytes__j   s    ww= 	1E$-000Ldk***? 	3E$/222L8 	,E$(OO+Ld/000dn---r   )
r   r   r   r+   r9   r=   rP   ra   r5   r8   r   r   r   rh   rh   a   ss         !!!!NNN4	$	    r   rh   c                   F    e Zd ZU eed<   eed<   ed         ed<   defdZdS )RegisterTyper\   code)          sizerV   c                     | j         S rp   )r\   rF   s    r   r]   zRegisterType.__str__   s
    yr   N)r   r   r   r_   r9   r^   r   r]   r   r   r   rs   rs   y   sT         
III
OOO
)
      r   rs   c                      e Zd Z eddd          Z eddd          Z eddd          Z edd	d          Z ed
d	d          Z edd	d          Z	 eddd          Z
 eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z eddd          Z ed d!d          Z ed"d!d          Z ed#d!d          Zed$ed%efd&            Zed'efd(            Z d) Z!d* Z"d+S ),Registeralr   ru   axrv   eaxrw   blr   bxebxclr   cxecxdlr   dxedxahr   spespchr	   bpebpdhr
   siesibhr   diedirt   rx   c                 b    t           D ]&}|j        j        | k    r|j        j        |k    r|c S 'd S rp   )r{   r?   rt   rx   )rt   rx   registers      r   	from_codezRegister.from_code   sD      	  	 H~"d**x~/Bd/J/J	  	 r   r\   c                 f    t           D ](}|j        j        |                                 k    r|c S )d S rp   )r{   r?   r\   lower)r\   r   s     r   	from_namezRegister.from_name   sA      	  	 H~"djjll22 3	  	 r   c                     | j         j        S rp   )r?   rt   rF   s    r   get_codezRegister.get_code   s    zr   c                 *    t          | j                  S rp   )r_   r?   rF   s    r   r]   zRegister.__str__   s    4:r   N)#r   r   r   rs   ALAXEAXBLBXEBXCLCXECXDLDXEDXAHSPESPCHBPEBPDHSIESIBHDIEDIr;   rL   r   r_   r   r   r]   r   r   r   r{   r{      sM       	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C	dAq	!	!B	dAr	"	"B
,ua
$
$C   3       \ 
         \ 
      r   r{   )__doc__enumdataclassesr   typingr   r^   IntEnumr   r   r!   r+   r=   rP   ra   rh   rs   Enumr{   r   r   r   <module>r      s?   > >  ! ! ! ! ! !       *+	    T\          
    DL           0 J J J J J J J J$ 	9 	9 	9 	9 	9 	9 	9 	9 	: 	: 	: 	: 	: 	: 	: 	:        .        * * * * *ty * * * * *r   