MOV reg8, r/m/i8
MOV mem8, reg8
MOV mem8, BYTE imm8
MOV reg16, r/m/i16
MOV mem16, reg16
MOV mem16, WORD imm16
MOV r/m16, segreg
MOV segreg, r/m16
The CS segment register may not be used as a destination (you wouldn't
want to do this anyway, since it would change where the next instruction
comes from; to get this effect, you need to use a proper flow control
instruction such as JMP).To perform a swap of two locations instead of a one-way copy, there is also an exchange operation:
XCHG reg8, r/m8
XCHG reg16, r/m16
As a special case of this that does nothing except occupy space and take
up processor time, the instruction to exchange the accumulator with
itself (XCHG AX, AX) is given the special "no-operation''
mnemonic:
NOPFor the special purpose of copying a far pointer (that is, a pointer that includes a segment address, so that it can refer to a location outside the current segment) from memory into registers, there are the LDS and LES instructions. Here are the accepted forms:
LDS reg16, mem32
LES reg16, mem32
For example, the instruction LDS SI, [200h] is equivalent to the
pair of instructions MOV SI, [200h] and MOV DS, [202h].
The 8086 only supports loading the pointer into the DS or ES segment
register.An operation that is frequently useful when setting up pointers is to load the "effective address'' of a memory reference. That is, this instruction does the displacement plus base plus index calculation, but just stores the resulting address in the destination register, rather than actually fetching the data from the address. Here is the only form allowed on the 8086:
LEA reg16, memTo push and pop data from the stack, the 8086 provides the following instructions. The top of stack is located at offset SP within the stack segment, so PUSH AX, for example, is equivalent to SUB SP, 2 (recall that the stack grows downward) followed by MOV [SS:SP], AX (except that [SS:SP] isn't a valid form of memory reference).
PUSH r/m16
PUSH segreg
POP r/m16
POP segreg
As with MOV, you are not allowed to POP into the CS
register (although you may PUSH CS).Although they were not provided on the original 8086, the instructions to push and pop the FLAGS register (as mentioned earlier) are available in Virtual-8086 mode on the Pentium (they were actually introduced in the 80186):
PUSHF
POPF
Here are the other ways of reading or modifying the FLAGS register
(apart from setting flags as the result of an arithmetic operation, or
testing them with a conditional branch, of course). The Carry,
Direction, and Interrupt Enable flags may be cleared and set:
CLC
CLD
CLI
STC
STD
STI
The Carry flag may also be complemented, or "toggled'' between 0 and 1:
CMCFinally, the bottom eight bits of the FLAGS register (containing the Carry, Parity, Auxiliary Carry, Zero, and Sign flags, as described above) may be transferred to and from the AH register:
LAHF
SAHF