x86 cheat sheet
general purpose registers jump comparison
%eax (%ax,%ah,%al) j dst always jump cmpl src2, src1
%ecx (%cx,%ch,%cl) je dst jump if equal/zero // like computing src1 - src2
%edx (%dx,%dh,%dl) jne dst … not eq/not zero cf=1 if carry out from msb
%ebx (%bx,%bh,%bl) js dst … negative zf=1 if (src1==src2)
%esi jns dst … non-negative sf=1 if (src1-src2 < 0)
%edi jg dst … greater (signed) of=1 if two's complement
%ebp [base pointer] jge dst … >= (signed) under/overflow
%esp [stack pointer] jl dst … less (signed)
jle dst … <= (signed)
ja dst … above (unsigned) testing
program counter testl src2, src1
%eip jb dst … below (unsigned)
// like computing src1 & src2
[instruction pointer] zf set when src1&src2 == 0
dst is address of code (i.e., jump target) sf set when src1&src2 < 0
condition codes (CCs)
cf (carry flag)
zf (zero flag)
sf (sign flag) set
sete dst equal/zero
of (overflowing flag)
setne dst not eq/not zero
sets dst negative
setns dst non-negative
data movement setg dst greater (signed)
movl src, dst setge dst >= (signed)
setl dst less (signed)
src or dot can be: setle dst <= (signed)
- immediate (e.g., $0x10 or $4) seta dst above (unsigned)
- register (e.g., %eax) setb dst below (unsigned)
- memory (e.g., an address)
dst must be one of the 8 single-byte reg (e.g., %al)
limits:
- dst can never be an immediate often paired with movzbl instruction
- src or dot (but not both) can be memory (which moves 8-byte reg into 32-bit & zeroes out rest)
general memory form:
N (register1, register2, C) arithmetic
which leads to the memory address: two operand instructions
N + register1 + (C * register2) addl src,dst dst = dst + src
N can be a large number; subl src,dst dst = dst - src
imull src,dst dst = dst * src
C can be 1, 2, 4, or 8
sall src,dst dst = dst << src (aka shll)
sarl src,dst dst = dst >> src (arith)
common shorter forms: shrl src,dst dst = dst >> src (logical)
N absolute (reg1=0,reg2=0) xorl src,dst dst = dst ^ src
(%eax) register indirect (N=0,reg2=0) andl src,dst dst = dst & src
N(%eax) base + displacement (reg2=0) orl src,dst dst = dst | src
N(%eax,%ebx) indexed (C=1)
one operand instructions
example: incl dst dst = dst + 1
movl 4(%eax), %ebx decl dst dst = dst - 1
negl dst dst = -dst
takes value inside register %eax, adds 4 to it, and then notl dst dst = ~dst
fetches the contents of memory at that address, putting
the result into register %ebx; sometimes called a "load" arithmetic ops set CCs implicitly
instruction as it loads data from memory into a register cf=1 if carry out from msb
zf=1 if dst==0,
sf=1 if dst < 0 (signed)
of=1 if two's complement
(signed) under/overflow