<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.cheatengine.org/index.php?action=history&amp;feed=atom&amp;title=Lua%3AClass%3ADisassembler</id>
	<title>Lua:Class:Disassembler - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.cheatengine.org/index.php?action=history&amp;feed=atom&amp;title=Lua%3AClass%3ADisassembler"/>
	<link rel="alternate" type="text/html" href="https://wiki.cheatengine.org/index.php?title=Lua:Class:Disassembler&amp;action=history"/>
	<updated>2026-06-26T11:36:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.cheatengine.org/index.php?title=Lua:Class:Disassembler&amp;diff=8056&amp;oldid=prev</id>
		<title>Leunsel: Initial page creation.</title>
		<link rel="alternate" type="text/html" href="https://wiki.cheatengine.org/index.php?title=Lua:Class:Disassembler&amp;diff=8056&amp;oldid=prev"/>
		<updated>2026-06-23T19:41:41Z</updated>

		<summary type="html">&lt;p&gt;Initial page creation.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Lua]]&lt;br /&gt;
{{Class|'''class''' Disassembler ''':''' Object}}&lt;br /&gt;
&lt;br /&gt;
The Disassembler class represents a disassembler object.&lt;br /&gt;
&lt;br /&gt;
A Disassembler inherits from Object. It can disassemble instructions and expose additional information about the last disassembled instruction through the LastDisassembleData table.&lt;br /&gt;
&lt;br /&gt;
===Inheritance===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Class&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Inherits From&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|Disassembler&lt;br /&gt;
|Object&lt;br /&gt;
|Disassembles instructions and exposes additional information about the decoded instruction.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Creation===&lt;br /&gt;
{{CodeBox|'''function''' createDisassembler() ''':''' Disassembler}}&lt;br /&gt;
{{CodeBox|'''function''' getDefaultDisassembler() ''':''' Disassembler}}&lt;br /&gt;
{{CodeBox|'''function''' getVisibleDisassembler() ''':''' Disassembler}}&lt;br /&gt;
&lt;br /&gt;
Creates or returns a Disassembler object.&lt;br /&gt;
&lt;br /&gt;
getDefaultDisassembler returns the default disassembler object used by many of Cheat Engine's disassembler routines. Only use this from the main thread.&lt;br /&gt;
&lt;br /&gt;
getVisibleDisassembler is deprecated and only exists for backward compatibility. It returns a stub disassembler. If function overrides are set on it, other visible disassemblers can use those overrides when they do not have their own override.&lt;br /&gt;
&lt;br /&gt;
===Function Parameters===&lt;br /&gt;
These functions have no parameters.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Disassembler — A Disassembler object.&lt;br /&gt;
&lt;br /&gt;
===Global Disassemble Overrides===&lt;br /&gt;
{{CodeBox|'''function''' registerGlobalDisassembleOverride(''function'') ''':''' userdata}}&lt;br /&gt;
{{CodeBox|'''function''' unregisterGlobalDisassembleOverride(''id'') ''':''' void}}&lt;br /&gt;
&lt;br /&gt;
registerGlobalDisassembleOverride registers a disassemble override for all disassemblers, including newly created ones.&lt;br /&gt;
&lt;br /&gt;
The registered function behaves like Disassembler.OnDisassembleOverride. Check the sender parameter to determine whether syntax highlighting codes should be used.&lt;br /&gt;
&lt;br /&gt;
===Global Override Parameters===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Function&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Parameter&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|registerGlobalDisassembleOverride(function)&lt;br /&gt;
|function&lt;br /&gt;
|The override function to register. It receives sender, address, and LastDisassembleData, and can return opcode and description.&lt;br /&gt;
|-&lt;br /&gt;
|unregisterGlobalDisassembleOverride(id)&lt;br /&gt;
|id&lt;br /&gt;
|The id returned by registerGlobalDisassembleOverride.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Global Override Callback===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Parameter&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|sender&lt;br /&gt;
|Disassembler&lt;br /&gt;
|The Disassembler object that is currently disassembling.&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|Integer&lt;br /&gt;
|The address being disassembled.&lt;br /&gt;
|-&lt;br /&gt;
|LastDisassembleData&lt;br /&gt;
|Table&lt;br /&gt;
|The last disassemble data table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Global Override Returns===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Return Value&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|opcode&lt;br /&gt;
|String&lt;br /&gt;
|The opcode text to use.&lt;br /&gt;
|-&lt;br /&gt;
|description&lt;br /&gt;
|String&lt;br /&gt;
|The description text to use.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Syntax Highlighting Codes===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Code&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|{H}&lt;br /&gt;
|Marks the following text as a hex value.&lt;br /&gt;
|-&lt;br /&gt;
|{R}&lt;br /&gt;
|Marks the following text as a register.&lt;br /&gt;
|-&lt;br /&gt;
|{S}&lt;br /&gt;
|Marks the following text as a symbol.&lt;br /&gt;
|-&lt;br /&gt;
|{N}&lt;br /&gt;
|Marks the following text as nothing special.&lt;br /&gt;
|-&lt;br /&gt;
|{C######}&lt;br /&gt;
|Sets the foreground RGB color. The color format is 0xBBGGRR.&lt;br /&gt;
|-&lt;br /&gt;
|{B######}&lt;br /&gt;
|Sets the background RGB color. The color format is 0xBBGGRR.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Properties===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Property&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|LastDisassembleData&lt;br /&gt;
|Table&lt;br /&gt;
|Information about the last disassembled instruction.&lt;br /&gt;
|-&lt;br /&gt;
|OnDisassembleOverride&lt;br /&gt;
|Function&lt;br /&gt;
|Function called to override disassembly output. It can return a replacement opcode and description.&lt;br /&gt;
|-&lt;br /&gt;
|OnPostDisassemble&lt;br /&gt;
|Function&lt;br /&gt;
|Function called after disassembly. It can return a modified result and description.&lt;br /&gt;
|-&lt;br /&gt;
|syntaxhighlighting&lt;br /&gt;
|Boolean&lt;br /&gt;
|Set to true if syntax highlighting codes are accepted.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OnDisassembleOverride Callback===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Signature&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|function(sender, address, LastDisassembleData)&lt;br /&gt;
|Called during disassembly. Can return opcode and description.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===OnPostDisassemble Callback===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Signature&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|function(sender, address, LastDisassembleData, result, description)&lt;br /&gt;
|Called after disassembly. Can return result and description.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Methods===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Method&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Return Type&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|disassemble(address)&lt;br /&gt;
|String&lt;br /&gt;
|Disassembles the instruction at the given address and returns the opcode text. It also fills LastDisassembleData.&lt;br /&gt;
|-&lt;br /&gt;
|decodeLastParametersToString()&lt;br /&gt;
|String&lt;br /&gt;
|Returns the unedited comments information for the last disassembled instruction. This does not include user-defined comments.&lt;br /&gt;
|-&lt;br /&gt;
|getLastDisassembleData()&lt;br /&gt;
|Table&lt;br /&gt;
|Returns the LastDisassembleData table.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===LastDisassembleData Fields===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Field&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Type&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|address&lt;br /&gt;
|Integer&lt;br /&gt;
|The address that was disassembled.&lt;br /&gt;
|-&lt;br /&gt;
|opcode&lt;br /&gt;
|String&lt;br /&gt;
|The opcode without parameters.&lt;br /&gt;
|-&lt;br /&gt;
|parameters&lt;br /&gt;
|String&lt;br /&gt;
|The instruction parameters.&lt;br /&gt;
|-&lt;br /&gt;
|description&lt;br /&gt;
|String&lt;br /&gt;
|The description of the opcode.&lt;br /&gt;
|-&lt;br /&gt;
|commentsoverride&lt;br /&gt;
|String&lt;br /&gt;
|If set, this will be used as the comments or decodeLastParametersToString result.&lt;br /&gt;
|-&lt;br /&gt;
|bytes&lt;br /&gt;
|Table&lt;br /&gt;
|A table containing the bytes of the instruction. The table starts at index 1.&lt;br /&gt;
|-&lt;br /&gt;
|modrmValueType&lt;br /&gt;
|DisAssemblerValueType&lt;br /&gt;
|Defines the type of the modrmValue field.&lt;br /&gt;
|-&lt;br /&gt;
|modrmValue&lt;br /&gt;
|Integer&lt;br /&gt;
|The value specified by the ModR/M byte. modrmValueType defines what kind of value it is.&lt;br /&gt;
|-&lt;br /&gt;
|parameterValueType&lt;br /&gt;
|DisAssemblerValueType&lt;br /&gt;
|Defines the type of the parameterValue field.&lt;br /&gt;
|-&lt;br /&gt;
|parameterValue&lt;br /&gt;
|Integer&lt;br /&gt;
|The value specified by the parameter part of the instruction.&lt;br /&gt;
|-&lt;br /&gt;
|isJump&lt;br /&gt;
|Boolean&lt;br /&gt;
|True if the disassembled instruction can change EIP or RIP. This does not include ret.&lt;br /&gt;
|-&lt;br /&gt;
|isCall&lt;br /&gt;
|Boolean&lt;br /&gt;
|True if the instruction is a call.&lt;br /&gt;
|-&lt;br /&gt;
|isRet&lt;br /&gt;
|Boolean&lt;br /&gt;
|True if the instruction is a ret.&lt;br /&gt;
|-&lt;br /&gt;
|isRep&lt;br /&gt;
|Boolean&lt;br /&gt;
|True if the instruction is preceded by a rep prefix.&lt;br /&gt;
|-&lt;br /&gt;
|isConditionalJump&lt;br /&gt;
|Boolean&lt;br /&gt;
|True if the instruction is a conditional jump.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===DisAssemblerValueType Values===&lt;br /&gt;
{|width=&amp;quot;85%&amp;quot; cellpadding=&amp;quot;10%&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;0&amp;quot;&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Value&lt;br /&gt;
!align=&amp;quot;left&amp;quot;|Integer&lt;br /&gt;
!style=&amp;quot;width: 80%;background-color:white;&amp;quot; align=&amp;quot;left&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|dvtNone&lt;br /&gt;
|0&lt;br /&gt;
|No value.&lt;br /&gt;
|-&lt;br /&gt;
|dvtAddress&lt;br /&gt;
|1&lt;br /&gt;
|The value represents an address.&lt;br /&gt;
|-&lt;br /&gt;
|dvtValue&lt;br /&gt;
|2&lt;br /&gt;
|The value represents a normal value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local disassembler = createDisassembler()&lt;br /&gt;
&lt;br /&gt;
local address = getAddress(&amp;quot;kernel32.GetTickCount&amp;quot;)&lt;br /&gt;
local opcode = disassembler.disassemble(address)&lt;br /&gt;
&lt;br /&gt;
print(opcode)&lt;br /&gt;
&lt;br /&gt;
local data = disassembler.getLastDisassembleData()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Address: &amp;quot; .. string.format(&amp;quot;%X&amp;quot;, data.address))&lt;br /&gt;
print(&amp;quot;Opcode: &amp;quot; .. tostring(data.opcode))&lt;br /&gt;
print(&amp;quot;Parameters: &amp;quot; .. tostring(data.parameters))&lt;br /&gt;
print(&amp;quot;Description: &amp;quot; .. tostring(data.description))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local disassembler = createDisassembler()&lt;br /&gt;
&lt;br /&gt;
local address = getAddress(&amp;quot;kernel32.GetTickCount&amp;quot;)&lt;br /&gt;
local opcode = disassembler.disassemble(address)&lt;br /&gt;
local comment = disassembler.decodeLastParametersToString()&lt;br /&gt;
&lt;br /&gt;
print(opcode)&lt;br /&gt;
print(comment)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local disassembler = createDisassembler()&lt;br /&gt;
&lt;br /&gt;
disassembler.OnPostDisassemble = function(sender, address, data, result, description)&lt;br /&gt;
  if data.isCall then&lt;br /&gt;
    description = &amp;quot;Call instruction&amp;quot;&lt;br /&gt;
  elseif data.isJump then&lt;br /&gt;
    description = &amp;quot;Jump instruction&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return result, description&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local address = getAddress(&amp;quot;kernel32.GetTickCount&amp;quot;)&lt;br /&gt;
local opcode = disassembler.disassemble(address)&lt;br /&gt;
&lt;br /&gt;
print(opcode)&lt;br /&gt;
print(disassembler.LastDisassembleData.description)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local id = registerGlobalDisassembleOverride(function(sender, address, data)&lt;br /&gt;
  if data ~= nil and data.isRet then&lt;br /&gt;
    return &amp;quot;ret&amp;quot;, &amp;quot;Return instruction&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Later, when the override is no longer needed:&lt;br /&gt;
unregisterGlobalDisassembleOverride(id)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LuaSeeAlso}}&lt;/div&gt;</summary>
		<author><name>Leunsel</name></author>
		
	</entry>
</feed>