
    h              
          S r SSKJr  SSKrSSKJrJr  SSKJrJ	r	  SSK
Jr   " S S\R                  5      r " S	 S
\R                  5      r\" SS9 " S S5      5       r " S S\R                  5      r\\-  r\" SS9 " S S5      5       r\" SS9 " S S5      5       r\" SS9 " S S5      5       r " S S5      r\R.                  4S\\\-  \-     S\S\S\\-  4S jjrS\S\S \S!\S"   S#\4
S$ jrg)%z9This module provides types for respresenting x86 assembly    )	dataclassN)LiteralSelf)RegisterGeneralRegisters)	Tracebackc                      \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr Sr!S r"S!r#S"r$S#r%S$r&S%r'S&r(S'r)S(r*S)r+S*r,S+r-S,r.S-r/S.r0S/r1S0r2S1r3S2r4S3r5S4r6S5r7S6r8S7r9S8r:S9r;S:r<S;r=S<r>S=r?S>r@S?rAS@rBSArCSBrDSCrEgD)E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xor N)F__name__
__module____qualname____firstlineno__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__static_attributes__rM       &/mnt/public/Repos/urclelf/./x86/asm.pyr
   r
      sG   
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
Cr   r
   c                   $    \ rS rSrSrSrSrSrSrg)PointerSizeK   zBYTE PTRzWORD PTRz	DWORD PTRz	QWORD PTRrM   N)	rN   rO   rP   rQ   BYTEWORDDWORDQWORDr   rM   r   r   r   r   K   s    DDEEr   r   T)frozenc                   .    \ rS rSr% \\S'   S\4S jrSrg)LabelQ   namereturnc                     U R                    $ N)r   selfs    r   __str__Label.__str__U   s    ))r   rM   N)rN   rO   rP   rQ   str__annotations__r   r   rM   r   r   r   r   Q   s    
I r   r   c                   (    \ rS rSrSrSrSrSrSrSr	g)	SegmentX    ssdscsesrM   N)
rN   rO   rP   rQ   DEFAULTSTACKDATACODEEXTRAr   rM   r   r   r   r   X   s    GEDDEr   r   c                       \ rS rSr% \R
                  r\\S'   \R                  r
