
    khw                     z   % S SK r S SKJr  S SKrS SKrS SKJrJr  S SKrS SK	J
r
  S SKr\ R                  " S5      \R                  R                  \ R                  " S5      \R                  R                  \ R                  " S5      \R                  R                   \ R                  " S5      \R                  R"                  \ R                  " S	5      \R                  R$                  \ R                  " S
5      \R                  R&                  \ R(                  " 5       \R                  R*                  \ R,                  " 5       \R                  R.                  0r\\ R                  \ R(                  -  \ R,                  -  \R                  4   \S'   0 \ R                  " S5      \R                  R6                  _\ R                  " S5      \R                  R8                  _\ R                  " S5      \R                  R:                  _\ R                  " S5      \R                  R<                  _\ R                  " S	5      \R                  R>                  _\ R                  " S
5      \R                  R@                  _\ R(                  " 5       \R                  RB                  _\ R,                  " 5       \R                  RD                  _\ R                  " S5      \R                  RF                  _\ R                  " S5      \R                  RH                  _\ R                  " S5      \R                  RJ                  _\ R                  " S5      \R                  RL                  _\ R                  " S5      \R                  RN                  _\ R                  " S5      \R                  RP                  _\ R                  " S5      \R                  RR                  _\ R                  " S5      \R                  RT                  _r+\\ R                  \ R(                  -  \ R,                  -  \R                  4   \S'   Sr,S r-S\ R                  \ R(                  -  \ R,                  -  S\S   S\R\                  \-  4S jr/S\ R`                  S\S   S\ R                  \ R(                  -  \ R,                  -  \-  4S jr1S\ R`                  S\S   S\R                  \Rd                  -  \Rf                  -  \-  4S jr4S\ R`                  S\ Rj                  \-  4S jr6S\ Rn                  Rp                  S\S   S\R\                  \-  4S jr9S\:S\;4S jr<S\ R`                  4S  jr=S\ R`                  S\S   4S! jr>S\ R`                  S"\;4S# jr?S\ R`                  S\S   S\R                  \-  4S$ jrAS\ R`                  S\S   4S% jrBS\ R`                  S\S   4S& jrCS\ R`                  S\S   4S' jrDS\ R`                  S\S   4S( jrES\ R`                  S\S   4S) jrFS\ R`                  S\S   4S* jrGS\ R`                  S\S   4S+ jrHS\ R`                  S\S   4S, jrIS\ R`                  S\S   4S- jrJS\ R`                  S\S   4S. jrKS\ R`                  S\S   4S/ jrLS\ R`                  S\S   4S0 jrMS\ R`                  S\S   4S1 jrN\
 " S2 S35      5       rO\O" \ R                  \>S 5      \O" \ R                  R                  \ R                  R                  /\?S5      \O" \ R                  R                  /\NS5      \O" \ R                  \AS5      \O" \ R                  \BS5      \O" \ R                  R                  \ R                  R                  /\CS5      \O" \ R                  R                  /\DS5      \O" \ R                  R                  /\ES5      \O" \ R                  \FS5      \O" \ R                  \GS5      \O" \ R                  R                  /\HS5      \O" \ R                  R                  /\IS5      \O" \ R                  R                  /\JS5      \O" \ R                  R                  /\KS5      \O" \ R                  R                  /\LS5      \O" \ R                  R                  /\MS5      /rc\d\O   \S4'   g)5    N)	Traceback)CallableLiteral)	dataclass                  URCL_X86_REGISTER_MAPPING   	   
      URCL_X64_REGISTER_MAPPINGzCould not parse urcl sourceregisterbits    @   returnc                     US:X  a  [         nO[        nUR                  U 5      nU(       a  [        R                  " U5      $ [
        R                  " SU  S35      $ )Nr   URCL register z< could not be mapped to a machine register or memory address)r   r   getx86Operandr   new)r   r   register_mappingx86_registers       */mnt/public/Repos/urclelf/./compile_x86.pyconvert_urcl_register_to_x86r"   ,   sR    rz44#''1L{{<(( }}~hZ7stuu    instructionc                 F   U R                   (       dO  [        R                  " U R                  R                  R                  5        S3U R                  U R                  S9$ U R                   S   R                  n[        U[        R                  [        R                  [        R                  45      (       di  [        R                  " U R                  R                  R                  5        S3U R                   S   R                  U R                   S   R                  S9$ U$ )Nz5 instruction is missing operands, expected a registerline_numbercolumn_numberr   z5 instruction expected first operand to be a register.)operandsr   r   mnemonicnameupperr'   r(   value
isinstanceurclGeneralRegisterBasePointerStackPointer)r$   r   urcl_destination_registers      r!   get_destination_registerr4   :   sB   }} 4 4 9 9 ? ? ABBwx  GR  G^  G^  ny  nG  nG  H  	H + 4 4Q 7 = =/$2F2FHXHXZ^ZkZk1lmm}} 4 4 9 9 ? ? ABBwx  GR  G[  G[  \]  G^  Gj  Gj  zE  zN  zN  OP  zQ  z_  z_  `  	`$$r#   c                 h   [        X5      n[        U[        5      (       aN  UnUR                  U R                  R
                  R                  5        S3U R                  U R                  S9  U$ [        X!5      n[        U[        5      (       a  UnUR                  SU S35        U$ UR                  $ )Nz: instruction does not have valid register as a destinationr&   r    has no x86/x64 equivalent)r4   r.   r   	elaborater*   r+   r,   r'   r(   r"   r-   )r$   r   r3   errorx86_destination_registers        r!   get_x86_destination_registerr:   D   s     8 K+Y77);//44::<==wx  GR  G^  G^  ny  nG  nG  	H;<U\*I66(.)B(CC]^_#)))r#   c                    U R                   (       dO  [        R                  " U R                  R                  R                  5        S3U R                  U R                  S9$ U R                   S   R                  n[        U[        R                  5      (       di  [        R                  " U R                  R                  R                  5        S3U R                   S   R                  U R                   S   R                  S9$ U$ )Nz2 instruction is missing operands, expected a labelr&   r   z1 instruction expected first operand to be a label)r)   r   r   r*   r+   r,   r'   r(   r-   r.   r/   Label)r$   urcl_destinations     r!   get_jump_targetr>   S   s,   }} 4 4 9 9 ? ? ABBtu  DO  D[  D[  kv  kD  kD  E  	E"++A.44&

33}} 4 4 9 9 ? ? ABBst  CN  CW  CW  XY  CZ  Cf  Cf  vA  vJ  vJ  KL  vM  v[  v[  \  	\r#   operandc                    [        U R                  [        R                  R                  5      (       a>  [
        R                  " [
        R                  " U R                  R                  5      5      $ [        U R                  [        R                  [        R                  [        R                  45      (       aP  [        U R                  U5      n[        U[        5      (       a#  UnUR                  SU R                   S35        U$ U$ [        U R                  [        5      (       a   [
        R                  " U R                  5      $ [        U R                  [        R                  R                  5      (       a*  [
        R                  " U R                  R                   5      $ [        U R                  [        R                  R"                  5      (       a3  [
        R                  " [%        U R                  R&                  5      5      $ [        U R                  [        R(                  5      (       a4  [
        R                  " U R                  R                  R*                  5      $ [        U R                  [        R,                  5      (       a  [
        R                  " S5      $ [        R.                  " SU  S35      $ )Nr   r6   r   zURCL operand )r.   r-   r/   urclcstr<   r   r   r+   r0   r1   r2   r"   r   r7   intRelativeAddressoffset	CharacterordcharPortidDefinedImmediater   )r?   r   r   r8   s       r!   urcl_operand_to_x86rK   ]   s   '--!3!344{{399W]]%7%7899	GMMD$8$8$:J:JDL]L]#^	_	_/tDh	**EOOnW]]O;UVWL	GMM3	'	'{{7==))	GMM4<<#?#?	@	@{{7==//00	GMM4<<#9#9	:	:{{3w}}11233	GMM499	-	-{{7==..1122	GMM4#8#8	9	9{{1~}}}WI5OPQQr#   r-   bytes_per_intc           	          [         R                  " [        U 5      U-  5      nS/U-  n[        U [	        X!-  [        U 5      -
  5      -   5       H$  u  pEX$U-  -
  S-
  nXA-  S-  nX6==   XW-  -  ss'   M&     U$ )zxGivin a sequence of bytes, what little endian ints do we push
to the stack to make the stack pointer point to the bytes?r   r   r   )mathceillen	enumeratebytes)r-   rL   	int_countresultibyte	int_indexshift_amounts           r!   bytes_to_stack_intsrY   u   s     		#e*}45IS9_FUU9+Ds5z+Q%RRSm!34q8	)Q.T11 T
 Mr#   c                     [         R                  " SU R                  R                   3U R                  U R
                  5      $ Nz,No x86 translation for for URCL instruction )r   r   r*   r+   r'   r(   )r$   s    r!   emit_no_translation_errorr\      sJ    ==GH\H\HaHaGbcepe|e|  J  X  X  Y  Yr#   c                    [         R                  " S/ 5      nU R                  [        R                  R
                  :X  a  [        R                  " US U5        U$ U R                  [        R                  R                  :X  a,  UR                  [         R                  R                  / 5        U$ U R                  [        R                  R                  :X  a,  UR                  [         R                  R                  / 5        U$  eNr   )r   ASMCoder*   r/   MnemonicHLTsysvadd_syscall_exitNOPadd_instructionRET)r$   r   x86_codes      r!    compile_zero_operand_instructionrh      s    {{1b!Ht}}000hd3 O 
		!2!2	2  !1!126 O 
		!2!2	2  !1!126 O 	ur#   entry_pointc                    [         R                  " U/ 5      nU R                  [        R                  R
                  [        R                  R                  4;   Gaw  [        U 5      n[        U[        R                  R                  5      (       Ga7  U R                  [        R                  R
                  :X  aK  UR                  [         R                  R
                  [         R                  " UR                  5      /5        U$ U R                  [        R                  R                  :X  aK  UR                  [         R                  R                  [         R                  " UR                  5      /5        U$ [        R                  " SU R                  R                  R!                  5        3U R"                  U R$                  5      $ ['        U 5        U$ r[   )r   r_   r*   r/   r`   JMPCALr>   r.   rA   r<   re   r+   CALLr   r   r,   r'   r(   r\   )r$   ri   rg   destination_operands       r!   &compile_unconditional_jump_instructionro      sc   {{;+H 1 14==3D3DEE-k:)4<<+=+=>>##t}}'8'88(()9)9CIIFYF^F^<_;`a O %%):)::(():):SYYGZG_G_=`<ab O	 !}}'ST_ThThTmTmTsTsTuSv%w  zE  zQ  zQ  S^  Sl  Sl  m  m%k2Or#   c                    [         R                  " S/ 5      nU R                  [        R                  ;   Ga.  [        U 5      n[        U[        5      (       aB  UnUR                  U R                  R                   S3U R                  U R                  5        U$ [        U R                  S   U5      n[        U[        5      (       a  UnU$ UR                  [         R                  R                   UR"                  S/5        U R                  [        R                  R$                  :X  aK  UR                  [         R                  R&                  [         R(                  " UR                  5      /5        U$ U R                  [        R                  R*                  :X  aK  UR                  [         R                  R,                  [         R(                  " UR                  5      /5        U$ U R                  [        R                  R.                  :X  aK  UR                  [         R                  R0                  [         R(                  " UR                  5      /5        U$ [3        U 5        U$ )Nr   z= instruction operand 1 is of incorrect type (expected label).r   )r   r_   r*   r/   $TWO_OPERAND_CONDITION_JUMP_MNEMONICSr>   r.   r   r7   r+   r'   r(   rK   r)   re   r`   CMPr-   BNZJNEr<   BRZJEBRPJGEr\   )r$   r   rg   rn   r8   x86_source_operands         r!   $compile_two_operand_jump_instructionrz      s   {{1b!HtHHH-k:)955'EOO{338899vw  zE  zQ  zQ  S^  Sl  Sl  mL01E1Ea1H$O()44&EL  !1!14F4L4La3PQ4==#4#44$$S\\%5%5		BUBZBZ8[7\] O !!T]]%6%66$$S\\__syyATAYAY7Z6[\ O !!T]]%6%66$$S\\%5%5		BUBZBZ8[7\] O &k2Or#   c                 :   [         R                  " S/ 5      nU R                  [        R                  ;   Gad  [        U 5      n[        U[        R                  R                  5      (       dF  [        R                  " U R                  R                   SU S3U R                  U R                  5      $ [        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a  U$ [        U[        5      (       a  U$ UR!                  [         R"                  R$                  UR&                  UR&                  /5        U R                  [        R"                  R(                  :X  aK  UR!                  [         R"                  R*                  [         R                  " UR                  5      /5        U$ U R                  [        R"                  R,                  :X  aK  UR!                  [         R"                  R.                  [         R                  " UR                  5      /5        U$ U R                  [        R"                  R0                  :X  aK  UR!                  [         R"                  R2                  [         R                  " UR                  5      /5        U$ U R                  [        R"                  R4                  :X  aK  UR!                  [         R"                  R6                  [         R                  " UR                  5      /5        U$ U R                  [        R"                  R8                  :X  aK  UR!                  [         R"                  R:                  [         R                  " UR                  5      /5        U$ [=        U 5        U$ )Nr   z instruction operand 1 'z(' is of incorrect type (expected label).r   r   )r   r_   r*   r/   &THREE_OPERAND_CONDITION_JUMP_MNEMONICSr>   r.   rA   r<   r   r   r+   r'   r(   rK   r)   re   r`   rr   r-   BLEJBEBGErx   BRErv   BNErt   BRLJLr\   )r$   r   rg   rn   x86_source_operand_1x86_source_operand_2s         r!   &compile_three_operand_jump_instructionr      s   {{1b!HtJJJ-k:-t||/A/ABB==K$8$8$=$=#>>VWjVk  lT  "U  Wb  Wn  Wn  p{  pI  pI  J  J2;3G3G3JDQ2;3G3G3JDQ*I66''*I66''  !1!14H4N4NPdPjPj3kl4==#4#44$$S\\%5%5		BUBZBZ8[7\] O !!T]]%6%66$$S\\%5%5		BUBZBZ8[7\] O !!T]]%6%66$$S\\__syyATAYAY7Z6[\ O !!T]]%6%66$$S\\%5%5		BUBZBZ8[7\] O !!T]]%6%66$$S\\__syyATAYAY7Z6[\ O &k2Or#   c                 Z   [         R                  " S/ 5      nU R                  [        R                  R
                  [        R                  R                  4;   a  [        X5      n[        U[        5      (       a  U$ [        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a  U$ [        U[        5      (       a  U$ [         R                  " [         R                  " U5      XEXR                  [        R                  R                  :H  S9nU$ )Nr   r   r   )	do_modulo)r   r_   r*   r/   r`   DIVMODr:   r.   r   rK   r)   generate_division_coder   )r$   r   rg   destinationsource_1source_2s         r!   compile_division_instructionr      s   {{1b!H 1 14==3D3DEE2;Ek9--&{';';A'>E&{';';A'>Eh	**Oh	**O--ckk+.F\`  mA  mA  CG  CP  CP  CT  CT  mT  UOr#   c                 V   [         R                  " U5      n[         R                  " S/ 5      nU R                  [        R
                  R                  :X  GaR  [        U R                  S   R                  [        R                  5      (       a3  U R                  S   R                  nU R                  S   R                  nOe[        U R                  S   R                  [        5      (       a7  [        R                  R                  U R                  S   R                  5      nOS nUc=  [        R                  " SU R                  S    S3U R                  U R                   5      $ U[        R                  R"                  :X  GaB  [        U R                  S   R                  [        5      (       a3  [%        U R                  S   R                  5      R'                  S5      nGOK[        U R                  S   R                  [(        5      (       a)  U R                  S   R                  R'                  S5      nO[        U R                  S   R                  [        R*                  5      (       a3  U R                  S   R                  R,                  R'                  S5      nO[        U R                  S   R                  [        R.                  5      (       a  U R                  S   R                  nO=[        R                  " SU R                  S    S3U R                  U R                   5      $ UR1                  U5        [        U[        R.                  5      (       av  US-  nSn[3        Xa5      n	[        U	[        5      (       a  U	n
U
R5                  S	U S
35        U
$ UR7                  [         R
                  R8                  U	R                  /5        Ok[:        R<                  " [?        U5      S-  5      n[?        U5      n[A        US5       H.  nUR7                  [         R
                  R8                  U/5        M0     [B        RD                  " X2RF                  U[B        RH                  RJ                  U5        UR7                  [         R
                  RL                  URF                  US-  /5        URO                  U5        U$ [Q        U R                  S   U5      n[        U[        5      (       a%  Un
U
R5                  SU R                  S    35        U
$ UR7                  [         R
                  R8                  UR                  /5        UR7                  [         R
                  RR                  [         RT                  " SURV                  RY                  5        S35      /5        U$ )Nr   OUT instruction operand 1 '' is not a valid portr   utf-8OUT instruction operand 2 '' cannot be output onto a port.r   Destination register  for OUT instruction is invalidr
   z'OUT instruction cannot compile operand 
urcl_port__out)-r   get_registersr_   r*   r/   r`   OUTr.   r)   r-   rH   rB   
from_valuer   r   r'   r(   TEXTchrencodestrrE   rG   r0   *add_instructions_to_save_general_registersr"   r7   re   PUSHrN   rO   rP   rY   rb   add_syscall_fwritespFileSTDOUTADD-add_instructions_to_restore_general_registersrK   rm   r<   r+   lower)r$   r   	registersrg   port	port_nameoutput_stringstring_length_bytesrS   r   r8   uintarguments                r!   compile_out_instructionr      s   !!$'I{{1b!Ht}}000k**1-33TYY??''*00D#,,Q/55I,,Q/55s;;99''(<(<Q(?(E(EFDD<==#>{?S?STU?V>WWl!moz  pG  pG  IT  Ib  Ib  c  c499>>! +..q177== #K$8$8$;$A$A B I I' RK003993?? + 4 4Q 7 = = D DW MK003994>>JJ + 4 4Q 7 = = B B I I' RK003994;O;OPP + 4 4Q 7 = = }}'B;CWCWXYCZB[[z%{  ~I  ~U  ~U  Wb  Wp  Wp  q  q??	J-)=)=>>&*ai#	:=Ok955'EOO&;M?Ji$jk L(():):[=N=N<OP IIc-&8A&>?	&)-&8#/qAD,,S\\->->G B##Hll<OQUQZQZQaQacgh$$S\\%5%5	iRSm7TUBB9M O +;+?+?+BDIH(I.. "I+J^J^_`JaIb cd$$S\\%6%68HI$$S\\%6%6ZPTPYPYP_P_PaObbfCg9h8ijOr#   c                 	   [         R                  " U5      n[         R                  " S/ 5      nU R                  [        R
                  R                  :X  Ga2  [        U R                  S   R                  [        R                  5      (       a  U R                  S   R                  nOe[        U R                  S   R                  [        5      (       a7  [        R                  R                  U R                  S   R                  5      nOS nUc=  [        R                  " SU R                  S    S3U R                  U R                   5      $ [        U R                  S   R                  [        5      (       a3  [#        U R                  S   R                  5      R%                  S5      nGOK[        U R                  S   R                  [&        5      (       a)  U R                  S   R                  R%                  S5      nO[        U R                  S   R                  [        R(                  5      (       a3  U R                  S   R                  R*                  R%                  S5      nO[        U R                  S   R                  [        R,                  5      (       a  U R                  S   R                  nO=[        R                  " SU R                  S    S3U R                  U R                   5      $ UR/                  U5        [        U[        R,                  5      (       as  SnSn[1        XQ5      n[        U[        5      (       a  Un	U	R3                  S	U S
35        U	$ UR5                  [         R
                  R6                  UR                  /5        Ok[8        R:                  " [=        U5      S-  5      n[=        U5      n[?        US5       H.  n
UR5                  [         R
                  R6                  U
/5        M0     [@        RB                  " X2RD                  U[@        RF                  RH                  U5        UR5                  [         R
                  RJ                  URD                  US-  /5        URM                  U5        U$ )Nr   r   r   r   r   r   r   r
   r   r   )'r   r   r_   r*   r/   r`   r   r.   r)   r-   rH   rB   r   r   r   r'   r(   r   r   r   rE   rG   r0   r   r"   r7   re   r   rN   rO   rP   rY   rb   r   r   r   r   r   r   )r$   r   r   rg   r   r   r   uint32_countr   r8   u32s              r!   compile_in_instructionr   )  s   !!$'I{{1b!Ht}}000k**1-33TYY??''*00D,,Q/55s;;99''(<(<Q(?(E(EFDD<==#>{?S?STU?V>WWl!moz  pG  pG  IT  Ib  Ib  c  c k**1-33S99 4 4Q 7 = =>EEgNM,,Q/55s;;'00399@@IM,,Q/55t~~FF'00399>>EEgNM,,Q/55t7K7KLL'00399M==#>{?S?STU?V>WWv!w  zE  zQ  zQ  S^  Sl  Sl  m  m;;IFmT%9%9::"#L6}KK+y11#"7Fe fg$$S\\%6%69J9J8KL99S%7!%;<L"%m"4*=!<(():):SEB =,,8KTYYM]M]_cd  !1!1ILL,QRBR3ST>>yIOr#   c                    [         R                  " S/ 5      nU R                  [        R                  ;   GaV  [        X5      n[        U[        5      (       a  U$ U R                  [        U R                  5      S-
     n[        XA5      n[        U[        5      (       a.  UnUR                  SU 3UR                  UR                  5        U$ UR                  X5R                  5        U R                  [        R                   R"                  [        R                   R$                  4;   a   U$ U R                  [        R                   R&                  :X  a-  UR)                  [         R                   R&                  U/5        U$ U R                  [        R                   R*                  :X  a-  UR)                  [         R                   R*                  U/5        U$ U R                  [        R                   R,                  :X  a-  UR)                  [         R                   R,                  U/5        U$ U R                  [        R                   R.                  :X  a-  UR)                  [         R                   R.                  U/5        U$ U R                  [        R                   R0                  :X  aY  UR)                  [         R                   R2                  U/5        UR)                  [         R                   R4                  US/5        U$ U R                  [        R                   R6                  :X  aY  UR)                  [         R                   R2                  U/5        UR)                  [         R                   R4                  US/5        U$ [9        U 5        U$ )Nr   r   zInvalid source operand l    i)r   r_   r*   r/    TWO_OPERAND_ARITHMETIC_MNEMONICSr:   r.   r   r)   rP   rK   r7   r'   r(   add_mover-   r`   MOVIMMINCre   DECNEGNOTLSHROLANDRSHr\   )r$   r   rg   r   urcl_source_operandry   r8   s          r!   *compile_two_operand_arithmetic_instructionr   [  s   {{1b!HtDDD2;Ek9--)223{7K7K3Lq3PQ01DK()44&EOO56I5JKM`MlMl  oB  oP  oP  QL+'?'?@DMM$5$5t}}7H7H#II$ O# !!T]]%6%66$$S\\%5%5}E  O !!T]]%6%66$$S\\%5%5}E O !!T]]%6%66$$S\\%5%5}E O !!T]]%6%66$$S\\%5%5}E O !!T]]%6%66$$S\\%5%5}E$$S\\%5%5EU7VW O !!T]]%6%66$$S\\%5%5}E$$S\\%5%5Y7OP O &k2Or#   c                    [         R                  " S/ 5      nU R                  [        R                  ;   Ga  [        X5      n[        U[        5      (       a  U$ [        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a  U$ [        U[        5      (       a  U$ U R                  S   U R                  S   :w  a  UR                  X4R                  5        [        R                  R                  [         R                  R                  [        R                  R                  [         R                  R                  [        R                  R                  [         R                  R                  0nUR!                  U R                  5      nU(       a  UR#                  XsUR                  /5        U$ [%        U 5        U$ )Nr   r   r   )r   r_   r*   r/   "THREE_OPERAND_ARITHMETIC_MNEMONICSr:   r.   r   rK   r)   r   r-   r`   r   SUBXORr   re   r\   )r$   r   rg   r   r   r   arithmetic_mappingx86_mnemonics           r!   ,compile_three_operand_arithmetic_instructionr     sa   {{1b!HtFFF2;Ek9--&{';';A'>E&{';';A'>Eh	**Oh	**O"k&:&:1&==k>>:MMs||//MMs||//MMs||//A

 *--k.B.BC$$\3PQ O &k2Or#   c                 P   [         R                  " S/ 5      nU R                  [        R                  R
                  4;   ae  [        U R                  S   U5      n[        U[        5      (       a  U$ UR                  [         R                  R                  UR                  /5        U$ r^   )r   r_   r*   r/   r`   PSHrK   r)   r.   r   re   r   r-   )r$   r   rg   ry   s       r!   compile_push_instructionr     s    {{1b!H 1 12201E1Ea1H$O()44%%  !2!25G5M5M4NOOr#   c                     [         R                  " S/ 5      nU R                  [        R                  R
                  4;   aM  [        X5      n[        U[        5      (       a  U$ UR                  [         R                  R
                  U/5        U$ r^   )
r   r_   r*   r/   r`   POPr:   r.   r   re   )r$   r   rg   r    s       r!   compile_pop_instructionr     sk    {{1b!H 1 1223KFlI..  !1!1L>BOr#   c                    [         R                  " S/ 5      nU R                  [        R                  R
                  [        R                  R                  4;   Ga  [        X5      n[        U[        5      (       a  UnUR                  S5        U$ [        U R                  S   U5      n[        U[        5      (       a&  UnUR                  SU R                  S    S35        U$ UR                    [        U R                  5      S:X  as  U R                  S   R                  n[        U[        5      (       dD  [        R                   " SU R                  S   R"                  U R                  S   R$                  S	9$ OSn[        U[        5      (       a  U$ [        UR                  [         R&                  5      (       a&  [        R                   " S
U R                  S    35      $ [         R(                  " UR                  U/[         R*                  R,                  5      n[        U[        5      (       a  UnUR                  S5        U$ UR/                  [         R                  R0                  X7/5        U$ )Nr   z(LLOD instruction has invalid destinationr   zLLOD base address 'z' is not validr	   r   zLLOD index must be an integerr&   z<Source operand for load instruction must be a register, not z/LLOD target address cannot be translated to x86)r   r_   r*   r/   r`   LODLLODr:   r.   r   r7   rK   r)   r-   rP   rB   r   r'   r(   EffectiveAddresssum_into_effective_addressPointerSizeDWORDre   r   )r$   r   rg   x86_destinationr8   sourceindexmemorys           r!   compile_list_load_instructionr     s   {{1b!H 1 14==3E3EFF6{Ioy11#EOOFGL$[%9%9!%<dCfi((EOO1+2F2Fq2I1J.YZL{##$)((+11EeS)) }}%DR]RfRfghRiRuRu  FQ  FZ  FZ  [\  F]  Fk  Fk  l  l * Efi((MfllC$8$899==#_`k`t`tuv`w_x!yzz//u0EsG\G\]fi((EOOMNL  !1!1O3LMOr#   c                    [         R                  " S/ 5      nU R                  [        R                  R
                  4;   Ga  [        U R                  S   U5      n[        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a%  UnUR                  SU R                  S    35        U$ [        U[        5      (       a%  UnUR                  SU R                  S    35        U$ [        U[        5      (       a%  UnUR                  SU R                  S    35        U$ [        UR                  [        [         R                  45      (       d&  [        R                  " SU R                  S    35      $ UR                  SUR                  S9nUR                  nUR!                  [         R                  R"                  X4/5        U$ )	Nr   r   r   z,LSTR instruction got invalid source operand z1LSTR instruction got invalid destination operand z3LSTR index operand must be an int or register, not r
   scalerD   )r   r_   r*   r/   r`   LSTRrK   r)   r.   r   r7   r-   rB   Registerr   	as_memoryre   r   )r$   r   rg   destr   r   r8   s          r!   compile_list_store_instructionr     s   {{1b!H 2 233";#7#7#:DA$[%9%9!%<dC#K$8$8$;TBfi((EOOJ;K_K_`aKbJcdeLdI&&EOOOP[PdPdefPgOhijLeY''EOOQR]RfRfghRiQjklL%++S\\':;;==#VWbWkWklmWnVo!pqq!!%++!>zz  !1!1D>BOr#   c                    [         R                  " S/ 5      nU R                  [        R                  R
                  4;   Ga  [        X5      n[        U[        5      (       a  U$ [        U R                  S   U5      n[        U[        5      (       a  U$ UR                  SSS9n[        U[         R                  5      (       d   e[         R                  " [         R                  " S5      U/[         R                  R                   5      n[        U[        5      (       a   eUR#                  [         R                  R$                  XdR&                  /5        U$ )Nr   r   r
   r   urcl_m0)r   r_   r*   r/   r`   r   r:   r.   r   rK   r)   r   r   r   r<   r   r   re   r   r-   )r$   r   rg   r    r   r   fixmes          r!   compile_load_instructionr     s   {{1b!H 1 1223KFlI..$[%9%9!%<dCfi((M!!!!4,5555..		)0Dl/SUXUdUdUjUjkeY////  !1!1E<<3HIOr#   c                 `   [         R                  " S/ 5      nU R                  [        R                  R
                  4;   a  [        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a%  UnUR                  SU R                  S    35        U$ [        U[        5      (       a%  UnUR                  SU R                  S    35        U$ UR                  SSS9nUR                  nUR                  [         R                  R                  X4/5        U$ )Nr   r   z+STR instruction got invalid source operand z0STR instruction got invalid destination operand r
   r   )r   r_   r*   r/   r`   STRrK   r)   r.   r   r7   r   r-   re   r   )r$   r   rg   r   r   r8   s         r!   compile_store_instructionr     s   {{1b!H 1 122";#7#7#:DA$[%9%9!%<dCfi((EOOI+J^J^_`JaIbcdLdI&&EOON{OcOcdeOfNghiL~~Aa~0  !1!1D>BOr#   c                    [         R                  " S/ 5      nUS:X  aO  [         R                  R                  n[         R                  R                  n[         R                  R                  nON[         R                  R
                  n[         R                  R                  n[         R                  R
                  nU R                  [        R                  R                  4;   Ga  [        X5      n[        U[        5      (       a  U$ [        U R                  S   U5      n[        U R                  S   U5      n[        U[        5      (       a  U$ [        U[        5      (       a  U$ Xc:w  a+  UR!                  [         R                  R"                  U/5        Xd:w  a+  UR!                  [         R                  R"                  U/5        UR%                  X7R&                  5        UR!                  [         R                  R(                  UR&                  /5        UR%                  Xe5        Xd:w  a+  UR!                  [         R                  R*                  U/5        Xc:w  a+  UR!                  [         R                  R*                  U/5        U$ )Nr   r   r   r   )r   r_   r   RAXRDXEAXEDXr*   r/   r`   MLTr:   r.   r   rK   r)   re   r   r   r-   MULr   )	r$   r   rg   multiplicand_1_registermultiplicand_2_registerresult_registerr   r   r   s	            r!   compile_multiply_instructionr     s   {{1b!Hrz"%,,"2"2"%,,"2"2,,**"%,,"2"2"%,,"2"2,,** 1 1222;Ek9--&{';';A'>E&{';';A'>Eh	**Oh	**O1$$S\\%6%69P8QR1$$S\\%6%69P8QR1>>B  !1!1HNN3CD+71$$S\\%5%58O7PQ1$$S\\%5%58O7PQOr#   c                       \ rS rSr% \\R                     \S'   \\R                  \
S   /\R                  \-  4   \S'   \\S'   Srg)InstructionFamilyi?  	mnemonicsr   compileoperand_count N)__name__
__module____qualname____firstlineno__listr/   r`   __annotations__r   InstructionCSTNoder   r   r_   r   rB   __static_attributes__r   r#   r!   r   r   ?  s@    DMM""t..@#++PYBYYZZr#   r   TRANSLATIONS)er/   r8   r   r   rN   typingr   r   rb   dataclassesr   x86.registerr0   r   r   EBXECXr   EDIESIr1   EBPr2   ESPr   dictr  r   RBXRCXr   RDIRSIRBPRSPR8R9R10R11R12R13R14R15r   PARSING_ERROR_MESSAGENO_ERROR_EXIT_CODEr   r"   r  r4   r   	Immediater:   r<   r>   rA   OperandCSTNoderK   rR   rB   rY   r\   rh   ro   r_   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZERO_OPERAND_MNEMONICSr`   rk   rl   r   rq   r|   r   r   r   INr   r   r   r   r   r   r   r   r  r  r   r#   r!   <module>r%     s	     
  $  !  	S\\--S\\--S\\--S\\--S\\--S\\--(())	n 4 4 4t7G7G G$J[J[ []`]i]i ij 	nS\\--nS\\--n 	S\\--n 	S\\--	n
 	S\\--n 	S\\--n 	((n 	))n 	S\\__n 	S\\__n 	cll..n 	cll..n 	S\\--n 	S\\--n 	cll..n  	cll..!n 4 4 4t7G7G G$J[J[ []`]i]i ij & 6  v4+?+?$BRBR+RUYUfUf+f vnuv|n} v  CF  CN  CN  QZ  CZ v%$*A*A %QW %]a]q]qtx  uE  uE  ^E  HL  HY  HY  ^Y  \e  ^e %*d.E.E *WU[_ *adamamps  qE  qE  bE  HK  HU  HU  bU  Xa  ba *!8!8 TZZ)=S R!<!< RGFO RX[XcXcfoXo R0
u 
S 
Y4+B+B Y$2I2I QXY_Q` 8O8O ^a "d6M6M U\]cUd ilitit  xA  jA 28O8O W^_eWf <d.E.E WU[_ $;)@)@ ;PV ;z0(?(? 0wv 0d"D<S<S "[bci[j "Hd>U>U ]dek]l 8	$*A*A 	QW 		)@)@ 	PV 	"t/F/F "gV\o "H0G0G wW] 8$*A*A QW &4+B+B 'RX/ *$d.E.E $WU[_ $L    d113SUVWt}}(($--*;*;<>dfght}}(()+GKd??AeghidAACiklmt}}(($--*;*;<>Z\]^t}}(()+BAFt}}''(*@!Dd;;=gijkd==?kmnot}}(()+CQGt}}(()+BAFt}}))*,I1Mt}}))*,JANt}}(()+CQGt}}(()+DaH!)d$% r#   