
    g.-                        d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*Z*dede#ded         ded         ez  fdZ+dede!ded         dedz  fdZ,deez  dz  dedz  dedz  de-e.e'dz  f         fdZ/de0ded         de1de.ez  fd Z2d!edz  d"e"dz  d#e0de.e'z  ez  fd$Z3dede!d%e0ded         de&ez  f
d&Z4d'eded         de&ez  fd(Z5ded%e0ded         de&ez  fd)Z6d*ed+         d,ee0z  defd-Z7d. Z8dS )/    )	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                    t          |t                    rt          | j        t          t          f          r]t          |           |j        k    rC|dk    rt          |           dk    r|j        dk    st          j        d|j         d|            S dS t          j        d|j         d|            S t          |t                    rt          | j        t          t          f          st          j        d|  d          S t          | j        t                    r5| j        d	k     s| j        d
k    r|j        dk    rt          j        d          S dS | j        |k    rt          j        d| d| j                   S dS )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      P/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/encoding/encode.pymatch_operandr/      s   ,-- gmh0@%ABB 	^(11\5FFFPTXZPZPZ_x  zA  `B  `B  FH  `H  `H  MY  M^  bd  Md  Md }%i1B%i%i`g%i%ijjj4=!\\->!\!\SZ!\!\]]]	L-	0	0 '-#u66 	^=!\7!\!\!\]]]gmS)) 	Y!!W]S%8%8l>OST>T>T }%WXXXt=L((=!Yl!Y!Y'-!Y!YZZZt    instructionencodingc                    t          | j                  t          |j                  k    r>t          j        dt          | j                   dt          |j                             S t          t          |j                            D ]h}t          | j        |         |j        |         |          }t          |t                    r*|}|                    d| j        |          d           |c S id S )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$D$DDD}  D3{?S;T;T  D  Dadem  fA  bB  bB  D  D  E  E  	Es867788  ";#7#>@[\a@bdhii
j),, 	EOOc(<U(CcccdddLLL	 r0   effective_address
mod_reg_rmsibc           	      \   t          | t                    st                      d fS t          | j        t                    r8t                              d          t          | j        j        ddddd          fS | j        }|r|j        }|j	        }|t          j        k    rt          j        d|          d fS |t          j        k    rt          j        d|          d fS |t          j        k    r|dk    rt          j        d|          d fS t                      d fS |rJ t                      d fS )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:: ww}#0%88 6}}Z((*5F5S5XZ[]^`achjo*p*ppp(5 
!n].@@@;t\22D88NFFF;t\22D88N+++a;t\22D8877D= NN777D=r0   r*   r+         r#   r$   	is_signedc           	         d|z  }|r|dz   }|dz  dz
  }nd}|dz
  }| |k     s| |k    r t          j        d|  d|dd|dd          S d	d
ddd|         }|r|                                n|}t          j        d| |           S )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$		uy00}eeee)eeeV_eeeefff#3C006F(4V\\^^^fF;|6||U+++r0   immediate_valueimmediate_typeimmediate_addressc                 b   || t                      S t          | t                    s#t          | j        d|j        dd|j                  S ||j        z   }|j        r| |z
  n| }t          ||j        dz  |j                  }t          |t                    r|}|	                    d           |S |S )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wwos++ m/.>3F4Q_Qklll/.2EELZLf{1HHHl{2N4G!4K^MghhF&)$$ 0111Mr0   instruction_addressc           
         | j         |j         k    r$t          j        d| j          d|j                    S t          | ||          }||                    d           |S t          j                    }t          | ||j        	                                |          }t          |t                    r|}|                    d           |S |d\  }}	d }
nI|\  }}	t          ||	|j                  }
t          |
t                    r|
}|                    d           |S t          |	|
          }t          |d t          |	t                    r|	nd           }t!          |	|
|          \  }}t#          |||j        |
||t%                                }t'          |                                 |                                |t+          t%          |                    z             }t          |t,                    r|}t$                              d          }nTt          |t                    r.|}|                    d|                                             |S d }t%          |          }t#          |||j        |
|||          }g }|r.|                                |_        |                    |           |rl|                                |_        |j        r7t+          t%          |                    |                                z
   |_        |                    |           |d	k    rt<          j        j         }nt<          j        j!        }tE          t%          |          |i |          S )
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\\IZ\\]]]5k8TRR$##$JKKK  "'))H'Xx?`?`?b?bdhiiN.),, BCCC		'1$$

'5$$'2DhF_``
j),, 	EOO0111L
*J
7
7C#28TYcdv  yA  ZB  ZB  DLCUCU  HL  $M  $MJ2HI[]gil2m2m///
HhoWacfhz  }B  }D  }D  E  E !:!:!<!<h>T>T>V>VXknqrw  yL  sM  sM  oN  oN  YN  O  OI)Z(( 	+(--
33	Iy	)	) +F)B)B)D)DFFGGG#	**/
HhoWacfhz  }L  M  MK 4(;(R(R(T(T%2333 1%8%L%L%N%N"+ 	y,/6I0J0J,K,KNaNuNuNwNw,w*x '/000rzz*.*.&9 : :KWUUUr0   programc                    t                      }g }i }| j        D ]}t          |t                    r*|                    |j        t          |          i           At          |d|          }t          |t                    r|}|	                    d| d           |c S |j
        D ]}|xj        t          |          z  c_         ||j        z  }||j
        z  }t          |||t          j        j                  S )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   GGM$&KF| + +k5)) 	MM;+S-?-?@AAAa..gy)) 	EOO[[[[[\\\LLL!- 	3 	3JM 2 22'w**{FFJNSSSr0   c           	         t          |          }t          |t                    r|}|                    d           |S d }g }|D ]}t	          | |||          }t          |t                    rj| j        |j        k    rY|                    d| j         dt          |j                                                              |	                    |           |}	|s|	}t          |	j                  t          |j                  k     r|	}|r|S d|  d}
|D ]}|j        D ]}|
|j        dz   z  }
|
dz  }
t          j        |
          S )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      s   3D99%y11 #566659 "H% 8 89+vObdhiimY// 		8#v66''(|[=Q(|(|`eflfs`t`t`x`x`z`z(|(|}}}..."/$ 8$7!&-..5F5M1N1NNN$7! !  
8
8
8
8C  N 	' 	'D4<$&&CCt=r0   scale)rU   rT   r(   offsetc                    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)baser   r9   )r   r   rD   )rD   )r)   r*   r   r   )selfr   r   memorys       r.   	as_memoryr      s    $*h'' ?fh'' 	Y%4:U&QQQFF%4:UQWXXXFF	DJ 0	1	1 ?fh'' 	?%4:>>>FF%4:>>>FMr0   c                 `    | j         D ]%}t          |j        t                    r	|j        c S &d S )N)r5   r)   r*   r   )r   r    s     r.   rs   rs      sD    } 	% 	%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      s   ! ! ! ! ! !                  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A  A ! ! ! ! ! ! X X X X X X X X X X X X X X X X       4 4 4 4 4 4 * * * * * * O O O O O O O O B  B  B  B  B  B  B  B  B  B  B  B  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 >V >V >VBTg TWV_ T9MPY9Y T T T T, S PV \ps|\|    >77+ X^ HX    "% % % % %r0   