
    gQ              	           d dl mZmZmZmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ deez  deez  fdZdeez  d	z  d
ed	z  deez  fdZdefdZdeez  d	z  deez  fdZded	z  deez  d	z  d
ed	z  deez  fdZd	S )    )ModRegRMAddressingMode	ThreeBitsget_register_code)Register)EffectiveAddressPointerSizeLabel)	Traceback
rm_operandreturnc                    t          | t                    rt          j        S t          | j        t
                    rt          j        S t          | j        t                    s2t          t          j
        | j        | j        | j        | j        d          } t          | j        t                    sJ | j        dk    s$| j        )| j        "| j        dk    r| j        dk     rt          j        S | j        dk    r| j        dk     rt          j        S | j        dk    r| j        dk     rt          j        S t#          j        d| j         d          S )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    R/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/encoding/modregrm.pycalculate_mod_fieldr      sl   *h'' %$$*)511 BAAj-s33 E%k&79KZ_^h^npz  qA  CD  E  E
j-s33333!##
(?JDTD\akax  }H  bH  bH  MW  Md  gq  Mq  Mq&&		 E	)	)j.E.L.L==		 K	/	/J4Kj4X4XAA}uj6Muuuvvv    operandNopcode_extentionc                 D   ||S t          | t                    rCt          |           }|dk    s,|dk    s&|dk    s |dk    s|dk    s|dk    s|dk    s|dk    sJ |S t          | t                    rt	          j        d	|  d
          S | t	          j        d          S | S )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kkVq[[FaKK6UV;;Z`deZeZeiostititx~  CD  yD  yD  yD  D	G-	.	. }ubiuuuvvv	}RSSSr   effective_addressc                     | j         dS | j        r	| j        dS | j        rt          | j                  S t	          j        d|  d          S )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.   *   se    *q		' l->-C-Kq		 l !2!7888}j4Ejjjkkkr   c                 Z   t          | t                    rt          |           }n>t          | t                    rt	          |           }n| t          j        d          }n| S t          |t
                    s2|dk    s,|dk    s&|dk    s |dk    s|dk    s|dk    s|dk    s|d	k    sJ |S )
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((  aFaKK6Q;;&TU++Y_cdYdYdhnrshshsw}  BC  xC  xC  GM  QR  GR  GR  V\  `a  Va  Va  Va  aMr   registerregister_or_memoryc                    |t          j        d          S t          |          }t          | |          }t	          |          }t          |t                     r|}|                    d           |S t          |t                     r|}|                    d           |S t          |t                     r|}|                    d           |S t          |||          S )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
1
1C
h(8
9
9C	.	/	/B#y!! (((#y!! ((("i   (((Cb!!!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 W W W W W W W W W W ! ! ! ! ! ! 8 8 8 8 8 8 8 8 8 8      wH/?$? wNU^D^ w w w w&,<!<t!C W`cgWg lu  yB  mB    "	l;K 	l 	l 	l 	l+; ;d B yS\G\    "D "hQaFadhFh "  }F  IM  }M "  RZ  ]f  Rf " " " " " "r   