Intel Assembly

Data Movement Instruction:
m mov (covered already)
m push, pop
m lea (mov and offset)
m lds, les, lfs, lgs, lss
m movs, lods, stos
m ins, outs
m xchg, xlat
m lahf, sahf (not covered)
m in, out
m movsx, movzx
m bswap
m cmov

Stack Instructions

There are six forms of the push and pop instructions.
Register, memory (memory-to-memory copy), immediate, segment register, flags, and all registers

push:
The source of the data may be:
Any 16- or 32-bit register, immediate data, any segment register, any word or doubleword of memory data

pushad pushes eax, ecx, edx, ebx, esp, ebp, edi and esi where the value of esp saved on the stack is its value before the pushad.

pop:
The source of the data may be:
Any 16- or 32-bit register, any segment register (except for cs), any word or doubleword of memory data.

Stack Instructions
push:


Address Loading Instructions

Load-Effective Address.

m lea:
Loads any 32-bit register with the address of the data, as determined by the instruction addressing mode.

m lds and les:
Load a 32-bit offset address and then ds or es from a 48-bit memory location.

m lfs, lgs and lss (80386 and up):
Load any 32-bit offset address and then fs, gs or ss from a 48-bit memory location.


NOTE: lea calculates the ADDRESS given by the right arg and stores it in the left arg!

Address Loading Instructions

Load-Effective Address.

lea versus mov:


1 and 3 are equivalent.

So what are the differences?
3 is faster than 1 and is preferred.
However, mov only works with single args and cannot be used with LIST[edi].
lea can take any address, e.g., lea esi, [ebx + edi].

String Operations

movs, lods, stos, ins, outs
Allow data transfers of a byte, a word or a double word, or if repeated, a block of each of these.

The D flag-bit (direction), esi and edi are implicitly used.
n D = 0: Auto increment edi and esi.
Use cld instruction to clear this flag.
n D = 1: Auto decrement edi and esi.
Use std instruction to set it.

edi:
Accesses data in the extra segment. Can NOT override.
esi:
Accesses data in the data segment. Can be overridden with segment override prefix.

String Operations

lods:
Loads al, ax or eax with data stored at the data segment (or extra segment) + offset given by esi.
esi is incremented or decremented afterwards:


stosb:
Stores al, ax or eax to the extra segment (es) + offset given by edi. es cannot be overridden.
edi is incremented or decremented afterwards:


String Operations

rep prefix:
Executes the instruction ecx times.


NOTE: rep does not make sense with the lodsb instruction.

movs:
Moves a byte, word or doubleword from data segment and offset esi to extra segment and offset edi.
Increments/decrements both edi and esi:


String Operations and Exchange

ins/outs:
Transfers a byte, word or doubleword of data from/to an I/O device into/out of the extra/data segment + offset edi/esi, respectively.
The I/O address is stored in the edx register.


xchg:
Exchanges the contents of a register with the contents of any other register or memory location.
It can NOT exchange segment registers or memory-to-memory data.
Byte, word and doublewords can be exchanged using any addressing mode (except immediate, of course).


Miscellaneous Data Transfer Operations

movsx and movzx (80386 and up only):
Move-and-sign-extend and Move-and-zero-extend:


bswap (80486 and up only):
Swaps the first byte with the forth, and the second byte with the third.
Used to convert between little endian and big endian:


cmov (Pentium and up only):
These instructions move data only if a condition is true.
Conditions are set by a previous instruction and include Carry, Zero, Sign, Overflow and Parity:


There are many variations of this instruction (see intel instructions doc or text).
Assembler Directives

Segment Override Prefix:
Allows the programmer to override the default segment.


Procedure Calls