
    gQ              	           S SK JrJrJrJr  S SKJr  S SKJrJ	r	J
r
  S SKJr  S\\-  S\\-  4S jrS\\-  S	-  S
\S	-  S\\-  4S jrS\4S jrS\\-  S	-  S\\-  4S jrS\S	-  S\\-  S	-  S
\S	-  S\\-  4S jrg	)    )ModRegRMAddressingMode	ThreeBitsget_register_code)Register)EffectiveAddressPointerSizeLabel)	Traceback
rm_operandreturnc                 r   [        U [        5      (       a  [        R                  $ [        U R                  [
        5      (       a  [        R                  $ [        U R                  [        5      (       dF  [        [        R                  U R                  U R                  U R                  U R                  S5      n [        U R                  [        5      (       d   eU R                  S:X  d:  U R                  c=  U R                  c0  U R                  S:  a   U R                  S:  a  [        R                  $ U R                  S:  a   U R                  S:  a  [        R                   $ U R                  S:  a   U R                  S:  a  [        R                  $ ["        R$                  " SU R                   S35      $ )Nr   i   l        i   zDisplacement value of z& is too large to be encoded in 32 bits)
isinstancer   r   DIRECTdisplacementr
   #INDIRECT_WITH_FOUR_BYTE_DISPACEMENTintr   r	   DWORDsegmentbaseindexscaleINDIRECTINDIRECT_WITH_BYTE_DISPLACEMENTr   new)r   s    4/mnt/public/Repos/urclelf/./x86/encoding/modregrm.pycalculate_mod_fieldr      s   *h''$$$*))511AAAj--s33%k&7&79K9KZ__^h^n^npz  qA  qA  CD  E
j--s3333!#
(?JDTDTD\akaxax  }H  bH  MW  Md  Md  gq  Mq&&&		 	 E	)j.E.E.L===		 	 K	/J4K4Kj4XAAA}}5j6M6M5NNtuvv    operandNopcode_extentionc                 H   Ub  U$ [        U [        5      (       a?  [        U 5      nUS:X  d,  US:X  d&  US:X  d   US:X  d  US:X  d  US:X  d  US:X  d  US:X  d   eU$ [        U [        5      (       a  [        R
                  " S	U  S
35      $ U c  [        R
                  " S5      $ U $ )Nr                        zBRegister field of the modregrm byte cannot hold a memory address (z
 supplied)z3Register field of the modregrm byte cannot be empty)r   r   r   r   r   r   )r    r!   results      r   calculate_reg_fieldr+      s    #	GX	&	&"7+{fkVq[FaK6UV;Z`deZeiostitx~  CD  yD  	D  D	G-	.	.}}abiajjtuvv	}}RSSr   effective_addressc                     U R                   b  gU R                  (       a  U R                  c  gU R                  (       a  [        U R                  5      $ [        R
                  " SU  S35      $ )Nr&   r'   zSupplied address of z# cannot be encoded in the r/m field)r   r   r   r   r   r   )r,   s    r   #get_rm_field_from_effective_addressr.   *   s`    *		'	'->-C-C-K			 !2!7!788}}34E3FFijkkr   c                 P   [        U [        5      (       a  [        U 5      nO=[        U [        5      (       a  [	        U 5      nOU c  [
        R                  " S5      nOU $ [        U[
        5      (       d2  US:X  d,  US:X  d&  US:X  d   US:X  d  US:X  d  US:X  d  US:X  d  US	:X  d   eU$ )
Nzr/m field cannot be emptyr   r#   r$   r%   r&   r'   r(   r)   )r   r   r.   r   r   r   r   )r    r*   s     r   calculate_rm_fieldr0   6   s    '+,,4W=	GX	&	&"7+	:; fi((FaK6Q;&TU+Y_cdYdhnrshsw}  BC  xC  GM  QR  GR  V\  `a  Va  a  aMr   registerregister_or_memoryc                    Uc  [         R                  " S5      $ [        U5      n[        X5      n[	        U5      n[        U[         5      (       a  UnUR                  S5        U$ [        U[         5      (       a  UnUR                  S5        U$ [        U[         5      (       a  UnUR                  S5        U$ [        X4U5      $ )Nz;At least one operand is reqired to generate a modregrm bytezBad mod fieldzBad reg fieldzBad r/m field)r   r   r   r+   r0   r   	elaborater   )r1   r2   r!   modregrmerrors          r   calculate_modregrmr9   E   s    !}}Z[[
0
1C
h
9C	.	/B#y!!(#y!!("i  (Cb!!r   )x86.encoding.machiner   r   r   r   x86.registerr   x86.asmr   r	   r
   r8   r   r   r+   r.   r0   r9    r   r   <module>r>      s    W W ! 8 8 wH/?$? wNU^D^ w&,<!<t!C W`cgWg lu  yB  mB "	l;K 	l+; ;d B yS\G\ "D "hQaFadhFh "  }F  IM  }M "  RZ  ]f  Rf "r   