
    g.-                     n   S SK Jr  S SKrS SKJrJr  S SKJrJrJ	r	J
r
JrJr  S SKJr  S SKJrJrJrJrJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJr  S SKJ r J!r!J"r"J#r#J$r$  S SK%J&r&J'r'  S SK(J)r)  S SK*r*S\S\#S\S   S\S   \-  4S jr+S\S\!S\S   S\S-  4S jr,S\\-  S-  S\S-  S\S-  S\-\.\'S-  4   4S jr/S\0S\S   S\1S\.\-  4S  jr2S!\S-  S"\"S-  S#\0S\.\'-  \-  4S$ jr3S\S\!S%\0S\S   S\&\-  4
S& jr4S'\S\S   S\&\-  4S( jr5S\S%\0S\S   S\&\-  4S) jr6S*\S+   S,\\0-  S\4S- jr7S. r8g)/    )	dataclassN)LiteralSelf)ModRegRMX86MachineInstructionAddressingModeInstructionPrefixesScaleIndexByte	RexPrefix)Register)EffectiveAddressASMInstructionASMCodeLabelOperand	Immediate)	Traceback)calculate_modregrm)calculate_sib)get_operand_register_sizeget_regrm_operands)load_instruction_set_dataInstructionEncodingFormatImmediateTypeOperandTypeRegisterSize)AssembledMachineCode
Relocation)rex_prefix_fromoperandoperand_typebits)    @   returnTc                 n   [        U[        5      (       a  [        U R                  [        [        45      (       ae  [        U 5      UR                  :w  aK  US:X  a  [        U 5      S:X  a  UR                  S:X  d&  [        R                  " SUR                   SU  35      $ g[        R                  " SUR                   SU  35      $ [        U[        5      (       a  [        U R                  [        [        45      (       d  [        R                  " SU  S35      $ [        U R                  [        5      (       aF  U R                  S	:  d  U R                  S
:  a&  UR                  S:w  a  [        R                  " S5      $ gU R                  U:w  a&  [        R                  " SU SU R                   35      $ g)Nr$   r#   z	Expected z bit register, got register Tz bit register, got z'Expected immediate (int or label), got z insteadr         z0Only 32 bit immediates are currently unsupportedzExpected register z, got )
isinstancer   valuer   r   r   sizer   newr   intr   )r    r!   r"   s      2/mnt/public/Repos/urclelf/./x86/encoding/encode.pymatch_operandr/      s   ,--gmmh0@%ABB(1\5F5FFPTXZPZ_x  zA  `B  FH  `H  MY  M^  M^  bd  Md }}y1B1B0CC_`g_h%ijj==9\->->,??RSZR[!\]]	L-	0	0'--#u66==#J7)S[!\]]gmmS))!W]]S%8l>O>OST>T }}%WXX==L(==#5l^6'--!YZZ    instructionencodingc                    [        U R                  5      [        UR                  5      :w  aB  [        R                  " S[        U R                  5       S[        UR                  5       35      $ [        [        UR                  5      5       Hg  n[        U R                  U   UR                  U   U5      n[        U[        5      (       d  MA  UnUR                  SU R                  U    S35        Us  $    g )NzIncorrect operand count of z, expected z	Operand 'z' is not of the expected type.)	lenoperandspermitted_operandsr   r,   ranger/   r)   	elaborate)r1   r2   r"   index
match_testerrors         r.   get_mismatched_operand_errorsr<   '   s    
; C(C(C$DD}}:3{?S?S;T:UU`adem  fA  fA  bB  aC  D  E  	Es86678";#7#7#>@[@[\a@bdhi
j),,EOOi(<(<U(C'DDbcdL 9r0   effective_address
mod_reg_rmsibc           	         [        U [        5      (       d  [        5       S 4$ [        U R                  [        5      (       a9  [        R                  S5      [        U R                  R                  SSSSS5      4$ U R                  nU(       a  UR                  nUR                  nU[        R                  :X  a  [        R                  " SU5      S 4$ U[        R                  :X  a  [        R                  " SU5      S 4$ U[        R                  :X  a  US:X  a  [        R                  " SU5      S 4$ [        5       S 4$ U(       a   e[        5       S 4$ )N00000000r   r(   Fz<bz<i   )r)   r   bytesdisplacementr   fromhexr   namemodrmr   INDIRECT_WITH_BYTE_DISPLACEMENTstructpack#INDIRECT_WITH_FOUR_BYTE_DISPACEMENTINDIRECT)r=   r>   r?   rD   rG   rH   s         r.   calculate_displacementrN   3   s   ')9::w}#00%88}}Z(*5F5S5S5X5XZ[]^`achjo*ppp(55nn]].@@@;;t\2D88NFFF;;t\2D88N+++a;;t\2D887D= N77D=r0   r*   r+         r#   r$   	is_signedc           	         SU-  nU(       a  US-  * nUS-  S-
  nOSnUS-
  nX:  d  X:  a"  [         R                  " SU  SUS SUS S35      $ S	S
SSS.U   nU(       a  UR                  5       OUn[        R                  " SU 3U 5      $ )N      r   zValue z is not in the range z#xz thru )BHIQrO   <)r   r,   lowerrJ   rK   )r*   r+   rR   total_values	min_value	max_valuesymbols          r.   int_as_bytesra   L   s    d7L"a'(	!Q&!+		 1$	u0}}veW,A)BvV_`bUccdeff#3C06F(V\\^fF;;6(|U++r0   immediate_valueimmediate_typeimmediate_addressc                    Ub  U c
  [        5       $ [        U [        5      (       d.  [        U R                  SUR
                  SSUR                  5      $ X!R
                  -   nUR                  (       a  X-
  OU n[        XAR
                  S-  UR                  5      n[        U[        5      (       a  UnUR                  S5        U$ U$ )Nr   TrP   zImmediate out of range)
rC   r)   r-   r   rF   r+   is_relativera   r   r8   )rb   rc   rd   instruction_end_addressimmediate_value_relativebinaryr;   s          r.   encode_immediaterj   _   s    !8wos++/..>3F3F4Q_QkQkll/2E2EELZLfLfHl{24G4G!4K^MgMghF&)$$01Mr0   instruction_addressc           
      f   U R                   UR                   :w  a0  [        R                  " SU R                    SUR                    35      $ [        XU5      nUb  UR	                  S5        U$ [
        R                  " 5       n[        XUR                  R                  5       U5      n[        U[        5      (       a  UnUR	                  S5        U$ Uc  Su  pS n
ODUu  p[        XUR                  5      n
[        U
[        5      (       a  U
nUR	                  S5        U$ [        X5      n[        US [        U	[        5      (       a  U	OS 5      n[!        XU5      u  p[#        XUR                  XU[%        5       5      n['        U R)                  5       UR)                  5       U[+        [%        U5      5      -   5      n[        U[,        5      (       a  Un[$        R/                  S5      nOH[        U[        5      (       a&  UnUR	                  SU R)                  5        35        U$ S n[%        U5      n[#        XUR                  XUU5      n/ nU(       a&  UR1                  5       Ul        UR5                  U5        U(       ab  UR7                  5       Ul        UR8                  (       a+  [+        [%        U5      5      UR7                  5       -
  * Ul        UR5                  U5        US	:X  a  [<        R>                  R@                  nO[<        R>                  RB                  n[E        [%        U5      U0 U5      $ )
NzWrong Mnemonic z != z$Instruction contains invalid operandz(Cannot generate r/m field, bad operands.)NNzBad modregrm fieldFCFFFFFFzBad immediate r$   )#mnemonicr   r,   r<   r8   r	   noner   opcodeget_direction_bitr)   r   opcode_extentionr   r   r   rN   r   rC   rj   get_immediater4   r   rE   get_displacement_indexr9   appendget_immediate_indexrf   addendtargetIsaX64X86r   )r1   r2   rk   r"   bad_operand_errorprefixesregrm_operandsr;   registerregister_or_memoryr>   r?   
rex_prefixdisplacement_bytesdisplacement_relocationmachine_instruction	immediateimmediate_relocationimmediate_bytesrelocationsmachines                        r.   !encode_instruction_using_encodingr   p   s   x000}}{/C/C.DDIZIZH[\]]5kTR$##$JK  "'')H'x?`?`?bdhiN.),,BC		'1$
'5$'hF_F_`
j),,EOO01L
*
7C#28TYcdv  yA  ZB  ZBCU  HL  $MJ2HI[il2m//
hooWahz  }B  }D  E !:!:!<h>T>T>VXknqrw  yL  sM  oN  YN  OI)Z(((--
3	Iy	)	).)B)B)D(EFG#	*/
hooWahz  }L  MK(;(R(R(T%23%8%L%L%N"++,/6I0J,KNaNuNuNw,w*x '/0rz**..**..&9 :KWUUr0   programc                    [        5       n/ n0 nU R                   H  n[        U[        5      (       a(  UR	                  UR
                  [        U5      05        M@  [        USU5      n[        U[        5      (       a  UnUR                  SU S35        Us  $ UR                   H!  nU=R                  [        U5      -  sl        M#     X&R                  -  nX6R                  -  nM     [        X#U[        R                  R                   5      $ )Nr   z.x86 Assembly contains an invalid instruction '')rC   coder)   r   updaterF   r4   encoder   r8   r   r9   ri   r   rx   ry   r{   )	r   r"   program_bytesr   labelsr1   encodedr;   
relocations	            r.   assembler      s    GM$&KF||k5))MM;++S-?@Aa.gy))EOOL[MYZ[\L!--JM 22 .'*** $  FFJJNNSSr0   c           	         [        U5      n[        U[        5      (       a  UnUR                  S5        U$ S n/ nU H  n[	        XX5      n[        U[        5      (       aq  U R
                  UR
                  :X  aU  UR                  SU R
                   S[        UR                  5      R                  5        35        UR                  U5        M  M  Un	U(       d  U	n[        U	R                  5      [        UR                  5      :  d  M  U	nM     U(       a  U$ SU  S3n
U H,  nUR                   H  nXR                  S-   -  n
M     U
S-  n
M.     [        R                  " U
5      $ )Nzx86 ISA data loading failedzFailure to encode z with opcode zCannot encode instruction 'z'

)r   r)   r   r8   r   rn   rC   rp   hexru   r4   ri   errorsmessager,   )r1   rk   r"   instruction_formatsr;   smallest_encodingfailuresformatencode_resultencoded_instructionmsgfailuremeggs                r.   r   r      sR   3D9%y11#5659 "H%9+ObimY//##v6''*<[=Q=Q<RR_`eflfsfs`t`x`x`z_{(|}. 7 #0$$7!&--.5F5M5M1NN$7! &   '}C
8CNND<<$&&C #t  ==r0   scale)rU   rT   r(   offsetc                    [        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)baser   r9   )r   r   rD   )rD   )r)   r*   r   r   )selfr   r   memorys       r.   	as_memoryr      s    $**h''fh''%4::UQF M &4::UXF M 
DJJ 0	1	1 M fh''%4::>F M &4::>FMr0   c                     U R                    H0  n[        UR                  [        5      (       d  M$  UR                  s  $    g )N)r5   r)   r*   r   )r   r    s     r.   rs   rs      s+    }}G'--33}}$ %r0   )9dataclassesr   rJ   typingr   r   x86.encoding.machiner   r   r   r	   r
   r   x86.registerr   x86.asmr   r   r   r   r   r   r;   r   x86.encoding.modregrmr   x86.encoding.sibr   x86.encoding.getregrmr   r   x86.encoding.encodingsr   r   r   r   r   x86.encoding.outputr   r   x86.encoding.rexr   rx   r/   r<   tuplerC   rN   r-   boolra   rj   r   r   r   r   rs    r0   r.   <module>r      sw   !    A  A ! X X  4 * O B  B @ , 7 + WV_ Y`aeYfirYr ,	~ 	Ib 	jqrxjy 	  H  KO  O 	h9I.ID.P ^fim^m   uC  FJ  uJ   OT  UZ  \f  im  \m  Um  On 2, ,7=#9 ,d ,uW`O` ,&i$&6 X\H\ qt y~  BL  zL  OX  zX ">V> >VMf >V  ~A >V  IP  QW  IX >V  ]q  t}  ]} >VBTg TWV_ T9MPY9Y T, S PV \ps|\| >77+ X^ HX "%r0   