Functions and defines to create and manipulate instruction operands. More...
Functions and defines to create and manipulate instruction operands.
| #define DR_REG_LAST_ENUM DR_REG_YMM15 |
Last value of register enums
| #define DR_REG_LAST_VALID_ENUM DR_REG_YMM15 |
Last valid register enum value. Note: DR_REG_INVALID is now smaller than this value.
| #define DR_REG_START_16 DR_REG_AX |
Start of 16-bit general register enum values
| #define DR_REG_START_32 DR_REG_EAX |
Start of 32-bit general register enum values
| #define DR_REG_START_64 DR_REG_RAX |
Start of 64-bit general register enum values
| #define DR_REG_START_8 DR_REG_AL |
Start of 8-bit general register enum values
| #define DR_REG_START_8HL DR_REG_AL |
Start of 8-bit high-low register enum values
| #define DR_REG_START_CR DR_REG_CR0 |
Start of control register enum values
| #define DR_REG_START_DR DR_REG_DR0 |
Start of debug register enum values
| #define DR_REG_START_FLOAT DR_REG_ST0 |
Start of floating-point-register enum values
| #define DR_REG_START_MMX DR_REG_MM0 |
Start of mmx register enum values
| #define DR_REG_START_SEGMENT DR_SEG_ES |
Start of segment register enum values
| #define DR_REG_START_x64_8 DR_REG_SPL |
Start of 8-bit x64-only register enum values
| #define DR_REG_START_x86_8 DR_REG_AH |
Start of 8-bit x86-only register enum values
| #define DR_REG_START_XMM DR_REG_XMM0 |
Start of xmm register enum values
| #define DR_REG_START_YMM DR_REG_YMM0 |
Start of ymm register enum values
| #define DR_REG_STOP_16 DR_REG_R15W |
End of 16-bit general register enum values
| #define DR_REG_STOP_32 DR_REG_R15D |
End of 32-bit general register enum values
| #define DR_REG_STOP_64 DR_REG_R15 |
End of 64-bit general register enum values
| #define DR_REG_STOP_8 DR_REG_DIL |
End of 8-bit general register enum values
| #define DR_REG_STOP_8HL DR_REG_BH |
End of 8-bit high-low register enum values
| #define DR_REG_STOP_CR DR_REG_CR15 |
End of control register enum values
| #define DR_REG_STOP_DR DR_REG_DR15 |
End of debug register enum values
| #define DR_REG_STOP_FLOAT DR_REG_ST7 |
End of floating-point-register enum values
| #define DR_REG_STOP_MMX DR_REG_MM7 |
End of mmx register enum values
| #define DR_REG_STOP_SEGMENT DR_SEG_GS |
End of segment register enum values
| #define DR_REG_STOP_x64_8 DR_REG_DIL |
Stop of 8-bit x64-only register enum values
| #define DR_REG_STOP_x86_8 DR_REG_BH |
Stop of 8-bit x86-only register enum values
| #define DR_REG_STOP_XMM DR_REG_XMM15 |
End of xmm register enum values
| #define DR_REG_STOP_YMM DR_REG_YMM15 |
End of ymm register enum values
| #define DR_REG_XAX DR_REG_RAX |
Platform-independent way to refer to rax/eax.
| #define DR_REG_XBP DR_REG_RBP |
Platform-independent way to refer to rbp/ebp.
| #define DR_REG_XBX DR_REG_RBX |
Platform-independent way to refer to rbx/ebx.
| #define DR_REG_XCX DR_REG_RCX |
Platform-independent way to refer to rcx/ecx.
| #define DR_REG_XDI DR_REG_RDI |
Platform-independent way to refer to rdi/edi.
| #define DR_REG_XDX DR_REG_RDX |
Platform-independent way to refer to rdx/edx.
| #define DR_REG_XSI DR_REG_RSI |
Platform-independent way to refer to rsi/esi.
| #define DR_REG_XSP DR_REG_RSP |
Platform-independent way to refer to rsp/esp.
| #define OPSZ_bound OPSZ_8_short4 |
Operand size for bound memory reference.
| #define OPSZ_call OPSZ_ret |
Operand size for push portion of call.
| #define OPSZ_clflush OPSZ_1 |
Operand size for clflush memory reference.
| #define OPSZ_fldenv OPSZ_28_short14 |
Operand size for fldenv memory reference.
| #define OPSZ_fnsave OPSZ_108_short94 |
Operand size for fnsave memory reference.
| #define OPSZ_fnstenv OPSZ_28_short14 |
Operand size for fnstenv memory reference.
| #define OPSZ_frstor OPSZ_108_short94 |
Operand size for frstor memory reference.
| #define OPSZ_fxrstor OPSZ_512 |
Operand size for fxrstor memory reference.
| #define OPSZ_fxsave OPSZ_512 |
Operand size for fxsave memory reference.
| #define OPSZ_invlpg OPSZ_0 |
Operand size for invlpg memory reference.
| #define OPSZ_lea OPSZ_0 |
Operand size for lea memory reference.
| #define OPSZ_lgdt OPSZ_6x10 |
Operand size for lgdt memory reference.
| #define OPSZ_lidt OPSZ_6x10 |
Operand size for lidt memory reference.
| #define OPSZ_maskmovdqu OPSZ_16 |
Operand size for maskmovdqu memory reference.
| #define OPSZ_maskmovq OPSZ_8 |
Operand size for maskmovq memory reference.
| #define OPSZ_prefetch OPSZ_1 |
Operand size for prefetch memory references.
| #define OPSZ_PTR OPSZ_8 |
Operand size for pointer values.
| #define OPSZ_ret OPSZ_4x8_short2xi8 |
Operand size for ret instruction.
| #define OPSZ_sgdt OPSZ_6x10 |
Operand size for sgdt memory reference.
| #define OPSZ_sidt OPSZ_6x10 |
Operand size for sidt memory reference.
| #define OPSZ_STACK OPSZ_8 |
Operand size for stack push/pop operand sizes.
| #define OPSZ_VARSTACK OPSZ_4x8_short2 |
Operand size for prefix-varying stack push/pop operand sizes.
| #define OPSZ_xlat OPSZ_1 |
Operand size for xlat memory reference.
| anonymous enum |
| anonymous enum |
| const char* get_register_name | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 32-bit register constant. Returns the string name for reg.
| app_pc opnd_compute_address | ( | opnd_t | opnd, | |
| dr_mcontext_t * | mc | |||
| ) |
Returns the effective address of opnd, computed using the passed-in register values. If opnd is a far address, ignores that aspect except for TLS references on Windows (fs: for 32-bit, gs: for 64-bit) or typical fs: or gs: references on Linux. For far addresses the calling thread's segment selector is used. mc->flags must include DR_MC_CONTROL and DR_MC_INTEGER.
| opnd_t opnd_create_abs_addr | ( | void * | addr, | |
| opnd_size_t | data_size | |||
| ) |
Returns a memory reference operand that refers to the address addr. The operand has data size data_size (must be a OPSZ_ constant).
If addr <= 2^32 (which is always true in 32-bit mode), this routine is equivalent to opnd_create_base_disp(DR_REG_NULL, DR_REG_NULL, 0, (int)addr, data_size).
Otherwise, this routine creates a separate operand type with an absolute 64-bit memory address. Note that such an operand can only be used as a load or store from or to the rax register.
| opnd_t opnd_create_base_disp | ( | reg_id_t | base_reg, | |
| reg_id_t | index_reg, | |||
| int | scale, | |||
| int | disp, | |||
| opnd_size_t | data_size | |||
| ) |
Returns a memory reference operand that refers to the address:
or, in other words,
The operand has data size data_size (must be a OPSZ_ constant). Both base_reg and index_reg must be DR_REG_ constants. scale must be either 1, 2, 4, or 8.
| opnd_t opnd_create_base_disp_ex | ( | reg_id_t | base_reg, | |
| reg_id_t | index_reg, | |||
| int | scale, | |||
| int | disp, | |||
| opnd_size_t | size, | |||
| bool | encode_zero_disp, | |||
| bool | force_full_disp, | |||
| bool | disp_short_addr | |||
| ) |
Returns a memory reference operand that refers to the address:
or, in other words,
The operand has data size data_size (must be a OPSZ_ constant). Both base_reg and index_reg must be DR_REG_ constants. scale must be either 1, 2, 4, or 8. Gives control over encoding optimizations:
encode_zero_disp, a zero value for disp will not be omitted;force_full_disp, a small value for disp will not occupy only one byte.disp_short_addr, short (16-bit for 32-bit mode, 32-bit for 64-bit mode) addressing will be used (note that this normally only needs to be specified for an absolute address; otherwise, simply use the desired short registers for base and/or index).(Both of those are false when using opnd_create_base_disp()).
| opnd_t opnd_create_far_abs_addr | ( | reg_id_t | seg, | |
| void * | addr, | |||
| opnd_size_t | data_size | |||
| ) |
Returns a memory reference operand that refers to the address seg: addr. The operand has data size data_size (must be a OPSZ_ constant).
If addr <= 2^32 (which is always true in 32-bit mode), this routine is equivalent to opnd_create_far_base_disp(seg, DR_REG_NULL, DR_REG_NULL, 0, (int)addr, data_size).
Otherwise, this routine creates a separate operand type with an absolute 64-bit memory address. Note that such an operand can only be used as a load or store from or to the rax register.
| opnd_t opnd_create_far_base_disp | ( | reg_id_t | seg, | |
| reg_id_t | base_reg, | |||
| reg_id_t | index_reg, | |||
| int | scale, | |||
| int | disp, | |||
| opnd_size_t | data_size | |||
| ) |
Returns a far memory reference operand that refers to the address:
or, in other words,
The operand has data size data_size (must be a OPSZ_ constant). seg must be a DR_SEG_ constant. Both base_reg and index_reg must be DR_REG_ constants. scale must be either 1, 2, 4, or 8.
| opnd_t opnd_create_far_base_disp_ex | ( | reg_id_t | seg, | |
| reg_id_t | base_reg, | |||
| reg_id_t | index_reg, | |||
| int | scale, | |||
| int | disp, | |||
| opnd_size_t | size, | |||
| bool | encode_zero_disp, | |||
| bool | force_full_disp, | |||
| bool | disp_short_addr | |||
| ) |
Returns a far memory reference operand that refers to the address:
or, in other words,
The operand has data size data_size (must be a OPSZ_ constant). seg must be a DR_SEG_ constant. Both base_reg and index_reg must be DR_REG_ constants. scale must be either 1, 2, 4, or 8. Gives control over encoding optimizations:
encode_zero_disp, a zero value for disp will not be omitted;force_full_disp, a small value for disp will not occupy only one byte.disp_short_addr, short (16-bit for 32-bit mode, 32-bit for 64-bit mode) addressing will be used (note that this normally only needs to be specified for an absolute address; otherwise, simply use the desired short registers for base and/or index).(Both of those are false when using opnd_create_far_base_disp()).
Returns a far instr_t pointer address with value seg_selector:instr. seg_selector is a segment selector, not a DR_SEG_ constant.
| opnd_t opnd_create_far_pc | ( | ushort | seg_selector, | |
| app_pc | pc | |||
| ) |
Returns a far program address operand with value seg_selector:pc. seg_selector is a segment selector, not a DR_SEG_ constant.
| opnd_t opnd_create_far_rel_addr | ( | reg_id_t | seg, | |
| void * | addr, | |||
| opnd_size_t | data_size | |||
| ) |
Returns a memory reference operand that refers to the address seg : addr, but will be encoded as a pc-relative address. It is up to the caller to ensure that the resulting address is reachable via a 32-bit signed displacement from the next instruction at emit time.
DR guarantees that all of its code caches and heap are within the same 2GB memory region. DR also loads client libraries within 32-bit reachability of its code caches and heap. This means that any static data or code in a client library, or any data allocated using DR's API, is guaranteed to be reachable from code cache code.
The operand has data size data_size (must be a OPSZ_ constant).
To represent a 32-bit address (i.e., what an address size prefix indicates), simply zero out the top 32 bits of the address before passing it to this routine.
| opnd_t opnd_create_immed_float | ( | float | f | ) |
Returns an immediate float operand with value f. The caller's code should use proc_save_fpstate() or be inside a clean call that has requested to preserve the floating-point state.
| opnd_t opnd_create_immed_int | ( | ptr_int_t | i, | |
| opnd_size_t | data_size | |||
| ) |
Returns an immediate integer operand with value i and size data_size; data_size must be a OPSZ_ constant.
| opnd_t opnd_create_null | ( | void | ) |
Returns an empty operand.
| opnd_t opnd_create_pc | ( | app_pc | pc | ) |
Returns a program address operand with value pc.
| opnd_t opnd_create_reg | ( | reg_id_t | r | ) |
Returns a register operand (r must be a DR_REG_ constant).
| opnd_t opnd_create_rel_addr | ( | void * | addr, | |
| opnd_size_t | data_size | |||
| ) |
Returns a memory reference operand that refers to the address addr, but will be encoded as a pc-relative address. At emit time, if addr is out of reach of a 32-bit signed displacement from the next instruction, encoding will fail.
DR guarantees that all of its code caches and heap are within the same 2GB memory region. DR also loads client libraries within 32-bit reachability of its code caches and heap. This means that any static data or code in a client library, or any data allocated using DR's API, is guaranteed to be reachable from code cache code.
The operand has data size data_size (must be a OPSZ_ constant).
To represent a 32-bit address (i.e., what an address size prefix indicates), simply zero out the top 32 bits of the address before passing it to this routine.
Returns true iff def, considered as a write, affects use. Is conservative, so if both def and use are memory references, will return true unless it can disambiguate them based on their registers and displacement.
| void opnd_disassemble | ( | void * | drcontext, | |
| opnd_t | opnd, | |||
| file_t | outfile | |||
| ) |
Prints the operand opnd to file outfile. The default is to use AT&T-style syntax, unless the -syntax_intel runtime option is specified.
| size_t opnd_disassemble_to_buffer | ( | void * | drcontext, | |
| opnd_t | opnd, | |||
| char * | buf, | |||
| size_t | bufsz | |||
| ) |
Prints the operand opnd to the buffer buf. Always null-terminates, and will not print more than bufsz characters, which includes the final null character. Returns the number of characters printed, not including the final null. The default is to use AT&T-style syntax, unless the -syntax_intel runtime option is specified.
| void* opnd_get_addr | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) absolute or pc-relative memory reference, or a base+disp memory reference with no base or index register. Returns opnd's absolute address (which will be pc-relativized on encoding for pc-relative memory references).
| reg_id_t opnd_get_base | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference. Returns the base register (a DR_REG_ constant).
| int opnd_get_disp | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference. Returns the displacement.
| float opnd_get_immed_float | ( | opnd_t | opnd | ) |
Assumes opnd is an immediate float and returns its value. The caller's code should use proc_save_fpstate() or be inside a clean call that has requested to preserve the floating-point state.
| reg_id_t opnd_get_index | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference. Returns the index register (a DR_REG_ constant).
| app_pc opnd_get_pc | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) program address, returns its value.
| reg_id_t opnd_get_reg | ( | opnd_t | opnd | ) |
Assumes opnd is a register operand. Returns the register it refers to (a DR_REG_ constant).
| reg_id_t opnd_get_reg_used | ( | opnd_t | opnd, | |
| int | index | |||
| ) |
Used in conjunction with opnd_num_regs_used(), this routine can be used to iterate through all registers used by opnd. The index values begin with 0 and proceed through opnd_num_regs_used(opnd)-1.
| int opnd_get_scale | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference. Returns the scale.
| reg_id_t opnd_get_segment | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) memory reference of any type. Returns opnd's segment (a DR_SEG_ constant), or DR_REG_NULL if it is a near memory reference.
| ushort opnd_get_segment_selector | ( | opnd_t | opnd | ) |
Assumes opnd is a far program address. Returns opnd's segment, a segment selector (not a DR_SEG_ constant).
| opnd_size_t opnd_get_size | ( | opnd_t | opnd | ) |
Return the data size of opnd as a OPSZ_ constant. Assumes opnd is a register, immediate integer, or memory reference. If opnd is a register returns the result of opnd_reg_get_size() called on the DR_REG_ constant. Returns OPSZ_NA if opnd does not have a valid size.
| bool opnd_is_abs_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) absolute address operand. Returns true for both base-disp operands with no base or index and 64-bit non-base-disp absolute address operands.
| bool opnd_is_base_disp | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) base+disp memory reference operand.
| bool opnd_is_disp_encode_zero | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference; returns whether encode_zero_disp has been specified for opnd.
| bool opnd_is_disp_force_full | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference; returns whether force_full_disp has been specified for opnd.
| bool opnd_is_disp_short_addr | ( | opnd_t | opnd | ) |
Assumes opnd is a (near or far) base+disp memory reference; returns whether disp_short_addr has been specified for opnd.
| bool opnd_is_far_abs_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far absolute address operand. Returns true for both base-disp operands with no base or index and 64-bit non-base-disp absolute address operands.
| bool opnd_is_far_base_disp | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far base+disp memory reference operand.
| bool opnd_is_far_instr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far instr_t pointer address operand.
| bool opnd_is_far_memory_reference | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far memory reference operand of any type: base-disp, absolute address, or pc-relative address.
| bool opnd_is_far_pc | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far program address operand.
| bool opnd_is_far_rel_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a far pc-relative memory reference operand.
| bool opnd_is_immed | ( | opnd_t | opnd | ) |
Returns true iff opnd is an immediate (integer or float) operand.
| bool opnd_is_immed_float | ( | opnd_t | opnd | ) |
Returns true iff opnd is an immediate float operand.
| bool opnd_is_immed_int | ( | opnd_t | opnd | ) |
Returns true iff opnd is an immediate integer operand.
| bool opnd_is_instr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) instr_t pointer address operand.
| bool opnd_is_memory_reference | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) memory reference operand of any type: base-disp, absolute address, or pc-relative address.
| bool opnd_is_near_abs_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near (i.e., default segment) absolute address operand. Returns true for both base-disp operands with no base or index and 64-bit non-base-disp absolute address operands.
| bool opnd_is_near_base_disp | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near (i.e., default segment) base+disp memory reference operand.
| bool opnd_is_near_instr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near instr_t pointer address operand.
| bool opnd_is_near_memory_reference | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near memory reference operand of any type: base-disp, absolute address, or pc-relative address.
| bool opnd_is_near_pc | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near (i.e., default segment) program address operand.
| bool opnd_is_near_rel_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a near (i.e., default segment) pc-relative memory reference operand.
| bool opnd_is_null | ( | opnd_t | opnd | ) |
Returns true iff opnd is an empty operand.
| bool opnd_is_pc | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) program address operand.
| bool opnd_is_reg | ( | opnd_t | opnd | ) |
Returns true iff opnd is a register operand.
| bool opnd_is_reg_32bit | ( | opnd_t | opnd | ) |
Returns true iff opnd is a register operand that refers to a 32-bit general-purpose register.
| bool opnd_is_reg_64bit | ( | opnd_t | opnd | ) |
Returns true iff opnd is a register operand that refers to a 64-bit general-purpose register.
| bool opnd_is_reg_pointer_sized | ( | opnd_t | opnd | ) |
Returns true iff opnd is a register operand that refers to a pointer-sized general-purpose register.
| bool opnd_is_rel_addr | ( | opnd_t | opnd | ) |
Returns true iff opnd is a (near or far) pc-relative memory reference operand.
| int opnd_num_regs_used | ( | opnd_t | opnd | ) |
Returns the number of registers referred to by opnd. This will only be non-zero for register operands and memory references.
| bool opnd_replace_reg | ( | opnd_t * | opnd, | |
| reg_id_t | old_reg, | |||
| reg_id_t | new_reg | |||
| ) |
Assumes that both old_reg and new_reg are DR_REG_ constants. Replaces all occurrences of old_reg in *opnd with new_reg.
Returns true iff op1 and op2 are indistinguishable. If either uses variable operand sizes, the default size is assumed.
Returns true iff op1 and op2 are both memory references and they are indistinguishable, ignoring data size.
| void opnd_set_disp | ( | opnd_t * | opnd, | |
| int | disp | |||
| ) |
Set the displacement of a memory reference operand opnd to disp.
| void opnd_set_disp_ex | ( | opnd_t * | opnd, | |
| int | disp, | |||
| bool | encode_zero_disp, | |||
| bool | force_full_disp, | |||
| bool | disp_short_addr | |||
| ) |
Set the displacement and encoding controls of a memory reference operand:
encode_zero_disp, a zero value for disp will not be omitted;force_full_disp, a small value for disp will not occupy only one byte.disp_short_addr, short (16-bit for 32-bit mode, 32-bit for 64-bit mode) addressing will be used (note that this normally only needs to be specified for an absolute address; otherwise, simply use the desired short registers for base and/or index). | void opnd_set_size | ( | opnd_t * | opnd, | |
| opnd_size_t | newsize | |||
| ) |
Sets the data size of opnd. Assumes opnd is an immediate integer or a memory reference.
Returns true iff there exists some register that is referred to (directly or overlapping) by both op1 and op2.
Shrinks all 32-bit registers in opnd to their 16-bit versions. Also shrinks the size of immediate integers and memory references from OPSZ_4 to OPSZ_2.
Shrinks all 64-bit registers in opnd to their 32-bit versions. Also shrinks the size of immediate integers and memory references from OPSZ_8 to OPSZ_4.
| uint opnd_size_in_bytes | ( | opnd_size_t | size | ) |
Assumes size is a OPSZ_ or a DR_REG_ constant. If size is a DR_REG_ constant, first calls reg_get_size(size) to get a OPSZ_ constant. Returns the number of bytes the OPSZ_ constant represents. If OPSZ_ is a variable-sized size, returns the default size, which may or may not match the actual size decided up on at encoding time (that final size depends on other operands).
| bool opnd_uses_reg | ( | opnd_t | opnd, | |
| reg_id_t | reg | |||
| ) |
Assumes that reg is a DR_REG_ constant. Returns true iff opnd refers to reg directly or refers to a register that overlaps reg (e.g., DR_REG_AX overlaps DR_REG_EAX).
| reg_id_t reg_32_to_16 | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 32-bit register constant. Returns the 16-bit version of reg.
| reg_id_t reg_32_to_64 | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 32-bit register constant. Returns the 64-bit version of reg.
| reg_id_t reg_32_to_8 | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 32-bit register constant. Returns the 8-bit version of reg (the least significant byte: DR_REG_AL instead of DR_REG_AH if passed DR_REG_EAX, e.g.). For 32-bit DR builds, returns DR_REG_NULL if passed DR_REG_ESP, DR_REG_EBP, DR_REG_ESI, or DR_REG_EDI.
| reg_id_t reg_32_to_opsz | ( | reg_id_t | reg, | |
| opnd_size_t | sz | |||
| ) |
Assumes that reg is a DR_REG_ 32-bit register constant. If sz == OPSZ_2, returns the 16-bit version of reg. For 64-bit versions of this library, if sz == OPSZ_8, returns the 64-bit version of reg.
| reg_id_t reg_64_to_32 | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 64-bit register constant. Returns the 32-bit version of reg.
| byte reg_get_bits | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns reg's representation as 3 bits in a modrm byte (the 3 bits are the lower-order bits in the return value).
| opnd_size_t reg_get_size | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns the OPSZ_ constant corresponding to the register size. Returns OPSZ_NA if reg is not a DR_REG_ constant.
| reg_t reg_get_value | ( | reg_id_t | reg, | |
| dr_mcontext_t * | mc | |||
| ) |
Returns the value of the register reg, selected from the passed-in register values. Supports only general-purpose registers. mc->flags must include DR_MC_CONTROL and DR_MC_INTEGER.
| bool reg_is_32bit | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a 32-bit general-purpose register.
| bool reg_is_64bit | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a 64-bit general-purpose register.
| bool reg_is_extended | ( | reg_id_t | reg | ) |
Returns true iff reg refers to an extended register only available in 64-bit mode and not in 32-bit mode (e.g., R8-R15, XMM8-XMM15, etc.)
| bool reg_is_fp | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a floating-point register.
| bool reg_is_gpr | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a General Purpose Register, i.e., rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi, or a subset.
| bool reg_is_mmx | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to an mmx (64-bit) register.
| bool reg_is_pointer_sized | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a pointer-sized general-purpose register.
| bool reg_is_segment | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a segment (i.e., it's really a DR_SEG_ constant).
| bool reg_is_xmm | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to an xmm (128-bit SSE/SSE2) register or a ymm (256-bit multimedia) register.
| bool reg_is_ymm | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ constant. Returns true iff it refers to a ymm (256-bit multimedia) register.
| bool reg_overlap | ( | reg_id_t | r1, | |
| reg_id_t | r2 | |||
| ) |
Assumes that r1 and r2 are both DR_REG_ constants. Returns true iff r1's register overlaps r2's register (e.g., if r1 == DR_REG_AX and r2 == DR_REG_EAX).
| int reg_parameter_num | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ register constant. If reg is used as part of the calling convention, returns which parameter ordinal it matches (0-based); otherwise, returns -1.
| void reg_set_value | ( | reg_id_t | reg, | |
| dr_mcontext_t * | mc, | |||
| reg_t | value | |||
| ) |
Sets the register reg in the passed in mcontext mc to value. mc->flags must include DR_MC_CONTROL and DR_MC_INTEGER.
| reg_id_t reg_to_pointer_sized | ( | reg_id_t | reg | ) |
Assumes that reg is a DR_REG_ 32-bit register constant. Returns the pointer-sized version of reg.