x86-16 Binary Register Emulator

When you have updated your program, make sure to Reset / Load first. Then step to perform each line.
You can clear out the current program with the clear button.
Status: Ready

Instruction Monitor

x86 Binary Instruction Cheat Sheet

Type Mnemonic (Example) Binary Pattern Explanation
Prefix 0x66 01100110 Operand-size override (required for 16-bit regs in 32-bit mode)
MOV MOV AX, imm16 10111rrr + lo + hi Load 16-bit immediate into reg. rrr: AX=000, CX=001, DX=010, BX=011. Little-endian immediate follows.
MOV MOV AL, imm8 10110rrr + imm Load 8-bit immediate. rrr: AL=000, CL=001, DL=010, BL=011, AH=100, CH=101, DH=110, BH=111
ADD ADD AL, imm8 00000100 + imm Shortform: add immediate to AL. No ModR/M needed.
ADD ADD AX, imm16 00000101 + lo + hi Shortform: add 16-bit immediate to AX. No ModR/M needed.
ADD ADD r8, imm8 10000000 + ModR/M + imm ModR/M: 11 000 rrr — extension field must be 000. rrr = destination register.
ADD ADD r16, imm8 10000011 + ModR/M + imm ModR/M: 11 000 rrr. Sign-extends 8-bit immediate to 16 bits.
ADD ADD r/m8, r8 00000000 + ModR/M ModR/M: 11 src dst — bits 5-3 = source, bits 2-0 = destination.
ADD ADD r/m16, r16 00000001 + ModR/M Same ModR/M convention as above. Requires 0x66 prefix for 16-bit operands.

ModR/M Register Encoding

ID (Binary)8-bit reg16-bit regModR/M structure (register mode)
000ALAX Bits 7-6: 11 (register-to-register mode)
Bits 5-3: source register ID
Bits 2-0: destination register ID

For ADD r/m, imm (0x80/0x83):
DDOOOLLL
DD: 11 immediate, 00 address no displacement, 01 8-bit displacement, 16-bit displacement
OOO: operation 000 for add
LLL: register location
001CLCX
010DLDX
011BLBX
100AH—
101CH—
110DH—
111BH—
How to construct ADD r/m, r:

Opcode: 00000000 (8-bit) or 00000001 (16-bit)

ModR/M byte: 11 + [Source ID] + [Dest ID]

Example (ADD CL, BL): dst=CL=001, src=BL=011 -> 00000000 11011001

Example (ADD AX, BX): dst=AX=000, src=BX=011 -> 00000001 11011000