-
Data Movement Instruction:
-
mov (covered already)
-
push, pop
-
lea (mov and offset)
-
lds, les, lfs, lgs, lss
-
movs, lods, stos
-
ins, outs
-
xchg, xlat
-
lahf, sahf (not covered)
-
in, out
-
movsx, movzx
-
bswap
-
cmov
-
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.
-
Load-Effective Address.
-
lea
:
-
Loads any 32-bit register with the address of the data, as determined by the instruction addressing mode.
-
lds
and
les
:
-
Load a 32-bit offset address and then
ds
or
es
from a 48-bit memory location.
-
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
!
-
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.
-
D = 0
: Autoincrement
edi
and
esi
.
-
Use
cld
instruction to clear this flag.
-
D = 1
: Autodecrement
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.
-
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:
-
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
:
-
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.
-
Miscellaneous Data Transfer Operations:
-
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).
-
in
and
out
:
-
Transfers a byte, word or doubleword of data from/to an I/O device into/out of
al
,
ax
and
eax
, respectively.
-
Memory operations are not available (as they are in
ins
and
outs
):
-
Two forms: Fixed-port addressing (
8-bit
port value encoded in instruction) and variable-port addressing (
16-bit
port value stored in
dx
).
-
The old contents of the higher-order bits of the port are preserved.
-
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 Appendix B of text).
-
Segment Override Prefix:
-
Allows the programmer to override the default segment.
-
Code and Data Segment Declarations:
-
See nasm slides and documentation on other details.