| Instruction | Effect | Examples |
|---|---|---|
| mov src,dest | Copy src to dest | mov $10,%eax movw %eax,(2000) |
| Instruction | Effect | Examples |
|---|---|---|
| add src,dest | dest = dest + src | add $10, %esi |
| sub src,dest | dest = dest – src | sub %eax,%ebx |
| mul reg | edx:eax = eax * reg | mul %esi |
| div reg | edx = edx:eax mod reg eax = edx:eax ÷ reg |
div %edi |
| inc dest | Increment destination | inc %eax |
| dec dest | Decrement destination | dec (0x1000) |
| Instruction | Effect | Examples |
|---|---|---|
| call label | Push eip, transfer control | call format_disk |
| ret | Pop eip and return | ret |
| push item | Push item (constant or register) to stack | pushl $32 push %eax |
| pop [reg] | Pop item from stack; optionally store to register | pop %eax popl |
| Instruction | Effect | Examples |
|---|---|---|
| and src,dest | dest = src & dest | and %ebx, %eax |
| or src,dest | dest = src | dest | orl (0x2000),%eax |
| xor src,dest | dest = src ^ dest | xor $0xffffffff,%ebx |
| shl count,dest | dest = dest << count | shl $2,%eax |
| shr count,dest | dest = dest >> count | shr $4,(%eax) |
| Instruction | Effect | Examples |
|---|---|---|
| cmp arg1,arg2 | Compare arg1 to arg2; must immediately precede any of the conditional jump instructions | cmp $0,%eax |
| je label | Jump to label if arg1 == arg2 | je endloop |
| jne label | Jump to label if arg1 != arg2 | jne loopstart |
| jg label | Jump to label if arg2 > arg1 | jg exit |
| jge label | Jump to label if arg2 > arg1 | jge format_disk |
| jl label | Jump to label if arg2 < arg1 | jl error |
| jle label | Jump to label if arg2 < arg1 | jle finish |
| test reg,imm | Bitwise compare of register and constant; must immediately precede the jz or jnz instructions | test $0xffff,%eax |
| jz label | Jump to label if bits were not set (“zero”) | jz looparound |
| jnz label | Jump to label if bits were set (“not zero”) | jnz error |
| jmp label | Unconditional relative jump | jmp exit |
| jmp *reg | Unconditional absolute jump; arg is a register | jmp *%eax |
| ljmp segment,offs | Unconditional absolute far jump | ljmp $0x10,$0 |
| Instruction | Effect | Examples |
|---|---|---|
| nop | No-op (opcode 0x90) | nop |
| hlt | Halt the CPU | hlt |
Suffixes: b=byte (8 bits); w=word (16 bits); l=long (32 bits). Optional if instruction is unambiguous.
Arguments to instructions: Note that it is not possible for both src and dest to be memory addresses.
Constant (decimal or hex):$10 or $0xff Fixed address:(2000) or (0x1000+53)
Register:%eax %bl Dynamic address:(%eax) or 16(%esp)
32-bit registers: %eax, %ebx, %ecx, %edx, %esi, %edi, %esp, %ebp
16-bit registers: %ax, %bx, %cx, %dx, %si, %di, %sp, %bp
8-bit registers: %al, %ah, %bl, %bh, %cl, %ch, %dl, %dh