Disassembly
Disassembly is the conversion from a sequence of machine code back to the mnemonics that represent that code. This is done when we have a machine code program (perhaps written by someone else) and we want to know what it does and how it works.
For example, suppose we have the following sequence of bytes that constitute a 68HC11 machine code program:
8E 56 78 86 56 84 06 36 4C 36
We start by assuming that the first byte is an opcode. By looking up the opcode 0x8E in the Motorola 6800 (or 68HC11) datasheet, you will find that it is the LDS instruction (load stack pointer) and that it takes three bytes (one for opcode, two for data). Therefore, if the first byte is the instruction, the next two bytes are its associated data. So that gives us the first instruction:
8E 56 78 LDS #$5678 ; load stack pointer with the number 0x5678
If the first instruction was three bytes long, then the fourth byte in the sequence must be the second instruction. Therefore, the next opcode is 0x86, which, according to the datasheet, is LDAA # (load accumulator A with an immediate value) and takes two bytes.
So we now have:
8E 56 78 LDS #$5678 ; load stack pointer with the number 0x5678 86 56 LDAA #$56 ; load Acc A with 0x56
The next opcode is 0x84, which is an ANDA # instruction taking two bytes. Then we have a 0x36 (PSHA), a 0x4C (INCA), and finally another 0x36 (PSHA).
So, from:
8E 56 78 86 56 84 06 36 4C 36
our disassembled program is:
8E 56 78 LDS #$5678 ; load stack pointer with the number 0x5678 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access