
    h              
       D   d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	 ddl
mZ  G d dej                  Z G d	 d
ej                  Z ed           G d d                      Z G d dej                  Zeez  Z ed           G d d                      Z ed           G d d                      Z ed           G d d                      Z G d d          Zej        fdeeez  ez           dededeez  fdZdeded ed!ed"         d#ef
d$ZdS )%z9This module provides types for respresenting x86 assembly    )	dataclassN)LiteralSelf)RegisterGeneralRegisters)	Tracebackc                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBS )CMnemonicadcaddandcallcallfcmpcwdcwdedecdividivincimulintjbejcjgejlejnojaejmpjmpfjbjljnbjnejnsjnbejncjnpjpjojsjejajglealooploopnzloopznegnopnotmovmulorpoppopadpushpushadrclrcrretrolrorsalsalcsarsbbsubshlshrtestxchgxorN)D__name__
__module____qualname__ADCADDANDCALLCALLFCMPCWDCWDEDECDIVIDIVINCIMULINTJBEJCJGEJLEJNOJAEJMPJMPFJBJLJNBJNEJNSJNBEJNCJNPJPJOJSJEJAJGLEALOOPLOOPNZLOOPZNEGNOPNOTMOVMULORPOPPOPADPUSHPUSHADRCLRCRRETROLRORSALSALCSARSBBSUBSHLSHRTESTXCHGXOR     1/home/seanl/mnt/public/Repos/urclelf/./x86/asm.pyr
   r
      sS       
C
C
CDE
C
CD
C
CD
CD
C
C	B
C
C
C
C
CD	B	B
C
C
CD
C
C	B	B	B
B	B	B
CDFE
C
C
C
C
C	B
CEDF
C
C
C
C
C
CD
C
C
C
C
CDD
CCCr   r
   c                       e Zd ZdZdZdZdZdS )PointerSizezBYTE PTRzWORD PTRz	DWORD PTRz	QWORD PTRN)rL   rM   rN   BYTEWORDDWORDQWORDr   r   r   r   r   K   s"        DDEEEEr   r   T)frozenc                   &    e Zd ZU eed<   defdZdS )Labelnamereturnc                     | j          S N)r   selfs    r   __str__zLabel.__str__U   s    )~r   N)rL   rM   rN   str__annotations__r   r   r   r   r   r   Q   s:         
