Data Movement Instruction:
m
lds, les, lfs, lgs, lss
m
lahf, sahf (not covered)
There are six forms of the push and pop instructions.
Register, memory (memory-to-memory copy), immediate, segment register, flags, and all registers
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.
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.
Address Loading Instructions
Loads any 32-bit register with the address of the data, as determined by the instruction addressing mode.
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
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].
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.
Accesses data in the extra segment. Can NOT override.
Accesses data in the data segment. Can be overridden with segment override prefix.
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:
Stores al, ax or eax to the extra segment (es) + offset given by edi. es cannot be overridden.
edi is incremented or decremented afterwards:
Executes the instruction ecx times.
NOTE: rep does not make sense with the lodsb instruction.
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
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.
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).
Allows the programmer to override the default segment.