Midterm Cheatsheet
Data type sizes and alignments on x86
Type | Size | Alignment | ||
---|---|---|---|---|
char , int8_t |
1 byte | 1 byte | ||
short , int16_t |
2 bytes | 2 bytes | ||
int , long , int32_t |
4 bytes | 4 bytes | ||
T * |
4 bytes | 4 bytes | ||
long long , int64_t |
8 bytes | 4 bytes in structs** | ||
float |
4 bytes | 4 bytes | ||
double |
8 bytes | 4 bytes in structs** |
**Alignment on x86 is in part compiler dependent, and GCC enforces
different alignment constraints for values in structs vs. values on the
stack. (Some people consider this a
bug.)
For long long
and double
values on the stack, GCC 4.7.0 (the CS50
Appliance version) enforces 8 byte alignment; and GCC reports
__alignof__(double) == 8
for the double
type.
x86 registers
%eax
Accumulator. Lower 16 bits (0-15) called %ax
. Bits 0-7 called %al
,
bits 8-15 called %ah
.
%ebx`, `%ecx`, `%edx
General-purpose registers with %*x
, %*l
, %*h
variants.
%esi`, `%edi
Other general-purpose registers. Lower 16 bits (0-15) called %si
,
%di
.
%esp
Stack pointer.
%ebp
Frame pointer or general-purpose register.
%eip
Instruction pointer.
x86 addressing modes for values
$
V
Immediate: constant value V
V
can be an integer constant or the name of a global variable
%
R
Register
V
Absolute memory: memory contents starting at address V
(%`<em>`R`</em>`)
Indirect memory: memory contents starting at %
R
V
(%
R
)
Indirect memory, base + displacement: memory contents starting at
address V
+ %
R
V
(%
R1
,%
R2
,
s
)
Indirect memory, general indexed: memory contents starting at
V
+ %
R1
+ (%
R2
×s
)
Many parts can be left off. V
, %
R1
, and
%
R2
default to 0. s
defaults to 1; it can only
be 1, 2, 4, or 8.
x86 addressing modes for instruction addresses (jmp
, call
)
V
Absolute: jump to the address V
*
E
Relative: jump to the address contained in expression E
(see
above for expressions)
Some x86 instructions
movl SRC, DST
Move 4 bytes from SRC
to DEST
leal SRC, DST
SRC` must refer to a memory address (possibly indirectly) and `DST
must be a register. Sets DST
to the address SRC
refers to.
Example: leal (%eax), %ebx
is equivalent to movl %eax, %ebx
.
pushl SRC
Decrement %esp
by 4, then move 4 bytes from SRC
to (%esp)
Like subl $4, %esp; movl SRC, (%esp)
popl DST
Move 4 bytes from (%esp)
into DST
, then increment %esp
by 4
Like movl (%esp), DST; addl $4, %esp
jmp L
Unconditional branch to L
Like “movl L, %eip
”
call F
Push the return address (the address of the next instruction) and jump
to F
Like “subl $4, %esp; movl [NEXT %eip], (%esp); jmp F
”
ret
Return from a call: pop the return address and jump to it.
Like “popl %eip
”
leave
Equivalent to movl %ebp, %esp; popl %ebp
addl SRC, DST
(subl
, imull
, mull
)
Arithmetic operations: DST
= DST
op SRC
.
cmpl SRC, DST
Like subl SRC, DST
, but only set condition codes (DST
is not
modified)
andl SRC, DST
(orl
, xorl
)
Bitwise operations
testl SRC, DST
Like andl SRC, DST
, but only set condition codes (DST
is not
modified)
sall SRC, DST
Shift DST
left by SRC
bits (SRC
defaults to 1), filling in with 0
bits
shrl SRC, DST
(sarl SRC, DST
)
Shift DST
right by SRC
bits, filling in with 0 bits for shrl
(copies of DST
sign bit for sarl
)
je L
[or jz
], jne L
[or jnz
]
Conditional branch if equal (zero), not equal (not zero); uses condition
flags
jg`, `jge`, `jl`, `jle
Conditional branches for signed comparison
ja`, `jae`, `jb`, `jbe
Conditional branches for unsigned comparison