III      r   r   c                   "    e Zd ZdZdZdZdZdZdS )Segment ssdscsesN)rL   rM   rN   DEFAULTSTACKDATACODEEXTRAr   r   r   r   r   X   s'        GEDDEEEr   r   c                       e Zd ZU ej        Zeed<   ej        Z	eed<   dZ
edz  ed<   dZedz  ed<   dZed         ed<   d	Zeed
<   defdZdS )EffectiveAddresspointer_sizesegmentNbaseindex   )r            scaler   displacementr   c                    g }| j         r'|                    t          | j                              | j        r?|                    t          | j                  | j        dk    r
d| j         ndz              | j        s|s'|                    t          | j                             | j        j         d}| j        t          j
        k    r|| j         dz  }|d                    |          dz   z  }|S )Nr   *r   z [:+])r   appendr   r   r   r   r   valuer   r   r   join)r   termsresults      r   r   zEffectiveAddress.__str__j   s    9 	)LLTY(((: 	ZLLTZ
a,<
,<,<,<UWXYYY 	1E 	1LLT.//000%+///<7?**((((F#((5//C''r   )rL   rM   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   	Immediater   r   r   r   r   r   r   a   s          + 1L+111GW&&& D(T/   !E8d?!!!!"E7:"""L)      r   r   c                   X    e Zd ZU eez  ez  ed<   ded         deez  defdZ	de
fdZdS )	Operandr   r   )r   r   r   offsetr   c                    t          | j        t                    rEt          |t                    rt          | j        ||          }nzt          | j        ||          }nbt          | j        t                    r| j        }n@t          |t                    rt          | j                  }nt          | j                  }|S )N)r   r   r   )r   r   r   )r   )
isinstancer   r   r   )r   r   r   memorys       r   	as_memoryzOperand.as_memory   s    dj(++ 	C&(++ ])tzfUUU)tzU[\\\
$455 	CZFF&(++ C)tzBBB)tzBBBr   c                 *    t          | j                  S r   )r   r   r   s    r   r   zOperand.__str__   s    4:r   N)rL   rM   rN   r   r   r   r   r   r   r   r   r   r   r   r   r   r   {   s{         &&2222ww/ C L\           r   r   c                   B    e Zd ZU eed<   ee         ed<   d ZdefdZ	dS )ASMInstructionmnemonicoperandsc                 `    | j         D ]%}t          |j        t                    r	|j        c S &d S r   )r   r   r   r   )r   operands     r   get_immediatezASMInstruction.get_immediate   sD    } 	% 	%G'-33 %}$$$%	% 	%r   r   c                     | j         j        }d                    d | j        D                       }|r|dt	          |          z   z  }|S )Nz, c                 ,    g | ]}t          |          S r   )r   ).0r   s     r   
<listcomp>z*ASMInstruction.__str__.<locals>.<listcomp>   s    HHHwc'llHHHr    )r   r   r   r   r   )r   r   r   s      r   r   zASMInstruction.__str__   sP    $99HH$-HHHII 	*cCMM))Fr   N)
rL   rM   rN   r
   r   listr   r   r   r   r   r   r   r   r      s\         7m% % %      r   r   c                       e Zd Zdedz  deeez           ddfdZdedee	e
z  ez           fdZd	e
e	z  ez  d
e
e	z  ez  fdZdefdZdefdZdefdZdefdZdS )ASMCodeoriginNcoder   c                 "    || _         || _        d S r   entry_pointr   )r   r   r   s      r   __init__zASMCode.__init__   s    !			r   r   r   c                     t          |g           }|D ])}|j                            t          |                     *| j                            |           d S r   )r   r   r   r   r   )r   r   r   instructionr   s        r   add_instructionzASMCode.add_instruction   s^    $Xr22 	: 	:G ''(8(89999	%%%%%r   destinationsourcec                     ||k    rc|dk    r9t          |t                    r$|                     t          j        ||g           d S |                     t          j        ||g           d S d S Nr   )r   r   r   r
   r   rz   )r   r   r   s      r   add_movezASMCode.add_move   sr    &  {{z+x@@{$$X\K3MNNNNN$$X\K3HIIIII	 ! r   	registersc                 6   |                      t          j        |j        g           |                      t          j        |j        g           |                      t          j        |j        g           |                      t          j        |j        g           d S r   )r   r
   r   abcdr   r   s     r   *add_instructions_to_save_general_registersz2ASMCode.add_instructions_to_save_general_registers   sx    X]Y[M:::X]Y[M:::X]Y[M:::X]Y[M:::::r   c                 6   |                      t          j        |j        g           |                      t          j        |j        g           |                      t          j        |j        g           |                      t          j        |j        g           d S r   )r   r
   r}   r   r   r   r   r   s     r   -add_instructions_to_restore_general_registersz5ASMCode.add_instructions_to_restore_general_registers   sx    X\IK=999X\IK=999X\IK=999X\IK=99999r   otherc                 B    | j         |j         k    o| j        |j        k    S r   r   )r   r   s     r   __eq__zASMCode.__eq__   s!    5#44Pej9PPr   c                     g }| j         D ]R}t          |t                    r|                    | d           0|                    t	          |                     Sd                    |          S )Nr   
)r   r   r   r   r   r   )r   linesr   s      r   r   zASMCode.__str__   sw    9 	/ 	/K+u-- /...////S--....yyr   )rL   rM   rN   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s3       sTz nu6L1M RV    
& &DAQT\A\_hAh<i & & & &JH/?$?)$K JU]`pUps|U| J J J J;DT ; ; ; ;:GW : : : :QD Q Q Q Q             r   r   valuesr   r   r   c                 D   g }d}d }| D ]s}t          |t                    r||z  }t          |t                    r|                    |           H||}Mt	          j        d|j         d|j         d          c S |r|rt	          j        d|j         d           |r|}d }d }t          |          dk    rnTt          |          dk    r	|d         }n8t          |          dk    r|d         }|d         }nt	          j        d	          S t          |||||
          S )Nr   z9Effective address cannot contain two symbol references ('z' and 'z')zVEffective address that contain memory literal cannot also have symbolic reference to ''r   r   z8Effective address cannot contain more than two registers)r   r   r   r   r   )	r   r   r   r   r   newr   lenr   )	r   r   r   r   r   symbolr   r   r   s	            r   sum_into_effective_addressr     s    "ILF 	E 	EeS!! 	EE!LLx(( 	EU####~ }  &Dagal  &D  &Duzu  &D  &D  &D  E  E  E  E  E  }ouoz}}}~~~ DE
9~~	Y1		|	Y1		|!}WXXXwTY^myzzzzr   r   source_1source_2bits)    @   	do_moduloc                 ,   t          dg           }g }t          j        t          j        t          j        fD ]C}|| j        k    r6|                    t          j        |g           |	                    |           D|
                    t          j        |j                   |
                    t          j        d           |
                    t          j        |j                   |                    t          j        t          j        g           |r&|
                    | j        t          j                   n%|
                    | j        t          j                   |                                D ]#}|                    t          j        |g           $|S r   )r   r   EAXEBXEDXr   r   r
   r   r   r   rX   __reversed__r}   )r   r  r  r  r	  r   	temp_regsregisters           r   generate_division_coder     sI   Q^^F "I\8<> ' '{(((""8=8*===X&&&
OOHL(.111
OOHL!$$$
OOHL(.111
8<(,888 9)8<8888)8<888**,, 9 9x|hZ8888Mr   )__doc__dataclassesr   enumtypingr   r   x86.registerr   r   errorr   StrEnumr
   r   r   r   r   r   r   r   r   r   r   r   r  boolr  r   r   r   <module>r     s   ; ; ! ! ! ! ! !                  3 3 3 3 3 3 3 3      A A A A At| A A AF    $,    $           dl    %K	
$       2 $       , $       (-  -  -  -  -  -  -  - ^ qxp !{ !{tC%K(,B'C !{S^ !{ho !{  EU  Xa  Ea !{ !{ !{ !{F 7 g ]dek]l y}      r   