\\S'   Sr\S-  \S'   Sr\S-  \S'   Sr\S   \S	'   S
r\\S'   S\4S jrSrg)EffectiveAddressa   pointer_sizesegmentNbaseindex   )r         r   scaler   displacementr   c                 X   / nU R                   (       a$  UR                  [        U R                   5      5        U R                  (       aF  UR                  [        U R                  5      U R                  S:w  a  SU R                   3OS-   5        U R
                  (       d  U(       d$  UR                  [        U R
                  5      5        U R                  R                   S3nU R                  [        R                  :w  a  X R                   S3-  nUSR                  U5      S-   -  nU$ )Nr   *r   z [:+])r   appendr   r   r   r   r   valuer   r   r   join)r   termsresults      r   r   EffectiveAddress.__str__j   s    99LLTYY(::LLTZZ

aa

|,<UWXYELLT../0%%++,B/<<7??*a((F#((5/C''r   rM   )rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   	Immediater   r   r   rM   r   r   r   r   a   sa     + 1 1L+1GW& D(T/ !E8d?!!"E7:"L) r   r   c                   \    \ rS rSr% \\-  \-  \S'   S\S   S\\	-  S\4S jr
S\4S jrS	rg
)Operand{   r   r   )r   r   r   offsetr   c                    [        U R                  [        5      (       aB  [        U[        5      (       a  [        U R                  XS9nU$ [        U R                  XS9n U$ [        U R                  [        5      (       a  U R                  nU$ [        U[        5      (       a  [        U R                  S9nU$ [        U R                  S9nU$ )N)r   r   r   )r   r   r   )r   )
isinstancer   r   r   )r   r   r   memorys       r   	as_memoryOperand.as_memory   s    djj(++&(++)tzzU  *tzz\  

$455ZZF  &(++)tzzB  *tzzBr   c                 ,    [        U R                  5      $ r   )r   r   r   s    r   r   Operand.__str__   s    4::r   rM   N)rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   rM   r   r   r   r   {   sC    &&22ww/ C L\   r   r   c                   D    \ rS rSr% \\S'   \\   \S'   S rS\	4S jr
Srg)	ASMInstruction   mnemonicoperandsc                     U R                    H0  n[        UR                  [        5      (       d  M$  UR                  s  $    g r   )r   r   r   r   )r   operands     r   get_immediateASMInstruction.get_immediate   s+    }}G'--33}}$ %r   r   c                     U R                   R                  nSR                  U R                   Vs/ s H  n[	        U5      PM     sn5      nU(       a  US[	        U5      -   -  nU$ s  snf )Nz,  )r   r   r   r   r   )r   r   r   r   s       r   r   ASMInstruction.__str__   sW    $$99$--H-wc'l-HIcCM))F	 Is   A&rM   N)rN   rO   rP   rQ   r
   r   listr   r   r   r   r   rM   r   r   r   r      s#    7m% r   r   c                       \ rS rSrS\S-  S\\\-     SS4S jrS\	S\\
\-  \-     4S	 jrS
\\
-  \-  S\\
-  \-  4S jrS\4S jrS\4S jrS\4S jrS\4S jrSrg)ASMCode   originNcoder   c                     Xl         X l        g r   entry_pointr   )r   r   r   s      r   __init__ASMCode.__init__   s    !	r   r   r   c                     [        U/ 5      nU H'  nUR                  R                  [        U5      5        M)     U R                  R                  U5        g r   )r   r   r   r   r   )r   r   r   instructionr   s        r   add_instructionASMCode.add_instruction   sC    $Xr2G  ''(89  		%r   destinationsourcec                     X:w  a_  US:X  a7  [        U[        5      (       a"  U R                  [        R                  X/5        g U R                  [        R
                  X/5        g g Nr   )r   r   r   r
   r   r}   )r   r   r   s      r   add_moveASMCode.add_move   sN     {z+x@@$$X\\K3MN$$X\\K3HI	 !r   	registersc                 \   U R                  [        R                  UR                  /5        U R                  [        R                  UR                  /5        U R                  [        R                  UR
                  /5        U R                  [        R                  UR                  /5        g r   )r   r
   r   abcdr   r   s     r   *add_instructions_to_save_general_registers2ASMCode.add_instructions_to_save_general_registers   sj    X]]Y[[M:X]]Y[[M:X]]Y[[M:X]]Y[[M:r   c                 \   U R                  [        R                  UR                  /5        U R                  [        R                  UR                  /5        U R                  [        R                  UR
                  /5        U R                  [        R                  UR                  /5        g r   )r   r
   r   r  r   r   r   r  s     r   -add_instructions_to_restore_general_registers5ASMCode.add_instructions_to_restore_general_registers   sj    X\\IKK=9X\\IKK=9X\\IKK=9X\\IKK=9r   otherc                 t    U R                   UR                   :H  =(       a    U R                  UR                  :H  $ r   r   )r   r  s     r   __eq__ASMCode.__eq__   s+    5#4#44Pejj9PPr   c                     / nU R                    HH  n[        U[        5      (       a  UR                  U S35        M.  UR                  [	        U5      5        MJ     SR                  U5      $ )Nr   
)r   r   r   r   r   r   )r   linesr   s      r   r   ASMCode.__str__   sW    99K+u--}A./S-.	 %
 yyr   )r   r   )rN   rO   rP   rQ   r   r   r   r   r   r
   r   r   r   r   r   r   r  r  r   r
  r   r   r   rM   r   r   r   r      s    sTz nu6L1M RV 
& &DAQT\A\_hAh<i &JH/?$?)$K JU]`pUps|U| J;DT ;:GW :QD Q   r   r   valuesr   r   r   c                 T   / nSnS nU  H~  n[        U[        5      (       a  XF-  nM  [        U[        5      (       a  UR                  U5        MF  Uc  UnMM  [        R
                  " SUR                   SUR                   S35      s  $    U(       a+  U(       a$  [        R
                  " SUR                   S35        U(       a  UnS nS n[        U5      S:X  a  OE[        U5      S:X  a  US   nO0[        U5      S:X  a  US   nUS   nO[        R
                  " S	5      $ [        XXxUS
9$ )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     s1    "ILFeS!!!Lx((U#~ }}'`agalal`mmtuzuu  uA  AC  &D  E  E  nouozozn{{|}~DE
9~	Y1	|	Y1	|!}}WXXTmyzzr   r   source_1source_2bits)    @   	do_moduloc                    [        S/ 5      n/ n[        R                  [        R                  [        R                  4 HF  nXpR
                  :w  d  M  UR                  [        R                  U/5        UR                  U5        MH     UR                  [        R                  UR
                  5        UR                  [        R                  S5        UR                  [        R                  UR
                  5        UR                  [        R                  [        R                  /5        U(       a+  UR                  U R
                  [        R                  5        O*UR                  U R
                  [        R                  5        UR                  5        H$  nUR                  [        R                  U/5        M&     U$ r   )r   r   EAXEBXEDXr   r   r
   r   r   r   r[   __reversed__r   )r   r  r  r  r  r   	temp_regsregisters           r   generate_division_coder$     s   Q^F "I\\8<<>(((""8==8*=X& ? OOHLL(..1
OOHLL!$
OOHLL(..1
8<<(,,8))8<<8))8<<8**,x||hZ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$  rM   r   r   <module>r-     s]   ; !    3 At|| AF$,,  $  dll  %K	
$  2 $  , $  (-  - ^ qxpp !{tC%K(,B'C !{S^ !{ho !{  EU  Xa  Ea !{F 7 g ]dek]l y} r   