X86

The C programming is a high level language interpreted by the compiler that converts code into machine instructions called assembly language. By using a disassembler tool we can get the assembly language of a compiled C program.

The Intel 8086 and 8088 were the first CPUs to have an instruction set that is now commonly referred to as x86. Intel Architecture 32-bit (IA-32) sometimes also called i386 is the 32-bit version of the x86 instruction set architecture.

The x86 architecture is little-endian, meaning that multi-byte values are written least significant byte first.

How we see it:

| A0 | A1 | A2 | A3 |

Stored as Little Endian

| A3 | A2 | A1 | A0 |

Opcodes and Instructions

Each Instruction represents opcodes (hex code) that tell the machine what to do next.

Three categories of instructions:

  • Data Movement/Access

  • Arithmetic / Logic

  • Control-Flow

Common Instructions

  • mov, lea (data movement, data access)

  • add, sub (arithmetic)

  • or, and, xor (Logic)

  • shr, shl (Logic)

  • ror, rol (Logic)

  • jmp, jne, jnz, jnb (Control Flow)

  • push, pop, call, leave, enter, ret (Control Flow)

Example below is moving value at 0xaaaaaaaa into ecx.

Instruction

mov ecx,[0xaaaaaaaa];

Opcode

8B 0D AA AA AA AA

Registers

General-Purpose Registers [1]

Register

Description

EAX

Accumulator Register

EBX

Base Register

ECX

Counter Register

EDX

Data Register

ESI

Source Index

EDI

Destination Index

EBP

Base Pointer

ESP

Stack Pointer

Instruction Pointer

The EIP register contains the address of the next instruction to be executed.

Segment Registers

Register

Description

SS

Stack Segment, Pointer to the stack

CS

Code Segment, Pointer to the code

DS

Data Segment, Pointer to the data

ES

Extra Segment, Pointer to extra data

FS

F Segment, Pointer to more extra data

GS

G Segment, Pointer to still more extra data

EFLAGS Registers

ID

Name

Description

CF

Carry Flag

Set if the last arithmetic operation carried (addition) or borrowed (subtraction) a bit beyond the size of the register. This is then checked when the operation is followed with an add-with-carry or subtract-with-borrow to deal with values too large for just one register to contain

PF

Parity Flag

Set if the number of set bits in the least significant byte is a multiple of 2

AF

Adjust Flag

Carry of Binary Code Decimal (BCD) numbers arithmetic operations

ZF

Zero Flag

Set if the result of an operation is Zero (0)

SF

Sign Flag

Set if the result of an operation is negative

TF

Trap Flag

Set if step by step debugging

IF

Interruption Flag

Set if interrupts are enabled

DF

Direction Flag

Stream direction. If set, string operations will decrement their pointer rather than incrementing it, reading memory backwards

OF

Overflow Flag

Set if signed arithmetic operations result in a value too large for the register to contain

IOPL

I/O Privilege Level field (2 bits)

I/O Privilege Level of the current process

NT

Nested Task flag

Controls chaining of interrupts. Set if the current process is linked to the next process

RF

Resume Flag

Response to debug exceptions

VM

Virtual-8086 Mode

Set if in 8086 compatibility mode

AC

Alignment Check

Set if alignment checking of memory references is done

VIF

Virtual Interrupt Flag

Virtual image of IF

VIP

Virtual Interrupt Pending flag

Set if an interrupt is pending

ID

Identification Flag

Support for CPUID instruction if can be set

Last updated