Package ghidra.app.plugin.assembler.sleigh.sem

# Class AssemblyDefaultContext

java.lang.Object
ghidra.app.plugin.assembler.sleigh.sem.AssemblyDefaultContext

All Implemented Interfaces:
  `DisassemblerContext`, `ProcessorContext`, `ProcessorContextView`, `DefaultProgramContext`

public class AssemblyDefaultContext extends Object implements DisassemblerContext, DefaultProgramContext
A class that computes the default context for a language, and acts as a pseudo context

This class helps maintain context consistency when performing both assembly and disassembly.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected final Address`
  `at`
  `protected AssemblyPatternBlock`
  `curctx`
  `protected static final DbgTimer`
  `dbg`
  `protected AssemblyPatternBlock`
  `defctx`
  `protected final SleighLanguage`
  `lang`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  ``
  `AssemblyDefaultContext(SleighLanguage lang)`
  Compute the default context at most addresses for the given language
  `protected`
  `AssemblyDefaultContext(SleighLanguage lang, Address at)`
  Compute the default context at the given address for the given language

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `clearRegister(Register register)`
  Clears the register within this context.
  `Register`
  `getBaseContextRegister()`
  `AssemblyPatternBlock`
  `getDefault()`
  Get the default value of the context register
  `AssemblyPatternBlock`
  `getDefaultAt(Address addr)`
  Compute the default value of the context register at the given address
  `RegisterValue`
  `getDefaultValue(Register register, Address address)`
  Returns the default value of a register at a given address.
  `Register`
  `getRegister(String name)`
  Get a Register given the name of a register
  `List<Register>`
  `getRegisters()`
  Returns all the Registers for the processor as an unmodifiable list
  `RegisterValue`
  `getRegisterValue(Register register)`
  Get the RegisterValue for the given register.
  `BigInteger`
  `getValue(Register register, boolean signed)`
  Get the contents of a processor register as a BigInteger object
  `boolean`
  `hasValue(Register register)`
  Returns true if a value is defined for the given register.
  `void`
  `setContextRegister(byte[] val)`
  Set the value of the pseudo context register
  `void`
  `setContextRegister(AssemblyPatternBlock ctx)`
  `void`
  `setDefaultValue(RegisterValue registerValue, Address start, Address end)`
  Associates a default value with the given register over the given range.
  `void`
  `setFutureRegisterValue(Address fromAddr, Address toAddr, RegisterValue value)`
  Combines `value` with any previously saved future register value at `fromAddr/toAddr` or any value stored in the program if there is no previously saved future value.
  `void`
  `setFutureRegisterValue(Address address, RegisterValue value)`
  Combines `value` with any previously saved future register value at `address` or any value stored in the program if there is no previously saved future value.
  `void`
  `setRegisterValue(RegisterValue value)`
  Sets the specified register value within this context.
  `void`
  `setValue(Register register, BigInteger value)`
  Sets the value for a Register.

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### lang

    protected final SleighLanguage lang

  - ### at

    protected final Address at

  - ### curctx

    protected AssemblyPatternBlock curctx

  - ### defctx

    protected AssemblyPatternBlock defctx

  - ### dbg

    protected static final DbgTimer dbg

- ## Constructor Details

  - ### AssemblyDefaultContext

    public AssemblyDefaultContext(SleighLanguage lang)
    Compute the default context at most addresses for the given language
    Parameters:
      `lang` - the language

  - ### AssemblyDefaultContext

    protected AssemblyDefaultContext(SleighLanguage lang, Address at)
    Compute the default context at the given address for the given language
    Parameters:
      `lang` - the language
      `at` - the address

- ## Method Details

  - ### setContextRegister

    public void setContextRegister(byte[] val)
    Set the value of the pseudo context register

    If the provided value has length less than the register, it will be left aligned, and the remaining bytes will be set to unknown (masked out).

    Parameters:
      `val` - the value of the register

  - ### setContextRegister

    public void setContextRegister(AssemblyPatternBlock ctx)

  - ### getDefault

    public AssemblyPatternBlock getDefault()
    Get the default value of the context register
    Returns:
      the value as a pattern block for assembly

  - ### getDefaultAt

    public AssemblyPatternBlock getDefaultAt(Address addr)
    Compute the default value of the context register at the given address
    Parameters:
      `addr` - the addres
    Returns:
      the value as a pattern block for assembly

  - ### setValue

    public void setValue(Register register, BigInteger value) throws ContextChangeException
    Description copied from interface: `ProcessorContext`
    Sets the value for a Register.
    Specified by:
      `setValue` in interface `ProcessorContext`
    Parameters:
      `register` - the register to have its value set
      `value` - the value for the register (null is not permitted).
    Throws:
      `ContextChangeException` - an illegal attempt to change context was made

  - ### setRegisterValue

    public void setRegisterValue(RegisterValue value) throws ContextChangeException
    Description copied from interface: `ProcessorContext`
    Sets the specified register value within this context.
    Specified by:
      `setRegisterValue` in interface `ProcessorContext`
    Parameters:
      `value` - register value
    Throws:
      `ContextChangeException` - an illegal attempt to change context was made

  - ### clearRegister

    public void clearRegister(Register register) throws ContextChangeException
    Description copied from interface: `ProcessorContext`
    Clears the register within this context.
    Specified by:
      `clearRegister` in interface `ProcessorContext`
    Parameters:
      `register` - register to be cleared.
    Throws:
      `ContextChangeException` - an illegal attempt to change context was made

  - ### getBaseContextRegister

    public Register getBaseContextRegister()
    Specified by:
      `getBaseContextRegister` in interface `ProcessorContextView`
    Returns:
      the base processor context register or null if one has not been defined

  - ### getRegisters

    public List<Register> getRegisters()
    Description copied from interface: `ProcessorContextView`
    Returns all the Registers for the processor as an unmodifiable list
    Specified by:
      `getRegisters` in interface `ProcessorContextView`
    Returns:
      all the Registers for the processor

  - ### getRegister

    public Register getRegister(String name)
    Description copied from interface: `ProcessorContextView`
    Get a Register given the name of a register
    Specified by:
      `getRegister` in interface `ProcessorContextView`
    Parameters:
      `name` - the name of the register.
    Returns:
      The register with the given name.

  - ### getValue

    public BigInteger getValue(Register register, boolean signed)
    Description copied from interface: `ProcessorContextView`
    Get the contents of a processor register as a BigInteger object
    Specified by:
      `getValue` in interface `ProcessorContextView`
    Parameters:
      `register` - register to get the value for
    Returns:
      a BigInteger object containing the value of the register if a value exists, otherwise null.

  - ### getRegisterValue

    public RegisterValue getRegisterValue(Register register)
    Description copied from interface: `ProcessorContextView`
    Get the RegisterValue for the given register.
    Specified by:
      `getRegisterValue` in interface `ProcessorContextView`
    Parameters:
      `register` - register to get the value for
    Returns:
      RegisterValue object containing the value of the register if a value exists, otherwise null.

  - ### hasValue

    public boolean hasValue(Register register)
    Description copied from interface: `ProcessorContextView`
    Returns true if a value is defined for the given register.
    Specified by:
      `hasValue` in interface `ProcessorContextView`
    Parameters:
      `register` - the register to check for a value.
    Returns:
      true if the given register has a value.

  - ### setFutureRegisterValue

    public void setFutureRegisterValue(Address address, RegisterValue value)
    Description copied from interface: `DisassemblerContext`
    Combines `value` with any previously saved future register value at `address` or any value stored in the program if there is no previously saved future value. Use this method when multiple flows to the same address don't matter or the flowing from address is unknown.
    When `value` has conflicting bits with the previously saved value, `value` will take precedence.
    If the register value is the value for the processor context register and a previously saved value does not exist, the user saved values in the stored context of the program will be used as existing value.
    Specified by:
      `setFutureRegisterValue` in interface `DisassemblerContext`
    Parameters:
      `address` - the address to store the register value
      `value` - the register value to store at the address

  - ### setFutureRegisterValue

    public void setFutureRegisterValue(Address fromAddr, Address toAddr, RegisterValue value)
    Description copied from interface: `DisassemblerContext`
    Combines `value` with any previously saved future register value at `fromAddr/toAddr` or any value stored in the program if there is no previously saved future value.
    When `value` has conflicting bits with the previously saved value, `value` will take precedence.
    If the register value is the value for the processor context register and a previously saved value does not exist, the user saved values in the stored context of the program will be used as existing value.
    Specified by:
      `setFutureRegisterValue` in interface `DisassemblerContext`
    Parameters:
      `fromAddr` - the address this value if flowing from
      `toAddr` - the address to store the register value
      `value` - the register value to store at the address

  - ### setDefaultValue

    public void setDefaultValue(RegisterValue registerValue, Address start, Address end)
    Description copied from interface: `DefaultProgramContext`
    Associates a default value with the given register over the given range.
    Specified by:
      `setDefaultValue` in interface `DefaultProgramContext`
    Parameters:
      `registerValue` - the register for which to associate a default value.
      `start` - the start address.
      `end` - the end address (inclusive)

  - ### getDefaultValue

    public RegisterValue getDefaultValue(Register register, Address address)
    Description copied from interface: `DefaultProgramContext`
    Returns the default value of a register at a given address.
    Specified by:
      `getDefaultValue` in interface `DefaultProgramContext`
    Parameters:
      `register` - the register for which to get a default value.
      `address` - the address at which to get a default value.
    Returns:
      the default value of the register at the given address or null if no default value has been assigned.