x86 Assembly - X86 Architecture - Wikibooks, Open Books For An Open World
x86 Assembly - X86 Architecture - Wikibooks, Open Books For An Open World
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 1/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
Contents
x86 Architecture
General-Purpose Registers (GPR) - 16-bit naming conventions
Segment Registers
EFLAGS Register
Instruction Pointer
Memory
Two's Complement Representation
Addressing modes
General-purpose registers (64-bit naming conventions)
Stack
CPU Operation Modes
Real Mode
Protected Mode
Flat Memory Model
Multi-Segmented Memory Model
Long Mode
x86 Architecture
The x86 architecture has 8 General-Purpose Registers (GPR), 6 Segment Registers, 1 Flags
Register and an Instruction Pointer. 64-bit x86 has additional registers.
1. Accumulator register (AX). Used in arithmetic operations. Opcodes combining constants into
accumulator are 1-byte.
2. Base register (BX). Used as a pointer to data (located in segment register DS, when in
segmented mode).
3. Counter register (CX). Used in shift/rotate instructions and loops.
4. Stack Pointer register (SP). Pointer to the top of the stack.
5. Stack Base Pointer register (BP). Used to point to the base of the stack.
6. Destination Index register (DI). Used as a pointer to a destination in stream operations.
7. Source Index register (SI). Used as a pointer to a source in stream operations.
8. Data register (DX). Used in arithmetic operations and I/O operations.
The order in which they are listed here is for a reason: it is the same order that is used in a push-to-
stack operation, which will be covered later.
All registers can be accessed in 16-bit and 32-bit modes. In 16-bit mode, the register is identified by
its two-letter abbreviation from the list above. In 32-bit mode, this two-letter abbreviation is
prefixed with an 'E' (extended). For example, 'EAX' is the accumulator register as a 32-bit value.
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 2/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
Similarly, in the 64-bit version, the 'E' is replaced with an 'R' (register), so the 64-bit version of
'EAX' is called 'RAX'.
It is also possible to address the first four registers (AX, CX, DX and BX) in their size of 16-bit as
two 8-bit halves. The least significant byte (LSB), or low half, is identified by replacing the 'X' with
an 'L'. The most significant byte (MSB), or high half, uses an 'H' instead. For example, CL is the
LSB of the counter register, whereas CH is its MSB.
In total, this gives us five ways to access the accumulator, counter, data and base registers: 64-bit,
32-bit, 16-bit, 8-bit LSB, and 8-bit MSB. The other four are accessed in only four ways: 64-bit, 32-
bit, 16-bit, and 8-bit. The following table summarises this:
16-bit AX BX CX SP BP DI SI DX
Segment Registers
The 6 Segment Registers are:
Stack Segment (SS). Pointer to the stack ('S' stands for 'Stack').
Code Segment (CS). Pointer to the code ('C' stands for 'Code').
Data Segment (DS). Pointer to the data ('D' stands for 'Data').
Extra Segment (ES). Pointer to extra data ('E' stands for 'Extra'; 'E' comes after 'D').
F Segment (FS). Pointer to more extra data ('F' comes after 'E').
G Segment (GS). Pointer to still more extra data ('G' comes after 'F').
Most applications on most modern operating systems (like FreeBSD, Linux or Microsoft Windows)
use a memory model that points nearly all segment registers to the same place (and uses paging
instead), effectively disabling their use. Typically the use of FS or GS is an exception to this rule,
instead being used to point at thread-specific data.
EFLAGS Register
The EFLAGS is a 32-bit register used as a collection of bits representing Boolean values to store the
results of operations and the state of the processor.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
0 0 0 0 0 0 0 0 0 0 ID VIP VIF AC VM RF
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
The bits named 0 and 1 are reserved bits and shouldn't be modified.
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 3/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
Instruction Pointer
The EIP register contains the address of the next instruction to be executed if no branching is
done.
EIP can only be read through the stack after a call instruction.
Memory
The x86 architecture is little-endian, meaning that multi-byte values are written least significant
byte first. (This refers only to the ordering of the bytes, not to the bits.)
Little endian
representation
B0 B1 B2 B3
For example, the 32 bits double word 0x1BA583D4 (the 0x denotes hexadecimal) would be written
in memory as:
Little endian
example
D4 83 A5 1B
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 4/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
This will be seen as 0xD4 0x83 0xA5 0x1B when doing a memory dump.
Two's
complement
example
Start: 0001
Invert: 1110
Add One: 1111
0001 represents decimal 1
Addressing modes
In x86 assembly language, addressing modes determine how memory operands are specified in
instructions. Addressing modes allow the programmer to access data from memory or perform
operations on operands effectively. The x86 architecture supports various addressing modes, each
offering different ways to reference memory or registers. Here are some common addressing
modes in x86:
Register Addressing
(operand address R is in the address field)
Immediate
(actual value is in the field)
or
.data
my_var dw 0abcdh ; my_var = 0xabcd
.code
mov ax, [my_var] ; copy my_var content into ax (ax=0xabcd)
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 5/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
Register Indirect
(field points to a register that contains the operand address)
The registers used for indirect addressing are BX, BP, SI, DI
Stack
The stack is a Last In First Out (LIFO) data structure; data is pushed onto it and popped off of it in
the reverse order.
push ax ; push the value in AX onto the top of the stack, which now holds the value 0x006A.
push bx ; do the same thing to the value in BX; the stack now has 0x006A and 0xF79A.
push cx ; now the stack has 0x006A, 0xF79A, and 0x1124.
call do_stuff ; do some stuff. The function is not forced to save the registers it uses, hence us saving them.
pop cx ; pop the element on top of the stack, 0x1124, into CX; the stack now has 0x006A and 0xF79A.
pop bx ; pop the element on top of the stack, 0xF79A, into BX; the stack now has just 0x006A.
pop ax ; pop the element on top of the stack, 0x006A, into AX; the stack is now empty.
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 6/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
The Stack is usually used to pass arguments to functions or procedures and also to keep track of
control flow when the call instruction is used. The other common use of the Stack is temporarily
saving registers.
Real Mode
Real Mode is a holdover from the original Intel 8086. You generally won't need to know anything
about it (unless you are programming for a DOS-based system or, more likely, writing a boot
loader that is directly called by the BIOS).
The Intel 8086 accessed memory using 20-bit addresses. But, as the processor itself was 16-bit,
Intel invented an addressing scheme that provided a way of mapping a 20-bit addressing space
into 16-bit words. Today's x86 processors start in the so-called Real Mode, which is an operating
mode that mimics the behavior of the 8086, with some very tiny differences, for backwards
compatibility.
In Real Mode, a segment and an offset register are used together to yield a final memory address.
The value in the segment register is multiplied by 16 (shifted 4 bits to the left) and the offset is
added to the result. This provides a usable address space of 1 MB. However, a quirk in the
addressing scheme allows access past the 1 MB limit if a segment address of 0xFFFF (the highest
possible) is used; on the 8086 and 8088, all accesses to this area wrapped around to the low end of
memory, but on the 80286 and later, up to 65520 bytes past the 1 MB mark can be addressed this
way if the A20 address line is enabled. See: The A20 Gate Saga.
One benefit shared by Real Mode segmentation and by Protected Mode Multi-Segment Memory
Model is that all addresses must be given relative to another address (this is, the segment base
address). A program can have its own address space and completely ignore the segment registers,
and thus no pointers have to be relocated to run the program. Programs can perform near calls
and jumps within the same segment, and data is always relative to segment base addresses (which
in the Real Mode addressing scheme are computed from the values loaded in the Segment
Registers).
This is what the DOS *.COM format does; the contents of the file are loaded into memory and
blindly run. However, due to the fact that Real Mode segments are always 64 KB long, COM files
could not be larger than that (in fact, they had to fit into 65280 bytes, since DOS used the first 256
bytes of a segment for housekeeping data); for many years this wasn't a problem.
Protected Mode
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 7/8
ص11:44 2024/9/16 x86 Assembly/X86 Architecture - Wikibooks, open books for an open world
If programming in a modern 32-bit operating system (such as Linux, Windows), you are basically
programming in flat 32-bit mode. Any register can be used in addressing, and it is generally more
efficient to use a full 32-bit register instead of a 16-bit register part. Additionally, segment registers
are generally unused in flat mode, and using them in flat mode is not considered best practice.
Long Mode
The term "Long Mode" refers to the 64-bit mode.
1. https://www.swansontec.com/sregisters.html
Text is available under the Creative Commons Attribution-ShareAlike License; additional terms may apply. By using
this site, you agree to the Terms of Use and Privacy Policy.
https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture 8/8